const Owner = require("../models/owner.js"); const Merchant = require("../models/merchant"); const InventoryAdjustment = require("../models/inventoryAdjustment"); const helper = require("./helper.js"); const verifyEmail = require("../emails/verifyEmail.js"); const bcrypt = require("bcryptjs"); const mailgun = require("mailgun-js")({apiKey: process.env.MG_SUBLINE_APIKEY, domain: "mail.thesubline.net"}); module.exports = { /* POST - Create a new merchant with no POS system req.body = { name: retaurant name, email: registration email, password: password, confirmPassword: confirmation password } Redirects to /dashboard */ createMerchantNone: async function(req, res){ if(req.body.password.length < 10){ req.session.error = "PASSWORD MUST CONTAIN AT LEAST 10 CHARACTERS"; return res.redirect("/register"); } if(req.body.password !== req.body.confirmPassword){ req.session.error = "PASSWORDS DO NOT MATCH"; return res.redirect("/register"); } let email = req.body.email.toLowerCase(); const merchantFind = await Merchant.findOne({email: email}); if(merchantFind !== null){ req.session.error = "USER WITH THIS EMAIL ADDRESS ALREADY EXISTS"; return res.redirect("/login"); } let salt = bcrypt.genSaltSync(10); let hash = bcrypt.hashSync(req.body.password, salt); let expirationDate = new Date(); expirationDate.setDate(expirationDate.getDate() + 90); let owner = new Owner({ email: email, password: hash, createdAt: new Date(), status: ["unverified"], session: { sessionId: helper.generateId(25), expiration: expirationDate }, merchants: [] }); let merchant = new Merchant({ owner: owner._id, name: req.body.name, pos: "none", createdAt: Date.now(), inventory: [], recipes: [] }); owner.merchants.push(merchant._id); Promise.all([owner.save(), merchant.save()]) .then((response)=>{ return res.redirect(`/verify/email/${response[0]._id}`); }) .catch((err)=>{ if(typeof(err) === "string"){ req.session.error = err; }else if(err.name === "ValidationError"){ req.session.error = err.errors[Object.keys(err.errors)[0]].properties.message; }else{ req.session.error = "ERROR: UNABLE TO CREATE ACCOUNT AT THIS TIME"; } return res.redirect("/"); }); }, /* POST - Update the quantity for a merchant inventory item req.body = [{ id: id of ingredient to update, quantity: change in quantity }] */ updateIngredientQuantities: function(req, res){ let adjustments = []; let changedIngredients = []; res.locals.merchant .populate("inventory.ingredient") .execPopulate() .then((merchant)=>{ for(let i = 0; i < req.body.length; i++){ let updateIngredient; for(let j = 0; j < merchant.inventory.length; j++){ if(merchant.inventory[j].ingredient._id.toString() === req.body[i].id){ updateIngredient = merchant.inventory[j]; break; } } adjustments.push(new InventoryAdjustment({ date: Date.now(), merchant: req.session.owner, ingredient: req.body[i].id, quantity: req.body[i].quantity - updateIngredient.quantity, })); updateIngredient.quantity = helper.convertQuantityToBaseUnit(req.body[i].quantity, updateIngredient.defaultUnit); changedIngredients.push(updateIngredient); } return merchant.save(); }) .then((newMerchant)=>{ res.json(changedIngredients); InventoryAdjustment.create(adjustments).catch(()=>{}); return; }) .catch((err)=>{ if(typeof(err) === "string"){ return res.json(err); } if(err.name === "ValidationError"){ return res.json(err.errors[Object.keys(err.errors)[0]].properties.message); } return res.json("ERROR: UNABLE TO UPDATE DATA"); }); }, /* POST - Changes the users password req.body = { pass: new password, confirmPass: new password confirmation, hash: hashed version of old password } */ updatePassword: function(req, res){ Merchant.findOne({password: req.body.hash}) .then((merchant)=>{ if(merchant){ if(req.body.pass.length < 10){ throw "PASSWORD MUST CONTAIN AT LEAST 10 CHARACTERS"; } if(req.body.pass !== req.body.confirmPass){ throw "PASSWORDS DO NOT MATCH"; } let salt = bcrypt.genSaltSync(10); let hash = bcrypt.hashSync(req.body.pass, salt); merchant.password = hash; return merchant.save(); }else{ req.session.error = "ERROR: UNABLE TO RETRIEVE DATA"; return res.redirect("/"); } }) .then((merchant)=>{ req.session.success = "PASSWORD SUCCESSFULLY RESET. PLEASE LOG IN"; return res.redirect("/login"); }) .catch((err)=>{ if(typeof(err) === "string"){ return res.json(err); } if(err.name === "ValidationError"){ return res.json(err.errors[Object.keys(err.errors)[0]].properties.message); } return res.json("ERROR: UNABLE TO UPDATE YOUR PASSWORD"); }); }, /* PUT: Update merchant data req.body = { email: String (merchant email address) }, response = Merchant */ updateData: async function(req, res){ if(req.body.email !== res.locals.merchant.email){ let merchantCheck = await Merchant.findOne({email: req.body.email}); if(merchantCheck !== null){ return res.json("USER WITH THIS EMAIL ADDRESS ALREADY EXISTS"); } res.locals.merchant.email = req.body.email; res.locals.merchant.status.push("unverified"); const mailgunData = { from: "The Subline ", to: res.locals.merchant.email, subject: "Email Verification", html: verifyEmail({ name: res.locals.merchant.name, link: `${process.env.SITE}/verify/${res.locals.merchant._id}/${res.locals.merchant.sessionId}` }) }; mailgun.messages().send(mailgunData, (err, body)=>{}); } res.locals.merchant.save() .then((merchant)=>{ return res.json(merchant); }) .catch((err)=>{ if(err.name === "ValidationError"){ return res.json(err.errors[Object.keys(err.errors)[0]].properties.message); } return res.json("ERROR: UNABLE TO UPDATE DATA"); }); }, /* PUT: Update merchant password with current password req.body = { current: String (current merchant password), new: String (new password), confirm: String (new password again for confirmation) } response = {redirect: String (link to redirect to)} */ changePassword: function(req, res){ if(req.body.new !== req.body.confirm){ return res.json("PASSWORDS DO NOT MATCH"); } bcrypt.compare(req.body.current, res.locals.merchant.password, (err, result)=>{ if(result === true){ let salt = bcrypt.genSaltSync(10); let hash = bcrypt.hashSync(req.body.new, salt); res.locals.merchant.password = hash; let newExpiration = new Date(); newExpiration.setDate(newExpiration.getDate() + 90); res.locals.merchant.session.sessionId = helper.generateId(25); res.locals.merchant.session.expiration = newExpiration; res.locals.merchant.save() .then((merchant)=>{ req.session.error = "PLEASE LOG IN"; return res.json({redirect: `http://${process.env.SITE}/login`}); }) .catch((err)=>{ return res.json("ERROR: UNABLE TO UPDATE PASSWORD"); }); }else{ return res.json("INCORRECT PASSWORD"); } }); } }