From cafb324ddbf8b5b683a7b61e60d08ed4941b348f Mon Sep 17 00:00:00 2001 From: Johnathon Slightham <31053827+jslightham@users.noreply.github.com> Date: Wed, 19 May 2021 20:08:04 -0400 Subject: [PATCH] Refactor utils and organize routes/schema --- index.js | 18 ++--- category.route.js => routes/category.route.js | 14 ++-- post.route.js => routes/post.route.js | 40 +++++----- user.route.js => routes/user.route.js | 17 ++--- category.model.js => schema/category.model.js | 0 message.model.js => schema/message.model.js | 0 post.model.js => schema/post.model.js | 0 session.model.js => schema/session.model.js | 0 user.model.js => schema/user.model.js | 0 utils/account.js | 27 +++++++ utils/array.js | 9 +++ utils/cron.js | 21 ++++++ utils/date.js | 13 ++++ utils.js => utils/mail.js | 73 +------------------ utils/utils.js | 11 +++ 15 files changed, 128 insertions(+), 115 deletions(-) rename category.route.js => routes/category.route.js (82%) rename post.route.js => routes/post.route.js (79%) rename user.route.js => routes/user.route.js (93%) rename category.model.js => schema/category.model.js (100%) rename message.model.js => schema/message.model.js (100%) rename post.model.js => schema/post.model.js (100%) rename session.model.js => schema/session.model.js (100%) rename user.model.js => schema/user.model.js (100%) create mode 100644 utils/account.js create mode 100644 utils/array.js create mode 100644 utils/cron.js create mode 100644 utils/date.js rename utils.js => utils/mail.js (56%) create mode 100644 utils/utils.js diff --git a/index.js b/index.js index e5bcc41..15e1eed 100644 --- a/index.js +++ b/index.js @@ -4,12 +4,12 @@ const app = express(); const PORT = 4000; const cors = require('cors'); const mongoose = require('mongoose'); -const utils = require ('./utils'); +const utils = require ('./utils/utils'); const CronJob = require('cron').CronJob; const config = require('./DB.js'); -const userRoutes = require('./user.route'); -const postRoutes = require('./post.route'); -const categoryRoutes = require('./category.route'); +const userRoutes = require('./routes/user.route'); +const postRoutes = require('./routes/post.route'); +const categoryRoutes = require('./routes/category.route'); const mongoSanitize = require('express-mongo-sanitize'); console.log("Starting Kno-Logic Backend Server"); @@ -19,12 +19,12 @@ mongoose.Promise = global.Promise; mongoose.connect(config.DB, { useNewUrlParser: true, useUnifiedTopology: true }).then( () => { console.log('Connected to dabase'); - utils.loadDefaultTemplates(); - utils.purgeSessions(); + utils.mail.loadDefaultTemplates(); + utils.cron.purgeSessions(); }, err => { - console.log('Could not connect to database: '); - console.log(err); + console.error('Could not connect to database: '); + console.error(err); } ); @@ -46,5 +46,5 @@ app.listen(PORT, () => { }); // Cron jobs -var purge = new CronJob('*/5 * * * *', utils.purgeSessions); +var purge = new CronJob('*/5 * * * *', utils.cron.purgeSessions); purge.start(); diff --git a/category.route.js b/routes/category.route.js similarity index 82% rename from category.route.js rename to routes/category.route.js index 5508ff4..56074b2 100644 --- a/category.route.js +++ b/routes/category.route.js @@ -1,11 +1,11 @@ -const utils = require('./utils'); +const utils = require('../utils/utils'); const express = require('express'); const categoryRoutes = express.Router(); -let Post = require('./post.model'); -let Category = require('./category.model'); -let Session = require('./session.model'); -let User = require('./user.model'); +let Post = require('../schema/post.model'); +let Category = require('../schema/category.model'); +let Session = require('../schema/session.model'); +let User = require('../schema/user.model'); /* POST - /category/create @@ -18,8 +18,8 @@ categoryRoutes.route('/create').post((req, res) => { res.status(401).send("Missing body"); return; } - utils.checkSession(req.body.userId, req.body.sessionId, (isValidId) => { - utils.isAdmin(req.body.userId, (isAdmin) => { + utils.account.checkSession(req.body.userId, req.body.sessionId, (isValidId) => { + utils.account.isAdmin(req.body.userId, (isAdmin) => { if (isValidId && isAdmin) { let c = new Category(req.body); c.save() diff --git a/post.route.js b/routes/post.route.js similarity index 79% rename from post.route.js rename to routes/post.route.js index 1cb4330..f9a3f45 100644 --- a/post.route.js +++ b/routes/post.route.js @@ -1,11 +1,11 @@ -const utils = require('./utils'); +const utils = require('../utils/utils'); const express = require('express'); const postRoutes = express.Router(); -let Post = require('./post.model'); -let Category = require('./category.model'); -let Session = require('./session.model'); -let User = require('./user.model'); +let Post = require('../schema/post.model'); +let Category = require('../schema/category.model'); +let Session = require('../schema/session.model'); +let User = require('../schema/user.model'); /* POST - /post/create @@ -18,17 +18,17 @@ postRoutes.route('/create').post((req, res) => { res.status(401).send("Missing body"); return; } - utils.checkSession(req.body.userId, req.body.sessionId, (isValidId) => { - utils.isAdmin(req.body.userId, (isAdmin) => { + utils.account.checkSession(req.body.userId, req.body.sessionId, (isValidId) => { + utils.account.isAdmin(req.body.userId, (isAdmin) => { if (isValidId && isAdmin) { let p = new Post(req.body); - p.date = utils.dateToEpoch(p.date); + p.date = utils.date.dateToEpoch(p.date); p.save() .then(() => { res.json(p); }) .catch((e) => { - console.log(e); + console.error(e); res.status(500).send("Error creating post"); }); } else { @@ -50,8 +50,8 @@ postRoutes.route('/delete').post((req, res) => { res.status(401).send("Missing body"); return; } - utils.checkSession(req.body.userId, req.body.sessionId, (isValidId) => { - utils.isAdmin(req.body.userId, (isAdmin) => { + utils.account.checkSession(req.body.userId, req.body.sessionId, (isValidId) => { + utils.account.isAdmin(req.body.userId, (isAdmin) => { if (isValidId && isAdmin) { Post.findByIdAndDelete(req.body._id, (err, r) => { if (err) { @@ -79,8 +79,8 @@ postRoutes.route('/edit').post((req, res) => { res.status(401).send("Missing body"); return; } - utils.checkSession(req.body.userId, req.body.sessionId, (isValidId) => { - utils.isAdmin(req.body.userId, (isAdmin) => { + utils.account.checkSession(req.body.userId, req.body.sessionId, (isValidId) => { + utils.account.isAdmin(req.body.userId, (isAdmin) => { if (isValidId && isAdmin) { Post.findById(req.body._id, (err, r) => { if (err) { @@ -92,7 +92,7 @@ postRoutes.route('/edit').post((req, res) => { res.json(r); }) .catch((e) => { - console.log(e); + console.error(e); res.status(500).send("Error creating post"); }); res.status(200).send("Edited post"); @@ -114,7 +114,7 @@ postRoutes.route('/edit').post((req, res) => { postRoutes.route('/id').post((req, res) => { Post.findById(req.body._id, (err, post) => { if (err) { - console.log(err); + console.error(err); res.status(500).send("Error getting posts"); return; } @@ -129,10 +129,10 @@ postRoutes.route('/id').post((req, res) => { */ postRoutes.route('/date').post((req, res) => { let d = new Date(req.body.date); - d = utils.dateToEpoch(d); + d = utils.date.dateToEpoch(d); Post.find({ date: d}, (err, post) => { if (err) { - console.log(err); + console.error(err); res.status(500).send("Error getting posts"); return; } @@ -149,7 +149,7 @@ postRoutes.route('/date').post((req, res) => { postRoutes.route('/all').get((req, res) => { Post.find({}, (err, postArr) => { if (err) { - console.log(err); + console.error(err); res.status(500).send("Error getting posts"); return; } @@ -165,10 +165,10 @@ postRoutes.route('/all').get((req, res) => { */ postRoutes.route('/today').get((req, res) => { let date = new Date(); - date = utils.dateToEpoch(date); + date = utils.date.dateToEpoch(date); Post.find({ date: date }, (err, postArr) => { if (err) { - console.log(err); + console.error(err); res.status(500).send("Error getting posts"); return; } diff --git a/user.route.js b/routes/user.route.js similarity index 93% rename from user.route.js rename to routes/user.route.js index 877d275..68b559f 100644 --- a/user.route.js +++ b/routes/user.route.js @@ -1,4 +1,4 @@ -const utils = require('./utils'); +const utils = require('../utils/utils'); const express = require('express'); const bcrypt = require('bcrypt'); const userRoutes = express.Router(); @@ -6,9 +6,9 @@ const userRoutes = express.Router(); const saltRounds = 10; const sessionLength = 25; -let Session = require('./session.model'); -let User = require('./user.model'); -let Post = require('./post.model'); +let Session = require('../schema/session.model'); +let User = require('../schema/user.model'); +let Post = require('../schema/post.model'); /* POST - /user/create @@ -155,7 +155,7 @@ userRoutes.route('/logout').post((req, res) => { 401 - Unauthorized */ userRoutes.route('/favorite/add').post((req, res) => { - utils.checkSession(req.body.userId, req.body.sessionId, valid => { + utils.account.checkSession(req.body.userId, req.body.sessionId, valid => { if (valid) { User.findById(req.body.userId, (err, user) => { if (err) { @@ -186,7 +186,7 @@ userRoutes.route('/favorite/add').post((req, res) => { 401 - Unauthorized */ userRoutes.route('/favorite/remove').post((req, res) => { - utils.checkSession(req.body.userId, req.body.sessionId, valid => { + utils.account.checkSession(req.body.userId, req.body.sessionId, valid => { if (valid) { User.findById(req.body.userId, (err, user) => { if (err) { @@ -194,7 +194,7 @@ userRoutes.route('/favorite/remove').post((req, res) => { res.status(500).send("Error removing article"); return; } - user.favorites = utils.removeValue(user.favorites, req.body.articleId); + user.favorites = utils.array.removeValue(user.favorites, req.body.articleId); user.save() .then(() => { res.status(201).send("Success removing article"); @@ -217,7 +217,7 @@ userRoutes.route('/favorite/remove').post((req, res) => { 401 - Unauthorized */ userRoutes.route('/favorite/get').post((req, res) => { - utils.checkSession(req.body.userId, req.body.sessionId, valid => { + utils.account.checkSession(req.body.userId, req.body.sessionId, valid => { if (valid) { User.findById(req.body.userId, (err, user) => { if (err) { @@ -225,7 +225,6 @@ userRoutes.route('/favorite/get').post((req, res) => { res.status(500).send("Error removing article"); return; } - console.log(user.favorites); Post.find({ '_id': { $in: user.favorites } }, (err, postArray) => { res.json(postArray); }) diff --git a/category.model.js b/schema/category.model.js similarity index 100% rename from category.model.js rename to schema/category.model.js diff --git a/message.model.js b/schema/message.model.js similarity index 100% rename from message.model.js rename to schema/message.model.js diff --git a/post.model.js b/schema/post.model.js similarity index 100% rename from post.model.js rename to schema/post.model.js diff --git a/session.model.js b/schema/session.model.js similarity index 100% rename from session.model.js rename to schema/session.model.js diff --git a/user.model.js b/schema/user.model.js similarity index 100% rename from user.model.js rename to schema/user.model.js diff --git a/utils/account.js b/utils/account.js new file mode 100644 index 0000000..0aa88db --- /dev/null +++ b/utils/account.js @@ -0,0 +1,27 @@ +let User = require('../schema/user.model'); +let Session = require('../schema/session.model'); + +// checkSession(userId, sessionId) checks if the sessionId is valid for the user +const checkSession = (userId, sessionId, f) => { + Session.find({ userId: userId, sessionId: sessionId }, (err, res) => { + if (res) { + f(true); + return; + } + f(false); + }); +} + +// isAdmin(userId) checks if the user with userId is an administrator +const isAdmin = (userId, f) => { + User.findById(userId, (err, res) => { + if (res.permission == 1) { + f(true); + return; + } + f(false); + }) +} + +module.exports.checkSession = checkSession; +module.exports.isAdmin = isAdmin; diff --git a/utils/array.js b/utils/array.js new file mode 100644 index 0000000..2ec0a40 --- /dev/null +++ b/utils/array.js @@ -0,0 +1,9 @@ +// removeValue(array, item) remove item from the array +function removeValue(array, item) { + var index = array.indexOf(item); + if (index !== -1) { + array.splice(index, 1); + } +} + +module.exports.removeValue = removeValue; \ No newline at end of file diff --git a/utils/cron.js b/utils/cron.js new file mode 100644 index 0000000..668662d --- /dev/null +++ b/utils/cron.js @@ -0,0 +1,21 @@ +const config = require('../config'); +let Session = require('../schema/session.model'); +const maxSessionLength = config.maxSessionLength; + +// purgeSessions() purge sessions that have existed for longer than maxSessionLength +const purgeSessions = () => { + console.log("Purging old sessions..."); + Session.find({}, (err, arr) => { + for (let i = 0; i < arr.length; i++) { + let timeDifference = new Date().getTime() - arr[i].date; + let dayDifference = timeDifference / (1000 * 3600 * 24); + if (dayDifference > maxSessionLength) { + arr[i].delete().catch(e => { + console.log(e); + }); + } + } + }); +} + +module.exports.purgeSessions = purgeSessions; \ No newline at end of file diff --git a/utils/date.js b/utils/date.js new file mode 100644 index 0000000..5e83b11 --- /dev/null +++ b/utils/date.js @@ -0,0 +1,13 @@ +// dateToEpoch(date) change the time of the date object to epoch +function dateToEpoch(d) { + console.log(d); + if (d) { + // When comparing js dates, the timezone does not matter + // ex. May 17 EDT == May 17 GMT, May 17 EDT != May 18 GMT + return d.setHours(0, 0, 0, 0); + } else { + return null; + } +} + +module.exports.dateToEpoch = dateToEpoch; \ No newline at end of file diff --git a/utils.js b/utils/mail.js similarity index 56% rename from utils.js rename to utils/mail.js index 53181f3..19d2999 100644 --- a/utils.js +++ b/utils/mail.js @@ -1,26 +1,7 @@ const fs = require('fs'); const nodemailer = require("nodemailer"); -var config = require('./config'); -let User = require('./user.model'); -let Session = require('./session.model'); -let Message = require('./message.model'); -var maxSessionLength = config.maxSessionLength; - -// purgeSessions() purge sessions that have existed for longer than maxSessionLength -const purgeSessions = () => { - console.log("Purging old sessions..."); - Session.find({}, (err, arr) => { - for (let i = 0; i < arr.length; i++) { - let timeDifference = new Date().getTime() - arr[i].date; - let dayDifference = timeDifference / (1000 * 3600 * 24); - if (dayDifference > maxSessionLength) { - arr[i].delete().catch(e => { - console.log(e); - }); - } - } - }); -} +const config = require('../config'); +let Message = require('../schema/message.model'); // loadDefaultTemplates() load the default email templates into the database // if no template exists for that name @@ -98,53 +79,5 @@ const sendMail = async (user, message, replacements) => { }) } - -// checkSession(userId, sessionId) checks if the sessionId is valid for the user -const checkSession = (userId, sessionId, f) => { - Session.find({ userId: userId, sessionId: sessionId }, (err, res) => { - if (res) { - f(true); - return; - } - f(false); - }); -} - -// isAdmin(userId) checks if the user with userId is an administrator -const isAdmin = (userId, f) => { - User.findById(userId, (err, res) => { - if (res.permission == 1) { - f(true); - return; - } - f(false); - }) -} - -// dateToEpoch(date) change the time of the date object to epoch -function dateToEpoch(d) { - console.log(d); - if (d) { - // When comparing js dates, the timezone does not matter - // ex. May 17 EDT == May 17 GMT, May 17 EDT != May 18 GMT - return d.setHours(0, 0, 0, 0); - } else { - return null; - } -} - -// removeValue(array, item) remove item from the array -function removeValue(array, item) { - var index = array.indexOf(item); - if (index !== -1) { - array.splice(index, 1); - } -} - -module.exports.purgeSessions = purgeSessions; module.exports.loadDefaultTemplates = loadDefaultTemplates; -module.exports.sendMail = sendMail; -module.exports.checkSession = checkSession; -module.exports.isAdmin = isAdmin; -module.exports.dateToEpoch = dateToEpoch; -module.exports.removeValue = removeValue; +module.exports.sendMail = sendMail; \ No newline at end of file diff --git a/utils/utils.js b/utils/utils.js new file mode 100644 index 0000000..dcdb1cf --- /dev/null +++ b/utils/utils.js @@ -0,0 +1,11 @@ +const account = require('./account'); +const array = require('./array'); +const cron = require('./cron'); +const date = require('./date'); +const mail = require('./mail'); + +module.exports.account = account; +module.exports.array = array; +module.exports.cron = cron; +module.exports.date = date; +module.exports.mail = mail;