squareData.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. const Merchant = require("../models/merchant.js");
  2. const Recipe = require("../models/recipe.js");
  3. const axios = require("axios");
  4. const helper = require("./helper.js");
  5. module.exports = {
  6. //GET - Redirects user to Square OAuth page
  7. redirect: function(req, res){
  8. return res.redirect(`${process.env.SQUARE_ADDRESS}/oauth2/authorize?client_id=${process.env.SUBLINE_SQUARE_APPID}&scope=INVENTORY_READ+ITEMS_READ+MERCHANT_PROFILE_READ+ORDERS_READ+PAYMENTS_READ`);
  9. },
  10. authorize: function(req, res){
  11. const code = req.url.slice(req.url.indexOf("code=") + 5, req.url.indexOf("&"));
  12. const url = `${process.env.SQUARE_ADDRESS}/oauth2/token?`;
  13. let data = {
  14. client_id: process.env.SUBLINE_SQUARE_APPID,
  15. client_secret: process.env.SUBLINE_SQUARE_APPSECRET,
  16. grant_type: "authorization_code",
  17. code: code
  18. };
  19. axios.post(url, data)
  20. .then((response)=>{
  21. data = response.data;
  22. return Merchant.findOne({posId: data.merchant_id});
  23. })
  24. .then((merchant)=>{
  25. if(merchant){
  26. merchant.posAccessToken = data.access_token;
  27. return merchant.save()
  28. .then((merchant)=>{
  29. req.session.user = merchant._id;
  30. return res.redirect("/dashboard");
  31. })
  32. .catch((err)=>{
  33. req.session.error = "ERROR: UNABLE TO CREATE NEW USER";
  34. return res.redirect("/");
  35. })
  36. }else{
  37. req.session.merchantId = data.merchant_id;
  38. req.session.accessToken = data.access_token;
  39. return res.redirect("/merchant/create/square");
  40. }
  41. })
  42. .catch((err)=>{
  43. req.session.error = "ERROR: UNABLE TO RETRIEVE DATA FROM SQUARE";
  44. return res.redirect("/");
  45. });
  46. },
  47. createMerchant: function(req, res){
  48. let merchant = {}
  49. axios.get(`${process.env.SQUARE_ADDRESS}/v2/merchants/${req.session.merchantId}`, {
  50. headers: {
  51. Authorization: `Bearer ${req.session.accessToken}`
  52. }
  53. })
  54. .then((response)=>{
  55. req.session.merchantId = undefined;
  56. let expirationDate = new Date();
  57. expirationDate.setDate(expirationDate.getDate() + 90);
  58. merchant = new Merchant({
  59. name: response.data.merchant.business_name,
  60. pos: "square",
  61. posId: response.data.merchant.id,
  62. posAccessToken: req.session.accessToken,
  63. lastUpdatedTime: new Date(),
  64. createdAt: new Date(),
  65. squareLocation: response.data.merchant.main_location_id,
  66. status: [],
  67. inventory: [],
  68. recipes: [],
  69. session: {
  70. sessionId: helper.generateId(25),
  71. expiration: expirationDate
  72. }
  73. });
  74. req.session.accessToken = undefined;
  75. let items = axios.post(`${process.env.SQUARE_ADDRESS}/v2/catalog/search`, {
  76. object_types: ["ITEM"]
  77. }, {
  78. headers: {
  79. Authorization: `Bearer ${merchant.posAccessToken}`
  80. }
  81. });
  82. let location = axios.get(`${process.env.SQUARE_ADDRESS}/v2/locations/${response.data.merchant.main_location_id}`, {
  83. headers: {
  84. Authorization: `Bearer ${merchant.posAccessToken}`
  85. }
  86. });
  87. return Promise.all([items, location]);
  88. })
  89. .then((response)=>{
  90. merchant.email = response[1].data.location.business_email;
  91. let recipes = [];
  92. for(let i = 0; i < response[0].data.objects.length; i++){
  93. if(response[0].data.objects[i].item_data.variations.length > 1){
  94. for(let j = 0; j < response[0].data.objects[i].item_data.variations.length; j++){
  95. let recipe = new Recipe({
  96. posId: response[0].data.objects[i].item_data.variations[j].id,
  97. merchant: merchant._id,
  98. name: `${response[0].data.objects[i].item_data.name} '${response[0].data.objects[i].item_data.variations[j].item_variation_data.name}'`,
  99. price: response[0].data.objects[i].item_data.variations[j].item_variation_data.price_money.amount
  100. });
  101. recipes.push(recipe);
  102. merchant.recipes.push(recipe);
  103. }
  104. }else{
  105. let recipe = new Recipe({
  106. posId: response[0].data.objects[i].item_data.variations[0].id,
  107. merchant: merchant._id,
  108. name: response[0].data.objects[i].item_data.name,
  109. price: response[0].data.objects[i].item_data.variations[0].item_variation_data.price_money.amount,
  110. ingredients: []
  111. });
  112. recipes.push(recipe);
  113. merchant.recipes.push(recipe);
  114. }
  115. }
  116. return Promise.all([Recipe.create(recipes), merchant.save()]);
  117. })
  118. .then((response)=>{
  119. req.session.user = response[1].session.sessionId;
  120. return res.redirect("/dashboard");
  121. })
  122. .catch((err)=>{
  123. if(typeof(err) === "string"){
  124. req.session.error = err;
  125. }else if(err.name === "ValidationError"){
  126. req.session.error = err.errors[Object.keys(err.errors)[0]].properties.message;
  127. }else{
  128. req.session.error = "ERROR: UNABLE TO CREATE NEW USER";
  129. }
  130. return res.redirect("/");
  131. });
  132. },
  133. }