Настройка петлевой модели
Как мне настроить PersistedModel в loopback? Допустим, у меня есть две модели Post и Comment. Сообщение имеет много комментариев, но может содержать не более 3 комментариев. Как я могу реализовать это без использования хуков? Также мне нужно сделать это внутри транзакции.
Я из Явы, и вот как я это сделаю:
class Post {
void addComment(Comment c) {
if(this.comments.size() < 3)
this.comments.add(c)
else
throw new DomainException("Comment count exceeded")
}
}
тогда я бы написал услугу...
class PostService {
@Transactional
public void addCommentToPost(postId, Comment comment) {
post = this.postRepository.findById(postId);
post.addComment(comment)
this.postRepository.save(post);
}
}
Я знаю, что мог бы написать что-то вроде:
module.exports = function(app) {
app.datasources.myds.transaction(async (models) => {
post = await models.Post.findById(postId)
post.comments.create(commentData); ???? how do i restrict comments array size ?
})
}
я хочу иметь возможность использовать это так:
// create post
POST /post --> HTTP 201
// add comments
POST /post/id/comments --> HTTP 201
POST /post/id/comments --> HTTP 201
POST /post/id/comments --> HTTP 201
// should fail
POST /post/id/comments --> HTTP 4XX ERROR
3 ответа
Я думаю, что нашел решение. всякий раз, когда вы хотите переопределить методы, созданные отношениями модели, напишите загрузочный скрипт следующим образом:
module.exports = function(app) {
const old = app.models.Post.prototype.__create__comments;
Post.prototype.__create__orders = function() {
// **custom code**
old.apply(this, arguments);
};
};
Я думаю, что это лучший выбор.
Вы можете использовать метод validateLengthOf(), доступный для каждой модели, как часть проверяемого класса. Для более подробной информации обратитесь к Loopback Validation
То, что вы спрашиваете здесь, на самом деле является одним из хороших вариантов использования хуков операций, beforesave()
в частности. Подробнее об этом здесь можно узнать здесь https://loopback.io/doc/en/lb3/Operation-hooks.html
Тем не менее, я не уверен в части сделки.
Для этого я бы предложил использовать удаленный метод, который дает вам полную свободу использования API транзакций обратной связи. Здесь нужно учитывать одну вещь: вам нужно убедиться, что все комментарии создаются только с помощью вашего метода, а не с помощью методов обратной петли по умолчанию.
Вы можете сделать что-то вроде этого
// in post-comment.js model file
module.exports = function(Postcomment){
Postcomment.addComments = function(data, callback) {
// assuming data is an object which gives you the postId and commentsArray
const { comments, postId } = data;
Postcomment.count({ where: { postId } }, (err1, count) => {
if (count + commentsArray.length <= 10) {
// initiate transaction api and make a create call to db and callback
} else {
// return an error message in callback
}
}
}
}