From 9ba9ff6725e4cb06cad185984916bedaf2408f1b Mon Sep 17 00:00:00 2001 From: Harika Paluri Date: Fri, 31 Jul 2020 01:17:11 -0400 Subject: [PATCH 1/5] Added request feature Allow donor's to request an interaction and store the request in the db --- index.js | 3 ++ models/request.js | 41 ++++++++++++++++ routes/routes.js | 56 ++++++++++++++++++++- utilities/requestDB.js | 107 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 206 insertions(+), 1 deletion(-) create mode 100644 models/request.js create mode 100644 utilities/requestDB.js diff --git a/index.js b/index.js index 0f54d9d..3545c6d 100644 --- a/index.js +++ b/index.js @@ -16,6 +16,7 @@ mongoose.connect(`mongodb://db:27017/${process.env.DB_NAME}`, { }, useNewUrlParser: true, useUnifiedTopology: true, + authSource: "admin", }); @@ -61,8 +62,10 @@ passport.deserializeUser(User.deserializeUser()); /********** ROUTES ************/ const routes = require("./routes/routes.js"); + app.use("/", routes); + const server = app.listen(process.env.PORT, function () { console.log(`Listening on port: ${process.env.PORT}`); }); diff --git a/models/request.js b/models/request.js new file mode 100644 index 0000000..6d78479 --- /dev/null +++ b/models/request.js @@ -0,0 +1,41 @@ +const mongoose = require("mongoose"); +require("mongoose-type-email"); +const passportLocalMongoose = require("passport-local-mongoose"); +//const en = require("nanoid-good/locale/en"); +//const generate = require("nanoid-good/generate")(en); +const id_alphabet = "2346789ABCDEFGHJKLMNPQRTUVWXYZabcdefghijkmnpqrtwxyz"; +// const nanoid = customAlphabet(id_alphabet); +//const nanoid = () => generate(id_alphabet, 10); + +const requestSchema = new mongoose.Schema({ + requestId:mongoose.ObjectId, +tag:{ + type:String, + required:true, +}, +fundraiserEmail:{ + type:String, + required:true, +}, +//Donor information +firstname: { + type: String, + required: true, +}, +lastname: { + type: String, + +}, + +//interaction name + name:{ + type:String, + required:true + }, + +email: { + type: mongoose.SchemaTypes.Email, + required: true, +} +}); +module.exports = mongoose.model("Request",requestSchema); diff --git a/routes/routes.js b/routes/routes.js index 544def7..210b6f8 100644 --- a/routes/routes.js +++ b/routes/routes.js @@ -2,9 +2,12 @@ const express = require("express"); const router = express.Router(); const { body, validationResult } = require("express-validator"); const passport = require("passport"); +const bodyParser = require('body-parser'); +const urlencodedParser = bodyParser.urlencoded({ extended: false }); const User = require("../models/user.js"); - +const RequestDB = require("../utilities/RequestDB.js"); +const requestDB=new RequestDB(); function loggedIn(req, res, next) { if (req.isAuthenticated()) { next(); @@ -104,6 +107,57 @@ router.post( } ); +//Requesting a user for an interaction +router.post('/request', async (req,res)=>{ +//Save request and update pending request's for a user only if limit is not met. +var fundraiserEmail=req.body.fundraiserEmail; +var interaction=req.body.name; +var firstname=req.body.firstname; +var lastname=req.body.lastname; +var email=req.body.email; +var flag=0; +try{ +flag=await requestDB.checklimit(fundraiserEmail,interaction); +}catch(e){ + res.status(500).end("Databse Connectivity issue due to"+e); +} + if(flag){ + res.status(503).end("Limit has been reached .Please try again tommorrow.") + }else{ + //We need to check if donor has already requested =that is tag is pending,accepted closed + try{ + var status=await requestDB.checkTag(fundraiserEmail,email,interaction);} + catch(err){ + res.status(500).end("Databse Connectivity issue due to"+e); + } + if(status=="Pending"||status=="Accepted"){ + res.status(400).end("You have already requested an interaction .Please wait till it is closed before you request another one.") + }else{ + //Getting an array of updated interactions + var interactions=await requestDB.updateLimit(fundraiserEmail,interaction); + const update = { interactions: interactions }; + const filter = { email:fundraiserEmail }; + //Update user + try{ + let doc = await User.findOneAndUpdate(filter, update, { + new: true + }); + + } + catch(err){ + return reject(err); + } + //Create Request for a donor + requestDB.saveInfo(fundraiserEmail,email,interaction,firstname,lastname);} + + res.status(200).end("Request sent to Fundraiser"); + } + + + + +}); + router.post("/logout", (req, res) => { req.logout(); res.status(200).end("logged out"); diff --git a/utilities/requestDB.js b/utilities/requestDB.js new file mode 100644 index 0000000..a9b391f --- /dev/null +++ b/utilities/requestDB.js @@ -0,0 +1,107 @@ +const express = require("express"); +const router = express.Router(); +const { body, validationResult } = require("express-validator"); +const Request=require("../models/request.js"); +const User=require("../models/user.js"); +//All request related functions +class RequestDB{ + //Checking if interaction limit is met for particular interaction of a fundraiser. +checklimit(email,name){ + return new Promise((resolve, reject) => { + var limit=-1; + User + .findOne({email:email},"interactions") + .then((data) => { + + var interactions=data.interactions; + + for(var i=0;i0){ + resolve(false); + } + }) + .catch((err) => { + return reject(err); + }); + + }); + +} +//Checking if a request already exists and the status of it + checkTag(fundraiserEmail,email,name){ + return new Promise((resolve, reject) => { + Request.findOne({ + fundraiserEmail:fundraiserEmail,email:email,name:name},"tag").then((data) =>{ + if(data){ + + resolve(data.tag); + }else{ + resolve("Not Created Yet"); + } + + }) + .catch((err) => { + return reject(err); + }); + + }); + } + //Creating a new request + saveInfo(fundraiserEmail,email,interaction,firstname,lastname){ +return new Promise((resolve, reject) => { +let req=new Request({ + tag:"Pending" , + fundraiserEmail:fundraiserEmail, + //Donor information + firstname:firstname, + lastname:lastname, + //interaction name + name:interaction, + email:email +}); + +req.save(function (err, data) { + if (data){ resolve(data); + console.log("Request Created");} + else{ return reject(err);} + }); +}); +} +//update Limit of interaction after request Created +updateLimit(email,interaction){ + + return new Promise((resolve, reject) => { + + User + .findOne({email:email},"interactions") + .then((data) => { + + var interactions=data.interactions; + + for(var i=0;i { + return reject(err); + }); + + }); +} +} +// export only class with methods to make sure, other part of this app can't modify hardcoded data. +module.exports = RequestDB; From 557cfeaaaa29a4c238babed5ba300f0b2ff3c6f8 Mon Sep 17 00:00:00 2001 From: Harika Paluri Date: Sun, 2 Aug 2020 20:38:26 -0400 Subject: [PATCH 2/5] Used interaction Id and user Url in request Service --- models/request.js | 4 ++-- routes/routes.js | 16 ++++++++-------- utilities/requestDB.js | 28 ++++++++++++++-------------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/models/request.js b/models/request.js index 6d78479..921b069 100644 --- a/models/request.js +++ b/models/request.js @@ -13,7 +13,7 @@ tag:{ type:String, required:true, }, -fundraiserEmail:{ +url:{ type:String, required:true, }, @@ -28,7 +28,7 @@ lastname: { }, //interaction name - name:{ + id:{ type:String, required:true }, diff --git a/routes/routes.js b/routes/routes.js index 210b6f8..bd8aa2a 100644 --- a/routes/routes.js +++ b/routes/routes.js @@ -110,14 +110,14 @@ router.post( //Requesting a user for an interaction router.post('/request', async (req,res)=>{ //Save request and update pending request's for a user only if limit is not met. -var fundraiserEmail=req.body.fundraiserEmail; -var interaction=req.body.name; +var url=req.body.url; +var interaction=req.body.id; var firstname=req.body.firstname; var lastname=req.body.lastname; var email=req.body.email; var flag=0; try{ -flag=await requestDB.checklimit(fundraiserEmail,interaction); +flag=await requestDB.checklimit(url,interaction); }catch(e){ res.status(500).end("Databse Connectivity issue due to"+e); } @@ -126,7 +126,7 @@ flag=await requestDB.checklimit(fundraiserEmail,interaction); }else{ //We need to check if donor has already requested =that is tag is pending,accepted closed try{ - var status=await requestDB.checkTag(fundraiserEmail,email,interaction);} + var status=await requestDB.checkTag(url,email,interaction);} catch(err){ res.status(500).end("Databse Connectivity issue due to"+e); } @@ -134,21 +134,21 @@ flag=await requestDB.checklimit(fundraiserEmail,interaction); res.status(400).end("You have already requested an interaction .Please wait till it is closed before you request another one.") }else{ //Getting an array of updated interactions - var interactions=await requestDB.updateLimit(fundraiserEmail,interaction); + var interactions=await requestDB.updateLimit(url,interaction); const update = { interactions: interactions }; - const filter = { email:fundraiserEmail }; + const filter = { url:url }; //Update user try{ let doc = await User.findOneAndUpdate(filter, update, { new: true }); - + } catch(err){ return reject(err); } //Create Request for a donor - requestDB.saveInfo(fundraiserEmail,email,interaction,firstname,lastname);} + requestDB.saveInfo(url,email,interaction,firstname,lastname);} res.status(200).end("Request sent to Fundraiser"); } diff --git a/utilities/requestDB.js b/utilities/requestDB.js index a9b391f..b7bb3ce 100644 --- a/utilities/requestDB.js +++ b/utilities/requestDB.js @@ -6,17 +6,17 @@ const User=require("../models/user.js"); //All request related functions class RequestDB{ //Checking if interaction limit is met for particular interaction of a fundraiser. -checklimit(email,name){ +checklimit(url,id){ return new Promise((resolve, reject) => { var limit=-1; User - .findOne({email:email},"interactions") + .findOne({url:url},"interactions") .then((data) => { var interactions=data.interactions; - + console.log(interactions); for(var i=0;i { Request.findOne({ - fundraiserEmail:fundraiserEmail,email:email,name:name},"tag").then((data) =>{ + url:url,email:email,id:id},"tag").then((data) =>{ if(data){ - + resolve(data.tag); }else{ resolve("Not Created Yet"); @@ -55,16 +55,16 @@ checklimit(email,name){ }); } //Creating a new request - saveInfo(fundraiserEmail,email,interaction,firstname,lastname){ + saveInfo(url,email,id,firstname,lastname){ return new Promise((resolve, reject) => { let req=new Request({ tag:"Pending" , - fundraiserEmail:fundraiserEmail, + url:url, //Donor information firstname:firstname, lastname:lastname, - //interaction name - name:interaction, + //interaction id + id:id, email:email }); @@ -76,18 +76,18 @@ req.save(function (err, data) { }); } //update Limit of interaction after request Created -updateLimit(email,interaction){ +updateLimit(url,interaction){ return new Promise((resolve, reject) => { User - .findOne({email:email},"interactions") + .findOne({url:url},"interactions") .then((data) => { var interactions=data.interactions; for(var i=0;i Date: Fri, 14 Aug 2020 22:32:08 -0400 Subject: [PATCH 3/5] Accept/Reject Feature View Pending Requestes/Accepted,Sending a mail to donor on acceptance/rejection --- email/Mailer.js | 45 ++++++++++++++ index.js | 5 +- package.json | 2 + routes/pending.js | 138 +++++++++++++++++++++++++++++++++++++++++ routes/routes.js | 43 ++++++++++--- utilities/requestDB.js | 27 ++++++++ 6 files changed, 248 insertions(+), 12 deletions(-) create mode 100644 email/Mailer.js create mode 100644 routes/pending.js diff --git a/email/Mailer.js b/email/Mailer.js new file mode 100644 index 0000000..63f85f1 --- /dev/null +++ b/email/Mailer.js @@ -0,0 +1,45 @@ +// include nodemailer +const nodemailer = require('nodemailer'); +const smtpTransport = require('nodemailer/lib/smtp-transport') +//const dotenv = require('dotenv'); +//dotenv.config(); +// declare vars, +const fromMail =process.env.EMAIL_NAME; +let subject = 'Enter subject line here'; +let text = "Enter email content." + + + + +var transporter = nodemailer.createTransport(new smtpTransport({ + name:'www.raise.social', + host: process.env.EMAIL_SMTP, + secure:false, + port:process.env.EMAIL_PORT, + auth:{ + user:fromMail, + pass:process.env.EMAIL_PASS +}, + tls: {rejectUnauthorized: false} + +})); + + +var ops=function setMail(to,subject,text){ + + // email options +let mailOptions = { +from: fromMail, +to: to, +subject: subject, +text: text +}; +return mailOptions; +} + + + + + +module.exports.transporter = transporter; +module.exports.mailOptions = ops; diff --git a/index.js b/index.js index 3545c6d..62b8d18 100644 --- a/index.js +++ b/index.js @@ -1,7 +1,6 @@ "use strict"; const express = require("express"); - const passport = require("passport"); const session = require("express-session"); const MongoStore = require("connect-mongo")(session); @@ -62,9 +61,9 @@ passport.deserializeUser(User.deserializeUser()); /********** ROUTES ************/ const routes = require("./routes/routes.js"); - +const pending=require("./routes/pending.js"); app.use("/", routes); - +app.use("/pending",pending); const server = app.listen(process.env.PORT, function () { console.log(`Listening on port: ${process.env.PORT}`); diff --git a/package.json b/package.json index ee6f90b..8152071 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "body-parser": "^1.19.0", "connect-mongo": "^3.2.0", "csurf": "^1.11.0", + "dotenv": "^8.2.0", "express": "^4.17.1", "express-session": "^1.17.1", "express-validator": "^6.6.0", @@ -36,6 +37,7 @@ "mongoose-type-email": "^1.0.12", "nanoid": "^3.1.10", "nanoid-good": "^1.3.0", + "nodemailer": "^6.4.11", "passport": "^0.4.1", "passport-facebook": "^3.0.0", "passport-google-oauth": "^2.0.0", diff --git a/routes/pending.js b/routes/pending.js new file mode 100644 index 0000000..91c0795 --- /dev/null +++ b/routes/pending.js @@ -0,0 +1,138 @@ +const express = require("express"); +const router = express.Router(); +const { body, validationResult } = require("express-validator"); +const passport = require("passport"); +const bodyParser = require('body-parser'); +const urlencodedParser = bodyParser.urlencoded({ extended: false }); +const Mailer=require('../email/Mailer.js'); +const User = require("../models/user.js"); +const RequestDB = require("../utilities/RequestDB.js"); +const Request=require("../models/request.js"); +const requestDB=new RequestDB(); +function loggedIn(req, res, next) { + if (req.isAuthenticated()) { + next(); + } else { + res.status(401).end("Login required"); + } +} +//Loading all the pending request's +router.get("/",loggedIn,(req, res) => { + let user = req.user; + Request.find({"url":user.url,"tag":"Pending"}) + .then((data) => { + if (data) { + res.status(200).json(data); + } else { + res.status(404).end("No Pending Request's"); + } + }) + .catch(() => { + res.status(404).end("User not found"); + }); +}); + +//Accepting a request +router.post("/accept",loggedIn, async (req, res) => { + let user = req.user; + var requestId=req.body._id; + var interactionId=req.body.id; + var email=req.body.email; + var firstname=req.body.firstname + //Sending an acceptance Email to the Donor. + var transporter=Mailer.transporter; + var mailOptions=Mailer.mailOptions(email,"Interaction Request Accepted ","Hello "+firstname+","+"The fundraiser has accepted your interaction request.Please click on https://calendly.com/spaluri/15min to schedule your appointment."); + + //Getting an array of updated interactions + var interactions=await requestDB.increaseLimit(user.url,interactionId); + const update = { interactions: interactions }; + const filter = { url:user.url }; + //Update user +try{ + let doc = await User.findOneAndUpdate(filter, update, { + new: true + }); +}catch(err) + {return reject(err);} +//Updating request to accept + const tag = { tag:"Accepted" }; + const id = { _id:requestId }; + //Update Request + Request.findByIdAndUpdate(id, { tag: 'Accepted' }, + function (err, docs) { + if (err){ + res.status(404).json(err); + + } + else{ + res.status(200).json(docs); + + // sending an email to the donor + transporter.sendMail(mailOptions, (error, response) => { + if (error) { + console.log(error); + + } + else{console.log("Sent a donor acceptance email"+response);} + }); + } + }); + +}); + +//Rejecting a request +router.post("/reject",loggedIn,async (req, res) => { + let user = req.user; + var requestId=req.body._id; + var interactionId=req.body.id; + var email=req.body.email; + var firstname=req.body.firstname; +//Send a rejection Email to the Donor. +var transporter=Mailer.transporter; +var mailOptions=Mailer.mailOptions(email,"Interaction Request Denied ","Sorry "+firstname+","+"The fundraiser at this time is not able to accept youre request.Please try again later."); +// sending an email +transporter.sendMail(mailOptions, (error, response) => { +if (error) { + console.log(error); + +} +else{console.log("Sent a donor email"+response);} +}); + +//Update limit +//Getting an array of updated interactions +try{ +var interactions=await requestDB.increaseLimit(user.url,interactionId); +} +catch(err){ + return reject(err); +} +const upd = { interactions: interactions }; +const fil = { url:user.url }; +//Update user +try{ +let doc = await User.findOneAndUpdate(fil, upd, { + new: true +}); +}catch(err) + {return reject(err);} +//Delete the request +Request.findByIdAndRemove(requestId) + .exec() + .then(function(doc) { + res.status(200).json(doc); + }).catch(function(error) { + res.status(404).json("Request not found"); + }); + +}); + +router.post("/logout", (req, res) => { + req.logout(); + res.status(200).end("logged out"); +}); + + + + +module.exports = router; diff --git a/routes/routes.js b/routes/routes.js index bd8aa2a..60a0a80 100644 --- a/routes/routes.js +++ b/routes/routes.js @@ -4,9 +4,10 @@ const { body, validationResult } = require("express-validator"); const passport = require("passport"); const bodyParser = require('body-parser'); const urlencodedParser = bodyParser.urlencoded({ extended: false }); - +const Mailer=require('../email/Mailer.js'); const User = require("../models/user.js"); const RequestDB = require("../utilities/RequestDB.js"); +const Request=require("../models/request.js"); const requestDB=new RequestDB(); function loggedIn(req, res, next) { if (req.isAuthenticated()) { @@ -20,6 +21,7 @@ router.get("/ping", (req, res) => { res.end("pong"); }); + router.get( "/interactions", [body("user_url").not().isEmpty().trim().escape()], @@ -61,9 +63,7 @@ router.get("/profile", loggedIn, (req, res) => { }); }); -// router.post("/addInteraction", loggedIn, (req, res) => { -// -// }); + router.post("/login", passport.authenticate("local"), (req, res) => { res.status(200).end("logged in"); @@ -142,20 +142,45 @@ flag=await requestDB.checklimit(url,interaction); let doc = await User.findOneAndUpdate(filter, update, { new: true }); - + var fundraiserEmail=doc.email; } catch(err){ return reject(err); } //Create Request for a donor - requestDB.saveInfo(url,email,interaction,firstname,lastname);} - - res.status(200).end("Request sent to Fundraiser"); - } + requestDB.saveInfo(url,email,interaction,firstname,lastname); + //Send an email to the fundraiser about the new request. + var transporter=Mailer.transporter; +var mailOptions=Mailer.mailOptions(fundraiserEmail,"New Interaction Request from "+firstname,"Check pending requests To accept/reject an interaction Request"); +// sending an email +transporter.sendMail(mailOptions, (error, response) => { +if (error) { + console.log(error); +} +else{console.log("Sent an email");} +}); +res.status(200).end("Request sent to the Fundraiser"); + } + } +}); +//Loading all the accepted request's +router.get("/accepted",loggedIn,(req, res) => { + let user = req.user; + Request.find({"url":user.url,"tag":"Accepted"}) + .then((data) => { + if (data) { + res.status(200).json(data); + } else { + res.status(404).end("No Accepted Request's"); + } + }) + .catch(() => { + res.status(404).end("User not found"); + }); }); router.post("/logout", (req, res) => { diff --git a/utilities/requestDB.js b/utilities/requestDB.js index b7bb3ce..97066d6 100644 --- a/utilities/requestDB.js +++ b/utilities/requestDB.js @@ -95,6 +95,33 @@ updateLimit(url,interaction){ resolve(interactions); + }) + .catch((err) => { + return reject(err); + }); + + }); +} +//update Limit of interaction after request Created +increaseLimit(url,interaction){ + + return new Promise((resolve, reject) => { + + User + .findOne({url:url},"interactions") + .then((data) => { + + var interactions=data.interactions; + + for(var i=0;i { return reject(err); From 758ea41146e7b9f375a6bd04e343c8d68aa161bf Mon Sep 17 00:00:00 2001 From: Harika Paluri Date: Thu, 20 Aug 2020 14:38:14 -0400 Subject: [PATCH 4/5] Update response status FInd out exact email response --- routes/pending.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/routes/pending.js b/routes/pending.js index 91c0795..def53c6 100644 --- a/routes/pending.js +++ b/routes/pending.js @@ -5,10 +5,13 @@ const passport = require("passport"); const bodyParser = require('body-parser'); const urlencodedParser = bodyParser.urlencoded({ extended: false }); const Mailer=require('../email/Mailer.js'); + const User = require("../models/user.js"); const RequestDB = require("../utilities/RequestDB.js"); const Request=require("../models/request.js"); const requestDB=new RequestDB(); + + function loggedIn(req, res, next) { if (req.isAuthenticated()) { next(); @@ -41,6 +44,7 @@ router.post("/accept",loggedIn, async (req, res) => { var firstname=req.body.firstname //Sending an acceptance Email to the Donor. var transporter=Mailer.transporter; + var mailOptions=Mailer.mailOptions(email,"Interaction Request Accepted ","Hello "+firstname+","+"The fundraiser has accepted your interaction request.Please click on https://calendly.com/spaluri/15min to schedule your appointment."); //Getting an array of updated interactions @@ -67,13 +71,15 @@ try{ else{ res.status(200).json(docs); + // sending an email to the donor - transporter.sendMail(mailOptions, (error, response) => { + transporter.sendMail(mailOptions, (error, response) => { + console.log(mailOptions.to); if (error) { console.log(error); } - else{console.log("Sent a donor acceptance email"+response);} + else{console.log("Sent a donor acceptance email"+response.response);} }); } }); @@ -96,7 +102,7 @@ if (error) { console.log(error); } -else{console.log("Sent a donor email"+response);} +else{console.log("Sent a donor email"+response.response);} }); //Update limit From 2864c6433ace7dae589468c197df6f78bbd7805e Mon Sep 17 00:00:00 2001 From: Harika Paluri Date: Thu, 20 Aug 2020 22:30:59 -0400 Subject: [PATCH 5/5] Added express validations Added express validations --- routes/pending.js | 38 ++++++++++++++++++++++++++++++++------ routes/routes.js | 19 +++++++++++++++++-- test queries.sql | 7 +++++++ 3 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 test queries.sql diff --git a/routes/pending.js b/routes/pending.js index def53c6..b4c6a27 100644 --- a/routes/pending.js +++ b/routes/pending.js @@ -36,7 +36,22 @@ router.get("/",loggedIn,(req, res) => { }); //Accepting a request -router.post("/accept",loggedIn, async (req, res) => { +router.post("/accept",loggedIn, +[ +body("_id").notEmpty().trim().escape().isMongoId(), + body("firstname").notEmpty().trim().escape(), + body("lastname").not().isEmpty().trim().escape(), + body("email").isEmail().normalizeEmail(), + body("id").notEmpty().trim().escape().isMongoId(), +], + + async (req, res) => { + //Validation check + const errors = validationResult(req); + if (!errors.isEmpty()) { + return res.status(400).json({ errors: errors.array() }); + } +//Get post paramas let user = req.user; var requestId=req.body._id; var interactionId=req.body.id; @@ -70,14 +85,11 @@ try{ } else{ res.status(200).json(docs); - - // sending an email to the donor transporter.sendMail(mailOptions, (error, response) => { console.log(mailOptions.to); if (error) { console.log(error); - } else{console.log("Sent a donor acceptance email"+response.response);} }); @@ -87,7 +99,21 @@ try{ }); //Rejecting a request -router.post("/reject",loggedIn,async (req, res) => { +router.post("/reject",loggedIn, +[ +body("_id").notEmpty().trim().escape().isMongoId(), + body("firstname").notEmpty().trim().escape(), + body("lastname").not().isEmpty().trim().escape(), + body("email").isEmail().normalizeEmail(), + body("id").notEmpty().trim().escape().isMongoId(), +], +async (req, res) => { + //Validation check + const errors = validationResult(req); + if (!errors.isEmpty()) { + return res.status(400).json({ errors: errors.array() }); + } +//Get post paramas let user = req.user; var requestId=req.body._id; var interactionId=req.body.id; @@ -95,7 +121,7 @@ router.post("/reject",loggedIn,async (req, res) => { var firstname=req.body.firstname; //Send a rejection Email to the Donor. var transporter=Mailer.transporter; -var mailOptions=Mailer.mailOptions(email,"Interaction Request Denied ","Sorry "+firstname+","+"The fundraiser at this time is not able to accept youre request.Please try again later."); +var mailOptions=Mailer.mailOptions(email,"Interaction Request Denied ","Sorry "+firstname+","+"The fundraiser at this time is not able to accept your request.Please try again later."); // sending an email transporter.sendMail(mailOptions, (error, response) => { if (error) { diff --git a/routes/routes.js b/routes/routes.js index 60a0a80..a11a42e 100644 --- a/routes/routes.js +++ b/routes/routes.js @@ -108,14 +108,29 @@ router.post( ); //Requesting a user for an interaction -router.post('/request', async (req,res)=>{ -//Save request and update pending request's for a user only if limit is not met. +router.post('/request', +[ +body("id").notEmpty().trim().escape().isMongoId(), + body("firstname").notEmpty().trim().escape(), + body("lastname").not().isEmpty().trim().escape(), + body("email").isEmail().normalizeEmail(), + body("url").not().isEmpty().trim().escape() +], + + async (req,res)=>{ + //Validation check + const errors = validationResult(req); + if (!errors.isEmpty()) { + return res.status(400).json({ errors: errors.array() }); + } +//Get post paramas var url=req.body.url; var interaction=req.body.id; var firstname=req.body.firstname; var lastname=req.body.lastname; var email=req.body.email; var flag=0; +//Save request and update pending request's for a user only if limit is not met. try{ flag=await requestDB.checklimit(url,interaction); }catch(e){ diff --git a/test queries.sql b/test queries.sql new file mode 100644 index 0000000..f144ad4 --- /dev/null +++ b/test queries.sql @@ -0,0 +1,7 @@ +db.users.findOneAndUpdate({$and:[{email:'harikapaluri@gmail.com'}]},{$set:{interactions:[{id:2,name:'Resume Review',description:'for free',price:10,limit:10},{id:3,name:'Free chat',description:'for free',price:10,limit:15}]}}) + + + + + +db.users.findOneAndUpdate({$and:[{email:'pls@gmail.com'}]},{$set:{email:'harikapaluri@gmail.com'}})