瀏覽代碼

Create stasck on backend to return data to users about their circular references.

Lee Morgan 5 年之前
父節點
當前提交
9bf9ed10ff
共有 1 個文件被更改,包括 27 次插入6 次删除
  1. 27 6
      controllers/ingredientData.js

+ 27 - 6
controllers/ingredientData.js

@@ -71,22 +71,28 @@ module.exports = {
         }]
     }
     response = Ingredient
+    error response = '$' delimited String
     */
     updateIngredient: function(req, res){
         let popMerchant = res.locals.merchant.populate("inventory.ingredient").execPopulate();
 
+        let stack = [];
         Promise.all([Ingredient.findOne({_id: req.body.id}), popMerchant])
             .then((response)=>{
                 response[0].ingredients = req.body.ingredients;
 
                 // Check ingredients for circular references
                 let isCircular = (ingredient, original)=>{
-                    if(ingredient.ingredients.length === 0) return false;
+                    if(ingredient.ingredients.length === 0) {
+                        stack.pop();
+                        return false;
+                    }
 
                     for(let i = 0; i < ingredient.ingredients.length; i++){
                         for(let j = 0; j < res.locals.merchant.inventory.length; j++){
                             if(res.locals.merchant.inventory[j].ingredient._id.toString() === ingredient.ingredients[i].ingredient.toString()){
                                 let next = res.locals.merchant.inventory[j].ingredient;
+                                stack.push(next);
                                 if(next._id.toString() === original._id.toString()) return true;
                                 return isCircular(next, original);
                             }
@@ -98,14 +104,15 @@ module.exports = {
                     for(let j = 0; j < res.locals.merchant.inventory.length; j++){
                         if(res.locals.merchant.inventory[j].ingredient._id.toString() === req.body.ingredients[i].ingredient){
                             let ingredient = res.locals.merchant.inventory[j].ingredient;
-                            if(ingredient._id.toString() === req.body.id) throw "YOU HAVE CIRCULAR REFERENCES IN YOUR INGREDIENTS1";
-                            if(isCircular(response[0], response[0]) === false){
+                            stack = [ingredient];
+                            if(ingredient._id.toString() === req.body.id) throw "circular";
+                            if(isCircular(ingredient, response[0]) === false){
                                 response[0].ingredients.push({
                                     ingredient: req.body.ingredients[i].ingredient,
                                     quantity: req.body.ingredients[i].quantity
                                 });
                             }else{
-                                throw "YOU HAVE CIRCULAR REFERENCES IN YOUR INGREDIENTS";
+                                throw "circular";
                             }
                             break;
                         }
@@ -141,8 +148,22 @@ module.exports = {
                 });
             })
             .catch((err)=>{
-                if(typeof(err) === "string"){
-                    return res.json(err);
+                if(err === "circular"){
+                    let string = "YOU ATTEMPTED TO MAKE A CIRCULAR REFERENCE";
+
+                    if(stack.length === 1){
+                        string += `$${stack[0].name} CONTAINS ${stack[0].name}`;
+                    }else{
+                        for(let i = 0; i < stack.length; i++){
+                            if(i === stack.length - 1){
+                                string += `$${stack[i].name} CONTAINS ${stack[0].name}`;
+                                break;
+                            }
+                            string += `$${stack[i].name} CONTAINS ${stack[i+1].name}`;
+                        }
+                    }
+                    
+                    return res.json(string);
                 }
                 if(err.name === "ValidationError"){
                     return res.json(err.errors[Object.keys(err.errors)[0]].properties.message);