Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Harika #26

Open
wants to merge 5 commits into
base: sprint-2
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
45 changes: 45 additions & 0 deletions email/Mailer.js
Original file line number Diff line number Diff line change
@@ -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;
4 changes: 3 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
@@ -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);
Expand All @@ -16,6 +15,7 @@ mongoose.connect(`mongodb://db:27017/${process.env.DB_NAME}`, {
},
useNewUrlParser: true,
useUnifiedTopology: true,

authSource: "admin",
});

Expand Down Expand Up @@ -61,7 +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}`);
Expand Down
41 changes: 41 additions & 0 deletions models/request.js
Original file line number Diff line number Diff line change
@@ -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,
},
url:{
type:String,
required:true,
},
//Donor information
firstname: {
type: String,
required: true,
},
lastname: {
type: String,

},

//interaction name
id:{
type:String,
required:true
},

email: {
type: mongoose.SchemaTypes.Email,
required: true,
}
});
module.exports = mongoose.model("Request",requestSchema);
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,15 @@
"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",
"mongoose": "^5.9.25",
"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",
Expand Down
170 changes: 170 additions & 0 deletions routes/pending.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
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,
[
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;
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) => {
console.log(mailOptions.to);
if (error) {
console.log(error);
}
else{console.log("Sent a donor acceptance email"+response.response);}
});
}
});

});

//Rejecting a request
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;
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 your 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.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;