otherData.js 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. const bcrypt = require("bcryptjs");
  2. const Error = require("../models/error");
  3. const NonPosTransaction = require("../models/nonPosTransaction");
  4. const Merchant = require("../models/merchant");
  5. const Purchase = require("../models/purchase");
  6. module.exports = {
  7. //POST - Update non-pos merchant inventory and create a transaction
  8. //Inputs:
  9. // recipesSold: list of recipes sold and how much (recipe._id and quantity)
  10. //Returns:
  11. // merchant.inventory: entire merchant inventory after being updated
  12. createTransaction: function(req, res){
  13. if(!req.session.user){
  14. res.session.error = "Must be logged in to do that";
  15. return res.redirect("/");
  16. }
  17. let transaction = new NonPosTransaction({
  18. date: Date.now(),
  19. author: "None",
  20. merchant: req.session.user,
  21. recipes: req.body
  22. });
  23. //Calculate all ingredients used, store to list
  24. Merchant.findOne({_id: req.session.user})
  25. .populate("recipes")
  26. .then((merchant)=>{
  27. for(let reqRecipe of req.body){
  28. let merchRecipe = merchant.recipes.find(r => r._id.toString() === reqRecipe.id);
  29. for(let recipeIngredient of merchRecipe.ingredients){
  30. let merchInvIngredient = merchant.inventory.find(i => i.ingredient.toString() === recipeIngredient.ingredient.toString());
  31. merchInvIngredient.quantity -= recipeIngredient.quantity * reqRecipe.quantity;
  32. }
  33. }
  34. merchant.save()
  35. .then((merchant)=>{
  36. res.json({});
  37. })
  38. .catch((err)=>{
  39. let errorMessage = "There was an error and your transactions could not be saved";
  40. let error = new Error({
  41. code: 547,
  42. displayMessage: errorMessage,
  43. error: err
  44. });
  45. error.save();
  46. return res.json(errorMessage);
  47. });
  48. })
  49. .catch((err)=>{
  50. let errorMessage = "There was an error and your data could not be retrieved";
  51. let error = new Error({
  52. code: 626,
  53. displayMessage: errorMessage,
  54. error: err
  55. });
  56. error.save();
  57. return res.json(errorMessage);
  58. });
  59. transaction.save()
  60. .then((transaction)=>{
  61. return;
  62. })
  63. .catch((err)=>{
  64. let error = new Error({
  65. code: 120,
  66. displayMessage: "none",
  67. error: err
  68. });
  69. error.save();
  70. });
  71. },
  72. //POST - Creates a new purchase for a merchant
  73. //Inputs:
  74. // req.body: list of purchases (ingredient id and quantity)
  75. createPurchase: function(req, res){
  76. if(!req.session.user){
  77. req.session.error = "Must be logged in to do that";
  78. return res.redirect("/");
  79. }
  80. Merchant.findOne({_id: req.session.user})
  81. .then((merchant)=>{
  82. for(let purchase of req.body){
  83. let merchantIngredient = merchant.inventory.find(i => i.ingredient._id.toString() === purchase.ingredient);
  84. merchantIngredient.quantity += Number(purchase.quantity);
  85. }
  86. merchant.save()
  87. .then((merchant)=>{
  88. res.json({});
  89. })
  90. .catch((err)=>{
  91. let errorMessage = "Error: Unable to save data";
  92. let error = new Error({
  93. code: 547,
  94. displayMessage: errorMessage,
  95. error: err
  96. });
  97. error.save();
  98. return res.json(errorMessage);
  99. });
  100. })
  101. .catch((err)=>{
  102. let errorMessage = "Error: Unable to retrieve user data";
  103. let error = new Error({
  104. code: 626,
  105. displayMessage: errorMessage,
  106. error: err
  107. });
  108. error.save();
  109. return res.json(errorMessage);
  110. });
  111. let purchase = new Purchase({
  112. merchant: req.session.user,
  113. date: Date.now(),
  114. ingredients: req.body
  115. });
  116. purchase.save()
  117. .catch((err)=>{
  118. let error = new Error({
  119. code: 120,
  120. displayMessage: "none",
  121. error: err
  122. });
  123. error.save();
  124. });
  125. },
  126. //POST - logs the user in
  127. //Inputs:
  128. // req.body.email
  129. // req.body.password
  130. //Redirects to "/inventory" on success
  131. login: function(req, res){
  132. Merchant.findOne({email: req.body.email.toLowerCase()})
  133. .then((merchant)=>{
  134. if(merchant){
  135. bcrypt.compare(req.body.password, merchant.password, (err, result)=>{
  136. if(result){
  137. req.session.user = merchant._id;
  138. return res.redirect("/inventory");
  139. }else{
  140. req.session.error = "Invalid email or password";
  141. return res.redirect("/");
  142. }
  143. });
  144. }else{
  145. req.session.error = "Invalid email or password";
  146. return res.redirect("/");
  147. }
  148. })
  149. .catch((err)=>{
  150. req.session.error = "There was an error and your data could not be retrieved";
  151. let error = new Error({
  152. code: 626,
  153. displayMessage: req.session.error,
  154. error: err
  155. });
  156. error.save();
  157. return res.redirect("/");
  158. });
  159. },
  160. //GET - logs the user out
  161. //Redirects to "/"
  162. logout: function(req, res){
  163. req.session.user = undefined;
  164. return res.redirect("/");
  165. },
  166. //POST - check an email for uniqueness
  167. //Inputs:
  168. // req.body.email: email to check
  169. //Returns:
  170. // Boolean
  171. checkUniqueEmail: function(req, res){
  172. Merchant.findOne({email: req.body.email})
  173. .then((merchant)=>{
  174. if(merchant){
  175. return res.json(false);
  176. }else{
  177. return res.json(true);
  178. }
  179. })
  180. .catch((err)=>{
  181. let errorMessage = "Error: unable to validate email address";
  182. let error = new Error({
  183. code: 626,
  184. displayMessage: errorMessage,
  185. error: err
  186. });
  187. error.save();
  188. return res.json(errorMessage);
  189. });
  190. },
  191. //Get - Redirects user to Clover OAuth page
  192. clover: function(req, res){
  193. let url = "https://www.example.com/oauth_callback?merchant_id={mId}&client_id={APP_ID}&employee_id={EMPLOYEE_ID}&code={AUTHORIZATION_CODE}";
  194. let str = url.slice(url.indexOf("merchant_id=") + 12, url.indexOf("&client_id"));
  195. console.log(str);
  196. return res.redirect(`${process.env.CLOVER_ADDRESS}/oauth/authorize?client_id=${process.env.SUBLINE_CLOVER_APPID}&redirect_uri=localhost:8080/clover`);
  197. },
  198. cloverAuth: function(req, res){
  199. let authorizationCode = req.url.slice(req.url.indexOf("code=") + 5);
  200. req.session.merchantId = req.url.slice(req.url.indexOf("merchant_id=") + 12, req.url.indexOf("&client_id"))
  201. axios.get(`${process.env.CLOVER_ADDRESS}/oauth/token?client_id=${process.env.SUBLINE_CLOVER_APPID}&client_secret=${process.env.SUBLINE_CLOVER_APPSECRET}&code=${authorizationCode}`)
  202. .then((response)=>{
  203. req.session.accessToken = response.data.access_token;
  204. return res.redirect("/merchant/new/clover");
  205. })
  206. .catch((err)=>{
  207. console.log(err);
  208. req.session.error = "Error: Unable to retrieve data from Clover";
  209. return res.redirect("/");
  210. });
  211. }
  212. }
  213. //https://www.example.com/oauth_callback?merchant_id={mId}&client_id={APP_ID}&employee_id={EMPLOYEE_ID}&code={AUTHORIZATION_CODE}