From e52ccfdfd845134f971c61c57cd39fa288ecaf86 Mon Sep 17 00:00:00 2001 From: RedDucks Date: Fri, 23 Nov 2018 23:41:09 -0500 Subject: [PATCH] Added morgan, removed body-parser, misc changes Added morgan for some route debugging. Removed body-parser since it's built into express now. Made some error returns more clear and modern-ized some random snippets --- helpers/api.js | 24 ++++--- package-lock.json | 107 ++++++++--------------------- package.json | 6 +- routes/admin.js | 166 +++++++++++++++++++++++++-------------------- routes/blog.js | 65 +++++++++++------- routes/contact.js | 22 +++--- routes/home.js | 8 +-- routes/pnid.js | 53 +++++++-------- routes/progress.js | 23 ++++--- server.js | 19 +++--- 10 files changed, 244 insertions(+), 249 deletions(-) diff --git a/helpers/api.js b/helpers/api.js index 4b939c1..1014485 100644 --- a/helpers/api.js +++ b/helpers/api.js @@ -6,8 +6,8 @@ common api returns */ // use for any api return. it has basic layout used for every return. -function sendReturn(res, data, errors) { - res.status(200).json( +function sendReturn(response, data, errors) { + response.status(200).json( // combine 2 objects Object.assign({ code: 200, @@ -17,10 +17,14 @@ function sendReturn(res, data, errors) { ); } +// shows 404 template. takes express response object +function send404(res) { + res.status(404).send('404'); +} // use if api endpoint doesnt exist -function sendApi404(res) { - res.status(404).json({ +function sendApi404(response) { + response.status(404).json({ code: 404, errors: [ 'Endpoint not in use' @@ -29,8 +33,8 @@ function sendApi404(res) { } // use if not logged in and is required (handled with middleware) -function sendApiAuthError(res) { - res.status(401).json({ +function sendApiAuthError(response) { + response.status(401).json({ code: 401, errors: [ 'Not authenticated' @@ -39,8 +43,8 @@ function sendApiAuthError(res) { } // use for completely broken requests -function sendApiGenericError(res) { - res.status(400).json({ +function sendApiGenericError(response) { + response.status(400).json({ code: 400, success: false, errors: [ @@ -50,8 +54,8 @@ function sendApiGenericError(res) { } // use for any api not successfull -function sendApiError(res, code, errors) { - res.status(code).json({ +function sendApiError(response, code, errors) { + response.status(code).json({ code, success: false, errors diff --git a/package-lock.json b/package-lock.json index d88cd8c..2d0e309 100644 --- a/package-lock.json +++ b/package-lock.json @@ -279,6 +279,21 @@ } } }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, "bcrypt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-3.0.1.tgz", @@ -720,46 +735,6 @@ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" }, - "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", - "requires": { - "bytes": "3.0.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", - "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" - }, - "dependencies": { - "http-errors": { - "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - } - } - }, "boxen": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", @@ -2621,14 +2596,6 @@ } } }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -3299,6 +3266,18 @@ "lodash.get": "^4.0.2" } }, + "morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "requires": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + } + }, "mpath": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.5.1.tgz", @@ -3817,35 +3796,6 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, - "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", - "unpipe": "1.0.0" - }, - "dependencies": { - "http-errors": { - "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - } - } - }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -4081,7 +4031,8 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "saslprep": { "version": "1.0.2", diff --git a/package.json b/package.json index 51662ad..fc69db2 100644 --- a/package.json +++ b/package.json @@ -10,13 +10,12 @@ }, "author": "The Pretendo Network (@PretendoNetwork)", "authors": [ - "@superwhiskers", - "@lukeeey" + "@mrjvs", + "@jip" ], "license": "ISC", "dependencies": { "bcrypt": "^3.0.1", - "body-parser": "^1.18.3", "colors": "^1.1.2", "connect-mongo": "^2.0.1", "express": "^4.16.2", @@ -27,6 +26,7 @@ "moment": "^2.22.2", "mongoose": "^5.3.2", "mongoose-unique-validator": "^2.0.2", + "morgan": "^1.9.1", "passport": "^0.4.0", "passport-local": "^1.0.0", "python-struct": "^1.0.6", diff --git a/routes/admin.js b/routes/admin.js index 4630c2f..a539f46 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -19,8 +19,8 @@ const postAuthor = require('../models/post-author'); const progressList = require('../models/progress-list'); // renders admin.hbs -router.get('/admin', (req, res) => { - res.render('admin', { +router.get('/admin', (request, response) => { + response.render('admin', { title: 'Pretendo | Admin', }); }); @@ -44,9 +44,10 @@ router.get('/admin', (req, res) => { */ // TODO make login somehow display errors in correct format. // middleware does the authentication work. this just returns a success -router.post('/admin/api/v1/login', passport.authenticate('adminUserStrategy'), function (req, res) { - const user = req.user; - apiHelper.sendReturn(res, { +router.post('/admin/api/v1/login', passport.authenticate('adminUserStrategy'), (request, response) => { + const user = request.user; + + return apiHelper.sendReturn(response, { username: user.username, locale: user.getLocale(), // calls 'utilHelper.getLocale(user.region, user.language)' maybe? role: user.role ? user.role : undefined @@ -71,14 +72,13 @@ router.post('/admin/api/v1/login', passport.authenticate('adminUserStrategy'), f * errors: Strings[messages] * } */ -router.post('/admin/api/v1/register', userMiddleware.adminAuthNeeded, (req, res) => { - if (!req.body) { +router.post('/admin/api/v1/register', userMiddleware.adminAuthNeeded, (request, response) => { + if (!request.body) { // no post body - apiHelper.sendApiGenericError(res); - return; + return apiHelper.sendApiGenericError(response); } - const { username, password } = req.body; + const { username, password } = request.body; const newUser = new adminUser.adminUserModel({ username, password @@ -86,15 +86,13 @@ router.post('/admin/api/v1/register', userMiddleware.adminAuthNeeded, (req, res) // saving to database newUser.save().then((user) => { - apiHelper.sendReturn(res, { + return apiHelper.sendReturn(response, { username: user.username, role: user.role ? user.role : undefined }); - return; }).catch((rejection) => { // TODO format exception so it doesnt have a huge list of errors - apiHelper.sendApiError(res, 500, [rejection]); - return; + return apiHelper.sendApiError(response, 500, [rejection]); }); }); @@ -113,18 +111,19 @@ router.post('/admin/api/v1/register', userMiddleware.adminAuthNeeded, (req, res) * errors: Strings[messages] * } */ -router.post('/admin/api/v1/removeadmin', userMiddleware.adminAuthNeeded, (req, res) => { - if (!req.body) { +router.post('/admin/api/v1/removeadmin', userMiddleware.adminAuthNeeded, (request, response) => { + if (!request.body) { // no post body - apiHelper.sendApiGenericError(res); - return; + return apiHelper.sendApiGenericError(response); } - const { id } = req.body; - adminUser.adminUserModel.findByIdAndDelete(id, (err) => { - if (err) return apiHelper.sendApiError(res, 500, [err]); + const { id } = request.body; + adminUser.adminUserModel.findByIdAndDelete(id, (error) => { + if (error) { + return apiHelper.sendApiError(response, 500, [error]); + } // successfull - apiHelper.sendReturn(res, {}); + return apiHelper.sendReturn(response, {}); }); }); @@ -140,10 +139,12 @@ router.post('/admin/api/v1/removeadmin', userMiddleware.adminAuthNeeded, (req, r * errors: Strings[messages] * } */ -router.get('/admin/api/v1/listadmins', userMiddleware.adminAuthNeeded, (req, res) => { - adminUser.adminUserModel.find({}, (err, admins) => { +router.get('/admin/api/v1/listadmins', userMiddleware.adminAuthNeeded, (request, response) => { + adminUser.adminUserModel.find({}, (error, admins) => { // TODO format exception so it doesnt have a huge list of errors - if (err) return apiHelper.sendApiError(res, 500, [err]); + if (error) { + return apiHelper.sendApiError(response, 500, [error]); + } // formats admin list and removes password hash const output = []; @@ -152,7 +153,7 @@ router.get('/admin/api/v1/listadmins', userMiddleware.adminAuthNeeded, (req, res output.push(admins[i]); } - apiHelper.sendReturn(res, { + return apiHelper.sendReturn(response, { admins: output }); }); @@ -171,10 +172,12 @@ router.get('/admin/api/v1/listadmins', userMiddleware.adminAuthNeeded, (req, res * errors: Strings[messages] * } */ -router.get('/admin/api/v1/check', userMiddleware.authOptional, (req, res) => { - apiHelper.sendReturn(res, { - isAuthed: req.user ? true : false, - role: req.user ? (req.user.role ? req.user.role : undefined) : undefined +router.get('/admin/api/v1/check', userMiddleware.authOptional, (request, response) => { + const user = request.user; + + return apiHelper.sendReturn(response, { + isAuthed: user ? true : false, + role: user ? (user.role ? user.role : undefined) : undefined }); }); @@ -189,9 +192,9 @@ router.get('/admin/api/v1/check', userMiddleware.authOptional, (req, res) => { * errors: Strings[messages] * } */ -router.get('/admin/api/v1/logout', userMiddleware.adminAuthNeeded, (req, res) => { - req.logout(); - apiHelper.sendReturn(res, {}); +router.get('/admin/api/v1/logout', userMiddleware.adminAuthNeeded, (request, response) => { + request.logout(); + return apiHelper.sendReturn(response, {}); }); /* @@ -214,11 +217,13 @@ router.get('/admin/api/v1/logout', userMiddleware.adminAuthNeeded, (req, res) => * errors: Strings[messages] * } */ -router.post('/admin/api/v1/newpost', userMiddleware.adminAuthNeeded, function (req, res) { +router.post('/admin/api/v1/newpost', userMiddleware.adminAuthNeeded, (request, response) => { - if (!req.body) return apiHelper.sendApiGenericError(res); + if (!request.body) { + return apiHelper.sendApiGenericError(response); + } - const { content, title, author, category, short } = req.body; + const { content, title, author, category, short } = request.body; const newBlogPost = new blogPost.blogPostModel({ content: blogPost.blogPostModel.markdownToHtml(content), name: title, @@ -236,13 +241,12 @@ router.post('/admin/api/v1/newpost', userMiddleware.adminAuthNeeded, function (r // saving post to database newBlogPost.save().then((post) => { - apiHelper.sendReturn(res, { + return apiHelper.sendReturn(response, { url: moment(post.meta.date).format('YYYY-MM-DD') + '/' + post.meta.slug }); }).catch((rejection) => { // TODO format exception so it doesnt have a huge list of errors - apiHelper.sendApiError(res, 500, [rejection]); - return; + return apiHelper.sendApiError(response, 500, [rejection]); }); }); @@ -266,21 +270,25 @@ router.post('/admin/api/v1/newpost', userMiddleware.adminAuthNeeded, function (r * errors: Strings[messages] * } */ -router.post('/admin/api/v1/editpost', userMiddleware.adminAuthNeeded, function (req, res) { +router.post('/admin/api/v1/editpost', userMiddleware.adminAuthNeeded, (request, response) => { - if (!req.body) return apiHelper.sendApiGenericError(res); + if (!request.body) { + return apiHelper.sendApiGenericError(response); + } - const { id, content, title, author, category, short } = req.body; + const { id, content, title, author, category, short } = request.body; blogPost.blogPostModel.findByIdAndUpdate(id, { 'content': content, 'name': title, 'short': short, 'meta.author': author, 'meta.category': category - }, (err, post) => { - if (err) return apiHelper.sendApiError(res, 500, [err]); + }, (error, post) => { + if (error) { + return apiHelper.sendApiError(response, 500, [error]); + } - apiHelper.sendReturn(res, { + return apiHelper.sendReturn(response, { url: moment(post.meta.date, 'YYYY-MM-DD') + '/' + post.meta.slug }); }); @@ -303,11 +311,13 @@ router.post('/admin/api/v1/editpost', userMiddleware.adminAuthNeeded, function ( * errors: Strings[messages] * } */ -router.post('/admin/api/v1/newauthor', userMiddleware.adminAuthNeeded, function (req, res) { +router.post('/admin/api/v1/newauthor', userMiddleware.adminAuthNeeded, (request, response) => { - if (!req.body) return apiHelper.sendApiGenericError(res); + if (!request.body) { + return apiHelper.sendApiGenericError(response); + } - const { name, description, image } = req.body; + const { name, description, image } = request.body; const newAuthor = new postAuthor.postAuthorModel({ name, description, @@ -316,13 +326,12 @@ router.post('/admin/api/v1/newauthor', userMiddleware.adminAuthNeeded, function // saving author to database newAuthor.save().then((author) => { - apiHelper.sendReturn(res, { + return apiHelper.sendReturn(response, { id: author.id }); }).catch((rejection) => { // TODO format exception so it doesnt have a huge list of errors - apiHelper.sendApiError(res, 500, [rejection]); - return; + return apiHelper.sendApiError(response, 500, [rejection]); }); }); @@ -344,21 +353,26 @@ router.post('/admin/api/v1/newauthor', userMiddleware.adminAuthNeeded, function * errors: Strings[messages] * } */ -router.post('/admin/api/v1/editauthor', userMiddleware.adminAuthNeeded, function (req, res) { +router.post('/admin/api/v1/editauthor', userMiddleware.adminAuthNeeded, (request, response) => { - if (!req.body) return apiHelper.sendApiGenericError(res); + if (!request.body) { + return apiHelper.sendApiGenericError(response); + } - const { id, name, description, image } = req.body; + const { id, name, description, image } = request.body; // updating author in database postAuthor.postAuthorModel.findByIdAndUpdate(id, { name, description, image - }, (err, author) => { + }, (error, author) => { // TODO format exception so it doesnt have a huge list of errors - if (err) return apiHelper.sendApiError(res, 500, [err]); - apiHelper.sendReturn(res, { + if (error) { + return apiHelper.sendApiError(response, 500, [error]); + } + + return apiHelper.sendReturn(response, { id: author.id }); }); @@ -381,13 +395,15 @@ router.post('/admin/api/v1/editauthor', userMiddleware.adminAuthNeeded, function * errors: Strings[messages] * } */ -router.post('/admin/api/v1/newprogress', userMiddleware.adminAuthNeeded, function (req, res) { +router.post('/admin/api/v1/newprogress', userMiddleware.adminAuthNeeded, (request, response) => { - if (!req.body) return apiHelper.sendApiGenericError(res); + if (!request.body) { + return apiHelper.sendApiGenericError(response); + } // parses state and isGame to be valid - const { title, description } = req.body; - let { state } = req.body; + const { title, description } = request.body; + let { state } = request.body; let isGame = false; if (state != '1' && state != '2' && state != '3') { state = undefined; @@ -405,13 +421,12 @@ router.post('/admin/api/v1/newprogress', userMiddleware.adminAuthNeeded, functio // saving progress to database newProgress.save().then((progress) => { - apiHelper.sendReturn(res, { + return apiHelper.sendReturn(response, { id: progress.id }); }).catch((rejection) => { // TODO format exception so it doesnt have a huge list of errors - apiHelper.sendApiError(res, 500, [rejection]); - return; + return apiHelper.sendApiError(response, 500, [rejection]); }); }); @@ -433,13 +448,15 @@ router.post('/admin/api/v1/newprogress', userMiddleware.adminAuthNeeded, functio * errors: Strings[messages] * } */ -router.post('/admin/api/v1/editprogress', userMiddleware.adminAuthNeeded, function (req, res) { +router.post('/admin/api/v1/editprogress', userMiddleware.adminAuthNeeded, (request, response) => { - if (!req.body) return apiHelper.sendApiGenericError(res); + if (!request.body) { + return apiHelper.sendApiGenericError(response); + } // parsing state and isGame to be valid - const { title, description, id } = req.body; - let { state } = req.body; + const { title, description, id } = request.body; + let { state } = request.body; let isGame = false; if (state != '1' && state != '2' && state != '3') { state = undefined; @@ -454,18 +471,21 @@ router.post('/admin/api/v1/editprogress', userMiddleware.adminAuthNeeded, functi description, state, isGame - }, (err, progress) => { + }, (error, progress) => { // TODO format exception so it doesnt have a huge list of errors - if (err) return apiHelper.sendApiError(res, 500, [err]); - apiHelper.sendReturn(res, { + if (error) { + return apiHelper.sendApiError(response, 500, [error]); + } + + return apiHelper.sendReturn(response, { id: progress.id }); }); }); // api 404 -router.use('/admin/api', (req, res) => { - apiHelper.sendApi404(res); +router.use('/admin/api', (request, response) => { + return apiHelper.sendApi404(response); }); // export the router diff --git a/routes/blog.js b/routes/blog.js index d2b324b..9708d44 100644 --- a/routes/blog.js +++ b/routes/blog.js @@ -14,40 +14,47 @@ const blogPostModel = require('../models/blog-post').blogPostModel; const postAuthorModel = require('../models/post-author').postAuthorModel; // display single blog post -router.get('/news/:date/:title', (req, res) => { +router.get('/news/:date/:title', (request, response) => { + const date = request.params.date; + const title = request.params.title; + const title_lower = title.toLowerCase(); + // date format YYYY-MM-DD - if (/[0-9]{4}-[0-9]{2}-[0-9]{2}/.test(req.params.date) && /([a-z]|[0-9]|-)+/.test(req.params.title.toLowerCase())) { + if (/[0-9]{4}-[0-9]{2}-[0-9]{2}/.test(date) && /([a-z]|[0-9]|-)+/.test(title_lower)) { // params are correct format - blogPostModel.getPost(moment(req.params.date), req.params.title.toLowerCase(), (err, post) => { + blogPostModel.getPost(moment(date), title_lower, (error, post) => { // error exists or no post exists with the date and name - if (err || !post) { - console.log('error: ' + err + ' and post: ' + post); - return utilHelper.send404(res); + if (error || !post) { + console.warn(`'error: ${error} and post: ${post}`); + return utilHelper.send404(response); } // render blogpost - post.postTemplate((err, postTemplate) => { - if (err) return utilHelper.send404(res); - res.render('post', { - title: req.params.title, + post.postTemplate((error, postTemplate) => { + if (error) { + return utilHelper.send404(response); + } + + return response.render('post', { + title, post: postTemplate, - user: utilHelper.templateReadyUser(req), + user: utilHelper.templateReadyUser(request), locale: utilHelper.getLocale('US', 'en') }); }); }); } else { // params are incorrect - utilHelper.send404(res); + return utilHelper.send404(response); } }); // display latest blogposts -router.get('/news', (req, res) => { +router.get('/news', (request, response) => { // sort blogposts on date descending - blogPostModel.find({}).sort({'meta.date': 'desc'}).exec(function(err, posts) { - if (err || !posts) { - return utilHelper.send404(res); + blogPostModel.find({}).sort({'meta.date': 'desc'}).exec((error, posts) => { + if (error || !posts) { + return utilHelper.send404(response); } // makes posts template ready @@ -56,10 +63,10 @@ router.get('/news', (req, res) => { postCollection.push(posts[i].postShortTemplate()); } - res.render('post-collection', { + return response.render('post-collection', { title: 'Pretendo | News', posts: postCollection, - user: utilHelper.templateReadyUser(req), + user: utilHelper.templateReadyUser(request), locale: utilHelper.getLocale('US', 'en'), page: 'news' }); @@ -78,11 +85,14 @@ router.get('/news', (req, res) => { * errors: Strings[messages] * } */ -router.get('/api/v1/listauthors', function (req, res) { - postAuthorModel.find({}, (err, authors) => { +router.get('/api/v1/listauthors', (request, response) => { + postAuthorModel.find({}, (error, authors) => { // TODO format exception so it doesnt have a huge list of errors - if (err) return apiHelper.sendApiError(res, 500, [err]); - apiHelper.sendReturn(res, { + if (error) { + return apiHelper.sendApiError(response, 500, [error]); + } + + return apiHelper.sendReturn(response, { authorList: authors }); }); @@ -100,11 +110,14 @@ router.get('/api/v1/listauthors', function (req, res) { * errors: Strings[messages] * } */ -router.get('/api/v1/listblog', function (req, res) { - blogPostModel.find({}, (err, posts) => { +router.get('/api/v1/listblog', (request, response) => { + blogPostModel.find({}, (error, posts) => { // TODO format exception so it doesnt have a huge list of errors - if (err) return apiHelper.sendApiError(res, 500, [err]); - apiHelper.sendReturn(res, { + if (error) { + return apiHelper.sendApiError(response, 500, [error]); + } + + apiHelper.sendReturn(response, { postList: posts }); }); diff --git a/routes/contact.js b/routes/contact.js index b1127d3..8871bea 100644 --- a/routes/contact.js +++ b/routes/contact.js @@ -13,10 +13,10 @@ const config = require('../config.json'); const https = require('https'); // display contact page -router.get('/contact', (req, res) => { - res.render('contact', { +router.get('/contact', (request, response) => { + return response.render('contact', { title: 'Pretendo | Contact', - user: utilHelper.templateReadyUser(req), + user: utilHelper.templateReadyUser(request), locale: utilHelper.getLocale('US', 'en'), page: 'contact' }); @@ -38,8 +38,10 @@ router.get('/contact', (req, res) => { * errors: Strings[messages] * } */ -router.post('/api/v1/sendmessage', function (req, res) { - if (!req.body) return apiHelper.sendApiGenericError(res); +router.post('/api/v1/sendmessage', (req, response) => { + if (!req.body) { + return apiHelper.sendApiGenericError(response); + } const { email, subject, message } = req.body; @@ -62,13 +64,13 @@ router.post('/api/v1/sendmessage', function (req, res) { } }, () => { // sends success - apiHelper.sendReturn(res, {}); + return apiHelper.sendReturn(response, {}); }); // error handling - request.on('error', (e) => { - apiHelper.sendApiGenericError(res); - console.log('request errored' + e); + request.on('error', (error) => { + console.warn('request errored' + error); + return apiHelper.sendApiGenericError(response); }); // write post data to request @@ -76,7 +78,7 @@ router.post('/api/v1/sendmessage', function (req, res) { request.end(); } else { // TODO give more detailed response - return apiHelper.sendApiGenericError(res); + return apiHelper.sendApiGenericError(response); } }); diff --git a/routes/home.js b/routes/home.js index 4180e30..a8bd580 100644 --- a/routes/home.js +++ b/routes/home.js @@ -12,12 +12,12 @@ const utilHelper = require('../helpers/util'); const blogPostModel = require('../models/blog-post').blogPostModel; // display home page -router.get('/', (req, res) => { +router.get('/', (request, response) => { // needs callback because mongoose is inconsistent - blogPostModel.latestPostsShortTemlate(2, (err, result) => { - res.render('home', { + blogPostModel.latestPostsShortTemlate(2, (error, result) => { + return response.render('home', { title: 'Pretendo | Home', - user: utilHelper.templateReadyUser(req), + user: utilHelper.templateReadyUser(request), locale: utilHelper.getLocale('US', 'en'), posts: result, page: 'home' diff --git a/routes/pnid.js b/routes/pnid.js index 2d70c43..98090b1 100644 --- a/routes/pnid.js +++ b/routes/pnid.js @@ -19,31 +19,31 @@ const recaptcha = new Recaptcha(config.recaptcha.siteKey, config.recaptcha.secre const PNID = require('../models/pnid'); // renders register page -router.get('/pnid/register', recaptcha.middleware.render, (req, res) => { - res.render('register', { +router.get('/pnid/register', recaptcha.middleware.render, (request, response) => { + return response.render('register', { title: 'Pretendo | Register', - captcha: res.recaptcha, + captcha: response.recaptcha, locale: utilHelper.getLocale('US', 'en') }); }); // renders login page -router.get('/pnid/login', (req, res) => { - res.render('login', { +router.get('/pnid/login', (request, response) => { + return response.render('login', { title: 'Pretendo | Login', locale: utilHelper.getLocale('US', 'en') }); }); // logout -router.get('/pnid/logout', userMiddleware.pnidAuthNeeded, (req, res) => { - req.logout(); - res.redirect('/'); +router.get('/pnid/logout', userMiddleware.pnidAuthNeeded, (request, response) => { + request.logout(); + return response.redirect('/'); }); // renders pnid dashboard -router.get('/pnid/dashboard', userMiddleware.pnidAuthNeeded, (req, res) => { - res.render('dashboard', { +router.get('/pnid/dashboard', userMiddleware.pnidAuthNeeded, (request, response) => { + return response.render('dashboard', { title: 'Pretendo | Dash', locale: utilHelper.getLocale('US', 'en'), - user: utilHelper.templateReadyUser(req) + user: utilHelper.templateReadyUser(request) }); }); @@ -66,11 +66,11 @@ router.get('/pnid/dashboard', userMiddleware.pnidAuthNeeded, (req, res) => { */ // TODO make login somehow display errors in correct format. // middleware does the authentication work. this just returns a success -router.post('/api/v1/login', passport.authenticate('PNIDStrategy'), function (req, res) { - apiHelper.sendReturn(res, { - email: req.user.email, - email_validated: req.user.email_validated, - pnid: req.user.pnid.key +router.post('/api/v1/login', passport.authenticate('PNIDStrategy'), function (request, response) { + return apiHelper.sendReturn(response, { + email: request.user.email, + email_validated: request.user.email_validated, + pnid: request.user.pnid.key }); }); @@ -90,18 +90,17 @@ router.post('/api/v1/login', passport.authenticate('PNIDStrategy'), function (re * errors: Strings[messages] * } */ -router.post('/api/v1/register', recaptcha.middleware.verify, async (req, res) => { - if (!req.body) { +router.post('/api/v1/register', recaptcha.middleware.verify, async (request, response) => { + if (!request.body) { // no post body - apiHelper.sendApiGenericError(res); - return; + return apiHelper.sendApiGenericError(response); } - /*if (req.recaptcha.error) { - apiHelper.sendApiError(res, 500, ['Captcha error']); + /*if (request.recaptcha.error) { + apiHelper.sendApiError(response, 500, ['Captcha error']); return; }*/ - const { email, password } = req.body; + const { email, password } = request.body; const newUser = new PNID.PNIDModel({ email, password, @@ -115,17 +114,15 @@ router.post('/api/v1/register', recaptcha.middleware.verify, async (req, res) => // saving to database newUser.save().then((user) => { - apiHelper.sendReturn(res, { + return apiHelper.sendReturn(response, { email: user.email, email_validated: user.email_validated, pnid: user.pnid.key }); - return; }).catch((rejection) => { // TODO format exception so it doesnt have a huge list of errors - console.log(rejection); - apiHelper.sendApiError(res, 500, [rejection]); - return; + console.warn(rejection); + return apiHelper.sendApiError(response, 500, [rejection]); }); }); diff --git a/routes/progress.js b/routes/progress.js index 6f93f97..c6581e3 100644 --- a/routes/progress.js +++ b/routes/progress.js @@ -12,20 +12,22 @@ const utilHelper = require('../helpers/util'); const progressListModel = require('../models/progress-list').progressListModel; // display progress -router.get('/progress', (req, res) => { +router.get('/progress', (request, response) => { - progressListModel.find({}, (err, progress) => { - if (err) return utilHelper.send404(res); + progressListModel.find({}, (error, progress) => { + if (error) { + return utilHelper.send404(response); + } // filtering games and backend const games = progress.filter(i => i.isGame); const backends = progress.filter(i => !i.isGame); - res.render('progress', { + return response.render('progress', { title: 'Pretendo | Progress', games, backends, - user: utilHelper.templateReadyUser(req), + user: utilHelper.templateReadyUser(request), locale: utilHelper.getLocale('US', 'en'), page: 'progress' }); @@ -44,11 +46,14 @@ router.get('/progress', (req, res) => { * errors: Strings[messages] * } */ -router.get('/api/v1/listprogress', function (req, res) { - progressListModel.find({}, (err, progress) => { +router.get('/api/v1/listprogress', (request, response) => { + progressListModel.find({}, (error, progress) => { // TODO format exception so it doesnt have a huge list of errors - if (err) return apiHelper.sendApiError(res, 500, [err]); - apiHelper.sendReturn(res, { + if (error) { + return apiHelper.sendApiError(response, 500, [error]); + } + + apiHelper.sendReturn(response, { progressList: progress }); }); diff --git a/server.js b/server.js index 32381d6..b733275 100644 --- a/server.js +++ b/server.js @@ -11,7 +11,7 @@ const handlebars = require('express-handlebars'); const session = require('express-session'); const mongoStore = require('connect-mongo')(session); const mongoose = require('mongoose'); -const bodyParser = require('body-parser'); +const morgan = require('morgan'); const config = require('./config.json'); const utilHelper = require('./helpers/util'); const passportconfig = require('./passport.config.js'); @@ -29,8 +29,11 @@ connection.on('error', console.error.bind(console, 'connection error:')); // setup express const app = express(); -app.use(bodyParser.json()); -app.use(bodyParser.urlencoded({ extended: false })); +app.use(morgan('dev')); +app.use(express.json()); +app.use(express.urlencoded({ + extended: true +})); app.use(session({ secret: config.secrets.session, saveUninitialized: true, @@ -87,16 +90,16 @@ app.use('/', locations.posts); app.use('/', locations.admin); app.use('/', locations.progress); app.use('/', locations.pnid); -app.use((req, res) => { - utilHelper.send404(res); +app.use((request, response) => { + return utilHelper.send404(response); }); // TODO improve error handling // TODO remove param decoding errors from logs example: "host/test/%" // 4 parameters required to read the error, cant help the eslint error -app.use((err, req, res, next) => { // eslint-disable-line no-unused-vars - console.error(err.stack); - return res.status(500).send('Something broke!'); +app.use((error, request, response, next) => { // eslint-disable-line no-unused-vars + console.warn(error.stack); + return response.status(500).send('Something broke!'); }); // startup