transactionData.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. const Transaction = require("../models/transaction");
  2. const Merchant = require("../models/merchant");
  3. const ObjectId = require("mongoose").Types.ObjectId;
  4. module.exports = {
  5. /*
  6. POST - retrieves a list of transactions based on the filter
  7. req.body = {
  8. startDate: starting date to filter on,
  9. endDate: ending date to filter on,
  10. recipes: list of recipes to filter on
  11. }
  12. */
  13. getTransactions: function(req, res){
  14. console.time("query");
  15. if(!req.session.user){
  16. req.session.error = "MUST BE LOGGED IN TO DO THAT";
  17. return res.redirect("/");
  18. }
  19. let objectifiedRecipes = [];
  20. for(let i = 0; i < req.body.recipes.length; i++){
  21. objectifiedRecipes.push(new ObjectId(req.body.recipes[i]));
  22. }
  23. let startDate = new Date(req.body.startDate);
  24. let endDate = new Date(req.body.endDate);
  25. Transaction.aggregate([
  26. {$match: {
  27. merchant: new ObjectId(req.session.user),
  28. date: {
  29. $gte: startDate,
  30. $lt: endDate
  31. },
  32. recipes: {
  33. $elemMatch: {
  34. recipe: {
  35. $in: objectifiedRecipes
  36. }
  37. }
  38. }
  39. }},
  40. {$sort: {
  41. date: 1
  42. }}
  43. ])
  44. .then((transactions)=>{
  45. // if(req.body.recipes.length > 0){
  46. // for(let i = 0; i < transactions.length; i++){
  47. // let hasRecipe = false;
  48. // for(let j = 0; j < transactions[i].recipes.length; j++){
  49. // for(let k = 0; k < req.body.recipes.length; k++){
  50. // if(transactions[i].recipes[j].recipe.toString() === req.body.recipes[k]){
  51. // hasRecipe = true;
  52. // break;
  53. // }
  54. // }
  55. // if(hasRecipe){
  56. // break;
  57. // }
  58. // }
  59. // if(!hasRecipe){
  60. // transactions.splice(i, 1);
  61. // i--;
  62. // }
  63. // }
  64. // }
  65. console.timeEnd("query");
  66. return res.json(transactions);
  67. })
  68. .catch((err)=>{
  69. return res.json("ERROR: UNABLE TO RETRIEVE YOUR TRANSACTIONS");
  70. });
  71. },
  72. /*
  73. POST - create a new transaction
  74. req.body = {
  75. date: date of the transaction,
  76. recipes: [{
  77. recipe: id of the recipe to add,
  78. quantity: quantity of the recipe sold
  79. }]
  80. }
  81. */
  82. createTransaction: function(req, res){
  83. if(!req.session.user){
  84. req.session.error = "MUST BE LOGGED IN TO DO THAT";
  85. return res.redirect("/");
  86. }
  87. let newTransaction = new Transaction({
  88. merchant: req.session.user,
  89. date: new Date(req.body.date),
  90. device: "none",
  91. recipes: req.body.recipes
  92. });
  93. newTransaction.save()
  94. .then((response)=>{
  95. return res.json(response);
  96. })
  97. .catch((err)=>{
  98. return res.json("ERROR: UNABLE TO CREATE NEW TRANSACTION");
  99. });
  100. },
  101. /*
  102. DELETE - Remove a transaction from the database
  103. */
  104. remove: function(req, res){
  105. if(!req.session.user){
  106. req.session.error = "MUST BE LOGGED IN TO DO THAT";
  107. return res.redirect("/");
  108. }
  109. Transaction.deleteOne({_id: req.params.id})
  110. .then((response)=>{
  111. return res.json({});
  112. })
  113. .catch((err)=>{
  114. return res.json("ERROR: UNABLE TO DELETE TRANSACTION");
  115. });
  116. },
  117. /*
  118. GET - Creates 5000 transactions for logged in merchant for testing
  119. */
  120. populate: function(req, res){
  121. if(!req.session.user){
  122. res.session.error = "Must be logged in to do that";
  123. return res.redirect("/");
  124. }
  125. function randomDate() {
  126. let now = new Date();
  127. let start = new Date();
  128. start.setFullYear(now.getFullYear() - 1);
  129. return new Date(start.getTime() + Math.random() * (now.getTime() - start.getTime()));
  130. }
  131. Merchant.findOne({_id: req.session.user})
  132. .then((merchant)=>{
  133. let newTransactions = [];
  134. for(let i = 0; i < 5000; i++){
  135. let newTransaction = new Transaction({
  136. merchant: merchant._id,
  137. date: randomDate(),
  138. recipes: []
  139. });
  140. let numberOfRecipes = Math.floor((Math.random() * 5) + 1);
  141. for(let j = 0; j < numberOfRecipes; j++){
  142. let recipeNumber = Math.floor(Math.random() * merchant.recipes.length);
  143. let randQuantity = Math.floor((Math.random() * 3) + 1);
  144. newTransaction.recipes.push({
  145. recipe: merchant.recipes[recipeNumber],
  146. quantity: randQuantity
  147. });
  148. }
  149. newTransactions.push(newTransaction);
  150. }
  151. Transaction.create(newTransactions)
  152. .then((transactions)=>{
  153. return res.redirect("/dashboard");
  154. })
  155. .catch((err)=>{
  156. return;
  157. });
  158. })
  159. .catch((err)=>{
  160. return;
  161. });
  162. }
  163. }