From 9e2e696df26fd4a82e243e9204357f71a1d8382d Mon Sep 17 00:00:00 2001 From: Ronan Date: Mon, 27 Apr 2020 17:59:17 -0700 Subject: [PATCH] events module --- app.js | 2 + package-lock.json | 5 ++ package.json | 1 + routes/events.js | 191 ++++++++++++++++++++++++++++++++++++++++++++++ routes/roster.js | 47 ++++++++++++ 5 files changed, 246 insertions(+) create mode 100644 routes/events.js diff --git a/app.js b/app.js index 7d469ff..1ee6388 100644 --- a/app.js +++ b/app.js @@ -12,6 +12,7 @@ var applicationsRouter = require('./routes/applications'); var adminAuthRouter = require('./routes/adminAuth'); var adminRosterRouter = require('./routes/roster'); var statusRouter = require('./routes/status'); +var eventsRouter = require('./routes/events'); var app = express(); app.use(cors()) @@ -31,6 +32,7 @@ app.use('/api/v1/apply', applyRouter); app.use('/api/v1/admin/applications', applicationsRouter); app.use('/api/v1/admin/auth', adminAuthRouter); app.use('/api/v1/admin/roster', adminRosterRouter); +app.use('/api/v1/admin/events', eventsRouter); app.use('/api/v1/status', statusRouter); /* // catch 404 and forward to error handler diff --git a/package-lock.json b/package-lock.json index 3410734..2de43f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -364,6 +364,11 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0=" }, + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + }, "available-typed-arrays": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", diff --git a/package.json b/package.json index 445aac7..4ee9fe6 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "dev": "DEBUG=2020-backend:* npm start" }, "dependencies": { + "async": "^3.2.0", "cookie-parser": "~1.4.4", "cors": "^2.8.5", "debug": "~2.6.9", diff --git a/routes/events.js b/routes/events.js new file mode 100644 index 0000000..8d63d58 --- /dev/null +++ b/routes/events.js @@ -0,0 +1,191 @@ +var express = require('express'); +var router = express.Router(); +const emailValidator = require("email-validator"); +const fetch = require('node-fetch'); +const keys = require("../private/keys") +const sengridEndpoint = "https://api.sendgrid.com" +const sengridAuthorization = `Bearer ${keys.sendgrid}` +var admin = require('firebase-admin'); +const moment = require('moment-timezone') +const async = require("async"); +/* /api/v1/apply*/ +const MongoClient = require('mongodb').MongoClient; + +const client = new MongoClient(keys.mongo, {useNewUrlParser: true}); +client.connect(err => { + console.log(err) + const db = client.db("hyphen-hacks") + + function bytes(s) { + return ~-encodeURI(s).split(/%..|./).length + } + + function jsonSize(s) { + return bytes(JSON.stringify(s)) + } + + let verifyEmail = async (email) => { + console.log(email, 'email') + if (email.endsWith("hyphen-hacks.com")) { + return email.endsWith("hyphen-hacks.com") + } else { + let authEmailed = await db.collection("authorizedEmails").find({email: email}).toArray() + + return authEmailed.length >= 1 + } + } + + + /* /api/v1/admin/events/ */ + + router.get("/", (req, res) => { + let origin = req.get('origin') + console.log("request", origin, req.body) + if (keys.whitelistedHosts.indexOf(origin) > -1) { + admin.auth().verifyIdToken(req.headers.authorization) + .then(async function (decodedToken) { + let uid = decodedToken.uid; + admin.auth().getUser(uid) + .then(async function (userRecord) { + // See the UserRecord reference doc for the contents of userRecord. + + let email = userRecord.toJSON().email + if (await verifyEmail(email) === true) { + let events = await db.collection("events").find().limit(100).toArray() + let indexedNames = {} + await async.forEachOf(events, async (event, key, callback) => { + console.log(event, "event") + let authorizor = "" + let person = "" + if (event.authorizer) { + if (indexedNames[event.authorizer]) { + authorizor = indexedNames[event.authorizer] + } else { + let user = await admin.auth().getUser(event.authorizer) + console.log(user.displayName) + indexedNames[event.authorizer] = user.displayName + authorizor = user.displayName + } + + } + if (event.id) { + if (indexedNames[event.id]) { + person = indexedNames[event.id] + console.log("indexed", person) + } else { + let user = await db.collection('people').find({_id: event.id}, { + projection: { + firstName: 1, lastName: 1, _id: 1 + } + }).toArray() + if (user.length >= 1) { + user = user[0] + // console.log(user, "userRecord people") + indexedNames[event.id] = user.firstName + " " + user.lastName + person = user.firstName + " " + user.lastName + console.log("people", user.firstName + " " + user.lastName) + } else { + user = await db.collection('applicants').find({_id: event.id}, { + projection: { + firstName: 1, lastName: 1, _id: 1 + } + }).toArray() + if (user.length >= 1) { + user = user[0] + // console.log(user, "user record applicants") + indexedNames[event.id] = user.firstName + " " + user.lastName + person = user.firstName + " " + user.lastName + console.log("applicants", user.firstName + " " + user.lastName) + } else { + user = await db.collection('declined').find({_id: event.id}, { + projection: { + firstName: 1, lastName: 1, _id: 1 + } + }).toArray() + user = user[0] + // console.log(user, "user record declined") + indexedNames[event.id] = user.firstName + " " + user.lastName + person = user.firstName + " " + user.lastName + console.log("declined", user.firstName + " " + user.lastName) + } + } + + } + } + console.log(person, authorizor, event.event, "done") + switch (event.event) { + case "attendeeSignUp": + events[key].userDescription = `${person} applied to attend` + return + case "mentorSignUp": + events[key].userDescription = `${person} applied to mentor` + return + case "volunteerSignUp": + events[key].userDescription = `${person} applied to volunteer` + return + case "attendeeAccepted": + events[key].userDescription = `${authorizor} accepted ${person}'s attendee application` + return + case "mentorAccepted": + events[key].userDescription = `${authorizor} accepted ${person}'s mentor application` + return + case "volunteerAccepted": + events[key].userDescription = `${authorizor} accepted ${person}'s volunteer application` + return + case "mentorDeclined": + events[key].userDescription = `${authorizor} declined ${person}'s mentor application` + return + case "volunteerDeclined": + events[key].userDescription = `${authorizor} declined ${person}'s volunteer application` + return + case "attendeeDeclined": + events[key].userDescription = `${authorizor} declined ${person}'s attendee application` + return + case "attendeeResubmit": + events[key].userDescription = `${person} resubmitted their attendee application` + return + case "mentorResubmit": + events[key].userDescription = `${person} resubmitted their mentor application` + return + case "volunteerResubmit": + events[key].userDescription = `${person} resubmitted their volunteer application` + return + default : + events[key].userDescription = `${event.event}` + return + } + + }).catch(err => { + console.log(err, "async err") + }) + console.log(indexedNames, "indexDB") + res.status(200) + res.send({events: events}) + res.end() + } else { + res.status(401) + res.send({error: "not authorized"}) + res.end() + } + + + }) + + + }).catch(function (error) { + console.log(error) + res.status(401) + res.send({error: "authorizing"}) + res.end() + }); + + } else { + res.status(401) + res.send({error: "unsecure request"}) + res.end() + } + }) +}) + + +module.exports = router; diff --git a/routes/roster.js b/routes/roster.js index 676d68d..1c0553f 100644 --- a/routes/roster.js +++ b/routes/roster.js @@ -82,6 +82,53 @@ client.connect(err => { res.end() } }) + router.get("/:role", (req, res) => { + let origin = req.get('origin') + console.log("request", origin, req.body) + if (keys.whitelistedHosts.indexOf(origin) > -1) { + admin.auth().verifyIdToken(req.headers.authorization) + .then(async function (decodedToken) { + let uid = decodedToken.uid; + admin.auth().getUser(uid) + .then(async function (userRecord) { + // See the UserRecord reference doc for the contents of userRecord. + + let email = userRecord.toJSON().email + if (await verifyEmail(email) === true) { + try { + let applications = await db.collection("people").find({role: req.params.role}).toArray() + res.status(200) + res.send({roster: applications, type: req.params.role}) + res.end() + } catch (err) { + console.log(err) + res.status(500) + res.send({error: "internal server error"}) + res.end() + } + } else { + res.status(401) + res.send({error: "not authorized"}) + res.end() + } + + + }) + + + }).catch(function (error) { + console.log(error) + res.status(401) + res.send({error: "authorizing"}) + res.end() + }); + + } else { + res.status(401) + res.send({error: "unsecure request"}) + res.end() + } + }) })