Несколько ресурсов в одном сервисе

#angularjs #node.js #express #mean-stack

#angularjs #node.js #экспресс #mean-stack

Вопрос:

В моем приложении MEAN у меня есть модель продукта, подобная этой :

 product: {
        field: //some string value//, 
        reviews: //an array of review objects// 
        }
  

Теперь я собираюсь применить различные ограничения для сохранения field и reviews , поэтому мои конечные точки API будут такими :

 /* specific route for updating reviews */
router.put('/products/reviews/:id', checkRightsToUpdateReviews, updateProductReviews);

/* specific route for updating field */
router.put('/products/:id', checkRightsToUpdateField, updateProductField);
  

Эти конечные точки достигаются моим сервисом Angular productData , соответственно, с помощью методов productData.updateReview(product) и productData.updateField(product) .

Таким образом, в моем productData сервисе я использую два ресурса :

Один с URL /products/reviews/:id для updateReview метода, а другой с URL /products/:id для updateField метода.

Я чувствую, что неправильно распределяю проблемы.

Проблема возникает из-за того, что в моей модели есть поля, которые необходимо обрабатывать по-разному. Но для меня имеет смысл иметь все операции CRUD для products в одном сервисе.

Что было бы, очевидно, более элегантным решением для этого?

Ответ №1:

Я бы использовал одно промежуточное программное обеспечение авторизации для проверки в обоих случаях.

 router.put('/products/:id', checkUpdateRights, updateProduct);

function checkUpdateRights(req, res, next){
    if(req.body.reviews amp;amp; !hasReviewRights(req)){ // check only if reviews exists in body
        res.status(401).send({ error: "Unauthorized to update product reviews" });
    }
    if(!hasUpdateRights(req)){ // for other fields
        res.status(401).send({ error: "Unauthorized to update product" });
    }
    else{
        return next();
    }
};

function hasReviewRights(req){
    // return true or false
};

function hasUpdateRights(req){
    // return true or false
};