Настроить петлевую модель

Как настроить PersistedModel в петле? Допустим, у меня есть две модели Post и Comment. Сообщение имеет много комментариев, но может иметь не более 3 комментариев. Как я могу реализовать это без использования хуков? Также мне нужно сделать это внутри транзакции.

Я исхожу из java, и вот как бы я это сделал:

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

person justatester    schedule 07.06.2018    source источник


Ответы (3)


То, о чем вы здесь спрашиваете, на самом деле является одним из хороших вариантов использования хуков операций, в частности beforesave(). Подробнее об этом см. здесь https://loopback.io/doc/en/lb3/Operation-hooks.html#before-save

Однако я не уверен в части транзакции.

Для этого я предлагаю использовать удаленный метод, он дает вы можете свободно использовать API транзакций loopback. Здесь следует учитывать одну вещь: вам нужно убедиться, что все комментарии создаются только с помощью вашего метода, а не с помощью методов обратной связи по умолчанию.

Затем вы можете сделать что-то вроде этого

// 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
           }

        }
    }
}
person Karan Raina    schedule 07.06.2018
comment
вы сказали, что это можно сделать с помощью хука перед сохранением. Как бы Вы это сделали ? - person justatester; 09.06.2018
comment
В хуке перед сохранением вам нужно будет запросить свою модель, как в ответе выше, проверить, не превышает ли сумма существующих комментариев и новых комментариев то, что вы хотите, а затем вызвать API транзакции и создать новые комментарии. - person Karan Raina; 13.06.2018

Вы можете использовать метод validateLengthOf(), доступный для каждой модели как часть проверяемого класса. Дополнительные сведения см. в разделе проверка обратной связи

person harish1792    schedule 08.06.2018
comment
это просто проверка входных данных. Я ищу решение, ориентированное на модель предметной области. - person justatester; 09.06.2018

я думаю, что нашел решение. всякий раз, когда вы хотите переопределить методы, созданные с помощью отношений модели, напишите сценарий загрузки следующим образом:

module.exports = function(app) {

    const old = app.models.Post.prototype.__create__comments;
    Post.prototype.__create__orders = function() {
      // **custom code**
       old.apply(this, arguments);
    };

};

я думаю, что это лучший выбор.

person justatester    schedule 14.06.2018