From 91cba76bfff4c09a905b1f16d6ebef04b2245749 Mon Sep 17 00:00:00 2001 From: Jonasz Bigda Date: Wed, 5 Aug 2020 18:44:38 +0200 Subject: [PATCH] added API call to CRM when user registers --- models/dish.js | 3 ++ models/restaurant.js | 6 ++++ models/users.js | 13 ++++++- package-lock.json | 5 +++ package.json | 1 + routes/routeCity.js | 2 +- routes/routeDish.js | 2 +- routes/routeRestaurant.js | 4 +++ routes/routeSearch.js | 2 +- routes/routeUser.js | 72 ++++++++++++++++++++++----------------- services/services.js | 66 ++++++++++++++++++++++++++++++++++- 11 files changed, 140 insertions(+), 36 deletions(-) diff --git a/models/dish.js b/models/dish.js index 501247f..2e25578 100644 --- a/models/dish.js +++ b/models/dish.js @@ -35,6 +35,9 @@ const dishSchema = mongoose.Schema({ peanuts: Boolean, sesame: Boolean, }, + ingredients: { + type: Array, + }, vegan: Boolean, vegetarian: Boolean, }); diff --git a/models/restaurant.js b/models/restaurant.js index 36256eb..ed61870 100644 --- a/models/restaurant.js +++ b/models/restaurant.js @@ -32,6 +32,12 @@ const restaurantSchema = mongoose.Schema({ alcohol: Boolean, delivery: Boolean, }, + links: { + facebook: String, + twitter: String, + instagram: String, + www: String, + }, phone: Number, hidden: Boolean, dishes: [mongoose.Types.ObjectId], diff --git a/models/users.js b/models/users.js index c41d448..f62dac9 100644 --- a/models/users.js +++ b/models/users.js @@ -10,12 +10,23 @@ const userSchema = mongoose.Schema({ type: String, required: true, }, + firstname: { + type: String, + required: true, + }, + lastname: { + type: String, + required: true, + }, restaurantId: mongoose.Types.ObjectId, subscriptionActive: { type: Boolean, required: true, }, - subscriptionDue: Date, + subscriptionDue: { + type: String, + required: true, + }, }); export default mongoose.model("User", userSchema); diff --git a/package-lock.json b/package-lock.json index 5def7f7..bdc6902 100644 --- a/package-lock.json +++ b/package-lock.json @@ -139,6 +139,11 @@ "negotiator": "0.6.2" } }, + "agile_crm": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/agile_crm/-/agile_crm-1.2.5.tgz", + "integrity": "sha1-gj+s18LUpzesJ2viFc9t6wwylVg=" + }, "ansi-align": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", diff --git a/package.json b/package.json index 3458bb6..9b21a42 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "license": "ISC", "dependencies": { "@material-ui/core": "^4.11.0", + "agile_crm": "^1.2.5", "bcrypt": "^5.0.0", "body-parser": "^1.19.0", "cookie-parser": "^1.4.5", diff --git a/routes/routeCity.js b/routes/routeCity.js index 32247f6..c04973f 100644 --- a/routes/routeCity.js +++ b/routes/routeCity.js @@ -5,7 +5,7 @@ import mongoose from "mongoose"; var router = express.Router(); router.get("/", (req, res) => { - Restaurant.find({ city: req.body.city }, (err, data) => { + Restaurant.find({ city: req.query.city }, (err, data) => { if (err) { res.sendStatus(404); } else res.send(data); diff --git a/routes/routeDish.js b/routes/routeDish.js index f3adf19..7a31c54 100644 --- a/routes/routeDish.js +++ b/routes/routeDish.js @@ -9,7 +9,7 @@ var router = express.Router(); // GET DISH BY ID router.get("/", (req, res) => { - Dish.findById(req.body.dishId, (err, data) => { + Dish.findById(req.query.dishId, (err, data) => { if (err) { res.sendStatus(404); } else diff --git a/routes/routeRestaurant.js b/routes/routeRestaurant.js index a2a101f..df56e7a 100644 --- a/routes/routeRestaurant.js +++ b/routes/routeRestaurant.js @@ -48,6 +48,10 @@ router.post("/", (req, res) => { city: sanitizer.sanitize.keepUnicode(req.body.city), imgUrl: services.saveImage(req.cookies["img"]), workingHours: req.body.workingHours, + description: sanitizer.sanitize.keepUnicode(req.body.description), + tags: req.body.tags, + links: req.body.links, + phone: req.body.phone, hidden: req.body.hidden, }); restaurant.save((err) => { diff --git a/routes/routeSearch.js b/routes/routeSearch.js index 14708cb..912aa9c 100644 --- a/routes/routeSearch.js +++ b/routes/routeSearch.js @@ -50,7 +50,7 @@ router.get("/autocomplete/", (req, res) => { "name city", (err, doc) => { if (err) { - res.send(404); + res.sendStatus(404); } else { doc.forEach((value) => { cities.add(value.city); diff --git a/routes/routeUser.js b/routes/routeUser.js index 82d43e7..b6c8bc2 100644 --- a/routes/routeUser.js +++ b/routes/routeUser.js @@ -4,9 +4,17 @@ import User from "../models/users.js"; import bcrypt from "bcrypt"; import * as services from "../services/services.js"; import * as config from "../config/index.js"; +import AgileCRMManager from "agile_crm"; const { API_KEY, jwtSecret } = config; var router = express.Router(); +var agileAPI = new AgileCRMManager("bankai", API_KEY, "bankai@bankai.pl"); +var success = function (data) { + console.log("Task successfull"); +}; +var error = function (err) { + console.log("Task failed successfully"); +}; router.post("/login", (req, res) => { if (req.body.password && req.body.email) { @@ -19,11 +27,15 @@ router.post("/login", (req, res) => { err, result ) { - if (result) { - var token = services.generateAuthToken(user); - res.header("x-auth-token", token).status(202).send(); + if (err) { + res.sendStatus(500); } else { - res.sendStatus(401); + if (result) { + var token = services.generateAuthToken(user); + res.header("x-auth-token", token).status(202).send(); + } else { + res.sendStatus(401); + } } }); } @@ -49,34 +61,32 @@ router.post("/check", (req, res) => { }); router.post("/register", (req, res) => { - if (req.body.key === API_KEY) { - services.checkEmailTaken(req.body.email, (result) => { - if (result) { - res.sendStatus(409); - } else { - services.hashPass(req.body.password, (hashedPass) => { - const user = new User({ - _id: new mongoose.Types.ObjectId(), - email: req.body.email, - password: hashedPass, - subscriptionActive: req.body.subscriptionActive, - subscriptionDue: services.dueDateBasedOnSubscription( - req.body.subscriptionActive - ), - }); - user.save((err) => { - if (err) { - res.sendStatus(500); - } else { - res.sendStatus(201); - } - }); + services.checkEmailTaken(req.body.email, (result) => { + if (result) { + res.sendStatus(409); + } else { + services.hashPass(req.body.password, (hashedPass) => { + const user = new User({ + _id: new mongoose.Types.ObjectId(), + email: req.body.email, + password: hashedPass, + firstname: req.body.firstname, + lastname: req.body.lastname, + subscriptionActive: true, + subscriptionDue: services.halfYearFromNowDate(), }); - } - }); - } else { - res.sendStatus(404); - } + user.save((err) => { + if (err) { + res.sendStatus(500); + } else { + const contact = services.composeNewContact(user); + agileAPI.contactAPI.add(contact, success, error); + res.sendStatus(201); + } + }); + }); + } + }); }); export default router; diff --git a/services/services.js b/services/services.js index 6fb4110..fb10bd1 100644 --- a/services/services.js +++ b/services/services.js @@ -96,6 +96,7 @@ export function createDish(dish, cookie, generateId) { peanuts: dish.allergens.peanuts, sesame: dish.allergens.sesame, }, + ingredients: dish.ingredients, vegan: dish.vegan, vegetarian: dish.vegetarian, }); @@ -117,6 +118,7 @@ export function createDish(dish, cookie, generateId) { peanuts: dish.allergens.peanuts, sesame: dish.allergens.sesame, }, + ingredients: dish.ingredients, vegan: dish.vegan, vegetarian: dish.vegetarian, }); @@ -162,6 +164,18 @@ export function yearFromNowDate() { return date.addDays(365); } +export function halfYearFromNowDate() { + Date.prototype.addDays = function (days) { + var date = new Date(this.valueOf()); + date.setDate(date.getDate() + days); + return date; + }; + + var nowDate = new Date(); + var resultDate = nowDate.addDays(183); + return toShortDate(resultDate); +} + export function hashPass(pass, callback) { bcrypt.genSalt(10, (err, salt) => { if (err) callback(false); @@ -177,8 +191,58 @@ export function hashPass(pass, callback) { export function dueDateBasedOnSubscription(subscriptionActive) { if (subscriptionActive === true) { - return yearFromNowDate(); + return halfYearFromNowDate(); } else { return new Date(); } } + +export function composeNewContact(request) { + const dateNow = new Date(); + const contact = { + lead_score: "100", + tags: ["newUser"], + properties: [ + { + type: "SYSTEM", + name: "first_name", + value: request.firstname, + }, + { + type: "SYSTEM", + name: "last_name", + value: request.lastname, + }, + { + type: "SYSTEM", + name: "email", + subtype: "work", + value: request.email, + }, + { + type: "CUSTOM", + name: "UserID", + value: request._id, + }, + { + type: "CUSTOM", + name: "Subscription Started", + value: toShortDate(dateNow), + }, + { + type: "CUSTOM", + name: "Subscription Due", + value: request.subscriptionDue, + }, + ], + }; + + return contact; +} + +function toShortDate(date) { + const shortDate = + date.getMonth() + "/" + date.getDay() + "/" + date.getFullYear(); + + return shortDate; +}