orderData.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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. if(typeof(err) === "string"){
  42. return res.json(err);
  43. }
  44. if(err.name === "ValidationError"){
  45. return res.json(err.errors.name.properties.message);
  46. }
  47. return res.json("ERROR: UNABLE TO RETRIEVE YOUR ORDERS");
  48. });
  49. },
  50. /*
  51. POST - retrieves a list of transactions based on the filter
  52. req.body = {
  53. startDate: starting date to filter on,
  54. endDate: ending date to filter on,
  55. ingredients: list of recipes.to filter on
  56. }
  57. */
  58. orderFilter: function(req, res){
  59. if(!req.session.user){
  60. req.session.error = "MUST BE LOGGED IN TO DO THAT";
  61. return res.redirect("/");
  62. }
  63. let objectifiedIngredients = [];
  64. for(let i = 0; i < req.body.ingredients.length; i++){
  65. objectifiedIngredients.push(new ObjectId(req.body.ingredients[i]));
  66. }
  67. let startDate = new Date(req.body.startDate);
  68. let endDate = new Date(req.body.endDate);
  69. endDate = new Date(endDate.getFullYear(), endDate.getMonth(), endDate.getDate() + 1);
  70. Order.aggregate([
  71. {$match: {
  72. merchant: new ObjectId(req.session.user),
  73. date: {
  74. $gte: startDate,
  75. $lt: endDate
  76. },
  77. ingredients: {
  78. $elemMatch: {
  79. ingredient: {
  80. $in: objectifiedIngredients
  81. }
  82. }
  83. }
  84. }},
  85. {$sort: {date: -1}}
  86. ])
  87. .then((orders)=>{
  88. return res.json(orders);
  89. })
  90. .catch((err)=>{
  91. if(typeof(err) === "string"){
  92. return res.json(err);
  93. }
  94. if(err.name === "ValidationError"){
  95. return res.json(err.errors.name.properties.message);
  96. }
  97. return res.json("ERROR: UNABLE TO RETRIEVE YOUR TRANSACTIONS");
  98. });
  99. },
  100. /*
  101. POST - Creates a new order from the site
  102. req.body = {
  103. name: user created order id
  104. date: creation date
  105. ingredients: [{
  106. ingredient: id of the ingredient
  107. quantity: amount of the ingredient purchased
  108. pricePerUnit: price per gram
  109. }]
  110. }
  111. */
  112. createOrder: function(req, res){
  113. if(!req.session.user){
  114. req.session.error = "MUST BE LOGGED IN TO DO THAT";
  115. return res.redirect("/");
  116. }
  117. let validation = Validator.order(req.body);
  118. if(validation !== true){
  119. return res.json(validation);
  120. }
  121. let newOrder = new Order(req.body);
  122. newOrder.merchant = req.session.user;
  123. newOrder.save()
  124. .then((response)=>{
  125. res.json(response);
  126. })
  127. .catch((err)=>{
  128. if(typeof(err) === "string"){
  129. return res.json(err);
  130. }
  131. if(err.name === "ValidationError"){
  132. return res.json(err.errors.name.properties.message);
  133. }
  134. return res.json("ERROR: UNABLE TO SAVE ORDER");
  135. });
  136. Merchant.findOne({_id: req.session.user})
  137. .then((merchant)=>{
  138. for(let i = 0; i < req.body.ingredients.length; i++){
  139. for(let j = 0; j < merchant.inventory.length; j++){
  140. if(req.body.ingredients[i].ingredient === merchant.inventory[j].ingredient.toString()){
  141. merchant.inventory[j].quantity += parseFloat(req.body.ingredients[i].quantity);
  142. }
  143. }
  144. }
  145. return merchant.save();
  146. })
  147. .then((merchant)=>{
  148. return;
  149. })
  150. .catch(()=>{});
  151. },
  152. /*
  153. DELETE - Remove an order from the database
  154. */
  155. removeOrder: function(req, res){
  156. if(!req.session.user){
  157. req.session.error = "MUST BE LOGGED IN TO DO THAT";
  158. return res.redirect("/");
  159. }
  160. let merchant = {};
  161. let order = {}
  162. Merchant.findOne({_id: req.session.user})
  163. .then((response)=>{
  164. merchant = response;
  165. return Order.findOne({_id: req.params.id});
  166. })
  167. .then((response)=>{
  168. order = response;
  169. return Order.deleteOne({_id: req.params.id})
  170. })
  171. .then((response)=>{
  172. res.json({});
  173. for(let i = 0; i < order.ingredients.length; i++){
  174. for(let j = 0; j < merchant.inventory.length; j++){
  175. if(order.ingredients[i].ingredient.toString() === merchant.inventory[j].ingredient.toString()){
  176. merchant.inventory[j].quantity -= order.ingredients[i].quantity;
  177. break;
  178. }
  179. }
  180. }
  181. return merchant.save();
  182. })
  183. .catch((err)=>{
  184. if(typeof(err) === "string"){
  185. return res.json(err);
  186. }
  187. if(err.name === "ValidationError"){
  188. return res.json(err.errors.name.properties.message);
  189. }
  190. return res.json("ERROR: UNABLE TO REMOVE ORDER");
  191. });
  192. }
  193. }