2016-10-20 4 views
0

In meiner MEAN Anwendung habe ich ein Produktmodell wie folgt aus:Mehrere Ressourcen in einem Dienst

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

Jetzt habe ich für verschiedene Einschränkungen anwenden werde field und reviews zu speichern, so dass meine API-Endpunkte so sein wird :

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

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

Diese Endpunkte durch mein Eckige Service productData jeweils über Methoden productData.updateReview(product) und productData.updateField(product) erreicht werden.

So in meinem productData Service, bin ich mit zwei Ressourcen:

One mit url /products/reviews/:id für die updateReview Methode und eine mit url /products/:id für die updateField Methode.

Ich fühle mich wie mache ich nicht die Trennung von Anliegen richtig.

Das Problem rührt von der Tatsache her, dass mein Modell Felder hat, die unterschiedlich behandelt werden müssen. Aber es macht für mich Sinn, alle CRUD-Operationen für products in einem Dienst zu haben.

Was wäre eine offensichtlich elegantere Lösung dafür?

Antwort

0

Ich würde eine Autorisierung Middleware verwenden, um für beide Fälle zu überprüfen.

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

function checkUpdateRights(req, res, next){ 
    if(req.body.reviews && !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 
}; 
Verwandte Themen