orderData.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. const Order = require("../models/order.js");
  2. const Merchant = require("../models/merchant.js");
  3. const ObjectId = require("mongoose").Types.ObjectId;
  4. const Validator = require("./validator.js");
  5. module.exports = {
  6. /*
  7. GET - get the 25 most recent orders
  8. return = [
  9. _id: id of order,
  10. name: user created id for order,
  11. date: date order was created,
  12. ingredients: [{
  13. _id: unused id of this object,
  14. ingredient: id of the ingredient,
  15. price: price per unit of the ingredient,
  16. quantity: quantity of ingredient in this order
  17. }]
  18. ]
  19. */
  20. getOrders: function(req, res){
  21. if(!req.session.user){
  22. req.session.error = "MUST BE LOGGED IN TO DO THAT";
  23. return res.redirect("/");
  24. }
  25. Order.aggregate([
  26. {$match: {merchant: ObjectId(req.session.user)}},
  27. {$sort: {date: -1}},
  28. {$limit: 25},
  29. {$project: {
  30. name: 1,
  31. date: 1,
  32. taxes: 1,
  33. fees: 1,
  34. ingredients: 1
  35. }}
  36. ])
  37. .then((orders)=>{
  38. return res.json(orders);
  39. })
  40. .catch((err)=>{
  41. return res.json("ERROR: UNABLE TO RETRIEVE YOUR ORDERS");
  42. });
  43. },
  44. /*
  45. POST - retrieves a list of transactions based on the filter
  46. req.body = {
  47. startDate: starting date to filter on,
  48. endDate: ending date to filter on,
  49. ingredients: list of recipes.to filter on
  50. }
  51. */
  52. orderFilter: function(req, res){
  53. if(!req.session.user){
  54. req.session.error = "MUST BE LOGGED IN TO DO THAT";
  55. return res.redirect("/");
  56. }
  57. let objectifiedIngredients = [];
  58. for(let i = 0; i < req.body.ingredients.length; i++){
  59. objectifiedIngredients.push(new ObjectId(req.body.ingredients[i]));
  60. }
  61. let startDate = new Date(req.body.startDate);
  62. let endDate = new Date(req.body.endDate);
  63. endDate = new Date(endDate.getFullYear(), endDate.getMonth(), endDate.getDate() + 1);
  64. Order.aggregate([
  65. {$match: {
  66. merchant: new ObjectId(req.session.user),
  67. date: {
  68. $gte: startDate,
  69. $lt: endDate
  70. },
  71. ingredients: {
  72. $elemMatch: {
  73. ingredient: {
  74. $in: objectifiedIngredients
  75. }
  76. }
  77. }
  78. }},
  79. {$sort: {date: -1}}
  80. ])
  81. .then((orders)=>{
  82. return res.json(orders);
  83. })
  84. .catch((err)=>{
  85. return res.json("ERROR: UNABLE TO RETRIEVE YOUR TRANSACTIONS");
  86. });
  87. },
  88. /*
  89. POST - Creates a new order from the site
  90. req.body = {
  91. name: user created order id
  92. date: creation date
  93. ingredients: [{
  94. ingredient: id of the ingredient
  95. quantity: amount of the ingredient purchased
  96. pricePerUnit: price per gram
  97. }]
  98. }
  99. */
  100. createOrder: function(req, res){
  101. if(!req.session.user){
  102. req.session.error = "MUST BE LOGGED IN TO DO THAT";
  103. return res.redirect("/");
  104. }
  105. let validation = Validator.order(req.body);
  106. if(validation !== true){
  107. return res.json(validation);
  108. }
  109. let newOrder = new Order(req.body);
  110. newOrder.merchant = req.session.user;
  111. newOrder.save()
  112. .then((response)=>{
  113. res.json(response);
  114. })
  115. .catch((err)=>{
  116. return res.json("ERROR: UNABLE TO SAVE ORDER");
  117. });
  118. Merchant.findOne({_id: req.session.user})
  119. .then((merchant)=>{
  120. for(let i = 0; i < req.body.ingredients.length; i++){
  121. for(let j = 0; j < merchant.inventory.length; j++){
  122. if(req.body.ingredients[i].ingredient === merchant.inventory[j].ingredient.toString()){
  123. merchant.inventory[j].quantity += parseFloat(req.body.ingredients[i].quantity);
  124. }
  125. }
  126. }
  127. return merchant.save();
  128. })
  129. .then((merchant)=>{
  130. return;
  131. })
  132. .catch(()=>{});
  133. },
  134. /*
  135. DELETE - Remove an order from the database
  136. */
  137. removeOrder: function(req, res){
  138. if(!req.session.user){
  139. req.session.error = "MUST BE LOGGED IN TO DO THAT";
  140. return res.redirect("/");
  141. }
  142. let merchant = {};
  143. let order = {}
  144. Merchant.findOne({_id: req.session.user})
  145. .then((response)=>{
  146. merchant = response;
  147. return Order.findOne({_id: req.params.id});
  148. })
  149. .then((response)=>{
  150. order = response;
  151. return Order.deleteOne({_id: req.params.id})
  152. })
  153. .then((response)=>{
  154. res.json({});
  155. for(let i = 0; i < order.ingredients.length; i++){
  156. for(let j = 0; j < merchant.inventory.length; j++){
  157. if(order.ingredients[i].ingredient.toString() === merchant.inventory[j].ingredient.toString()){
  158. merchant.inventory[j].quantity -= order.ingredients[i].quantity;
  159. break;
  160. }
  161. }
  162. }
  163. return merchant.save();
  164. })
  165. .catch((err)=>{
  166. return res.json("ERROR: UNABLE TO REMOVE ORDER");
  167. });
  168. }
  169. }