From 815e5aba03b8cfb560fe9f68372e2d174abeadac Mon Sep 17 00:00:00 2001 From: mrjvs Date: Tue, 16 Oct 2018 16:12:36 +0200 Subject: [PATCH] update comments --- helpers/api.js | 7 ++++++ helpers/util.js | 2 +- middleware/admin-authentication.js | 2 +- models/admin-user.js | 1 + models/blog-post.js | 2 ++ models/post-author.js | 1 + models/progress-list.js | 2 +- passport.config.js | 2 +- routes/admin.js | 35 ++++++++++++++++++++---------- routes/blog.js | 4 +++- routes/contact.js | 7 +++++- routes/progress.js | 1 + server.js | 1 + 13 files changed, 49 insertions(+), 18 deletions(-) diff --git a/helpers/api.js b/helpers/api.js index b98c8c6..958b321 100644 --- a/helpers/api.js +++ b/helpers/api.js @@ -1,3 +1,10 @@ +/* + +api.js - +common api returns + +*/ + // use for any api return. it has basic layout used for every return. function sendApiReturn(res, data, errors) { res.status(200).json( diff --git a/helpers/util.js b/helpers/util.js index 00e8e3d..cff7eba 100644 --- a/helpers/util.js +++ b/helpers/util.js @@ -5,7 +5,7 @@ small commonly used utilities */ -// shows 404 template. +// shows 404 template. takes express response object function sendDefault404(res) { res.status(404).send('404'); } diff --git a/middleware/admin-authentication.js b/middleware/admin-authentication.js index 160132e..85f391d 100644 --- a/middleware/admin-authentication.js +++ b/middleware/admin-authentication.js @@ -17,7 +17,7 @@ function adminAuthenticationRequired(req, res, next) { } } -// middleware to use if authentication +// middleware to use if authentication is optional function authenticationOptional(req, res, next) { return next(); } diff --git a/models/admin-user.js b/models/admin-user.js index 5240dbc..84a7127 100644 --- a/models/admin-user.js +++ b/models/admin-user.js @@ -20,6 +20,7 @@ const adminUserSchema = new mongoose.Schema({ unique: true, trim: true }, + // non hashed, gets hashed at save password: { type: String, required: [true, 'Password is required.'], diff --git a/models/blog-post.js b/models/blog-post.js index c52de36..c8ee610 100644 --- a/models/blog-post.js +++ b/models/blog-post.js @@ -21,10 +21,12 @@ const blogPostSchema = new mongoose.Schema({ required: [true, 'Content is required.'], trim: true }, + // title of blog post name: { type: String, required: [true, 'Name is required'] }, + // short description of blog post short: { type: String, required: [true, 'Short version is required'] diff --git a/models/post-author.js b/models/post-author.js index 3bb1946..66904b5 100644 --- a/models/post-author.js +++ b/models/post-author.js @@ -20,6 +20,7 @@ const postAuthorSchema = new mongoose.Schema({ required: [true, 'Description is required'], trim: true }, + // profile picture image link image: { type: String, trim: true diff --git a/models/progress-list.js b/models/progress-list.js index d8f7fc3..def6205 100644 --- a/models/progress-list.js +++ b/models/progress-list.js @@ -15,7 +15,7 @@ const progressListSchema = new mongoose.Schema({ default: 0 }, isGame: { - type: Boolean, /* true - is game list, false - is backend service */ + type: Boolean, /* true - is game, false - is backend service */ required: [true, 'isGame is required'] }, title: { diff --git a/passport.config.js b/passport.config.js index dfbbed9..782e09c 100644 --- a/passport.config.js +++ b/passport.config.js @@ -42,7 +42,7 @@ module.exports = (app) => { }); } )); - //Configuring app to have sessions + //Configuring app to have sessions, dont change since it would break everything passport.serializeUser(function(user, done) { done(null, user.id); }); diff --git a/routes/admin.js b/routes/admin.js index 0853375..1d9f9a0 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -1,7 +1,7 @@ /* admin.js - -file for handling admin panel routes +file for handling admin api. */ @@ -11,12 +11,14 @@ const passport = require('passport'); const moment = require('moment'); const apiHelper = require('../helpers/api'); const adminUserMiddleware = require('../middleware/admin-authentication'); + +// database models const adminUser = require('../models/admin-user'); const blogPost = require('../models/blog-post'); const postAuthor = require('../models/post-author'); const progressList = require('../models/progress-list'); -// display admin panel +// renders admin.hbs router.get('/admin', (req, res) => { res.render('admin'); }); @@ -27,18 +29,19 @@ router.get('/admin', (req, res) => { * signs admin user in * * post { -* username - username of admin account -* password - password of admin account +* username +* password * } * return { * code: http code -* success: boolean - true if login succesfull -* username: undefined | string - username if login was successfull +* success: boolean +* username: undefined | string - only if login was successfull * role: undefined | string - role of user if login was successfull * errors: Strings[messages] - not yet :( * } */ // 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) { apiHelper.sendApiReturn(res, { username: req.user.username, @@ -77,8 +80,8 @@ router.post('/admin/api/v1/register', adminUserMiddleware.adminAuthenticationReq password }); + // saving to database newUser.save().then(() => { - // successfull apiHelper.sendApiReturn(res, { username: req.user.username, role: req.user.role ? req.user.role : undefined @@ -108,6 +111,7 @@ router.post('/admin/api/v1/register', adminUserMiddleware.adminAuthenticationReq */ router.post('/admin/api/v1/removeadmin', adminUserMiddleware.adminAuthenticationRequired, (req, res) => { if (!req.body) { + // no post body apiHelper.sendApiGenericError(res); return; } @@ -137,11 +141,13 @@ router.get('/admin/api/v1/listadmins', adminUserMiddleware.adminAuthenticationRe // TODO format exception so it doesnt have a huge list of errors if (err) return apiHelper.sendApiError(res, 500, [err]); + // formats admin list and removes password hash const output = []; for (let i = 0, l = admins.length; i < l; i++) { admins[i].password = undefined; output.push(admins[i]); } + apiHelper.sendApiReturn(res, { admins: output }); @@ -216,7 +222,7 @@ router.post('/admin/api/v1/newpost', adminUserMiddleware.adminAuthenticationRequ meta: { author, category, - slug: title + slug: title // convert title to slug .trim() .replace(/\s/g, '-') .replace(/[^A-z0-9-]/g, '') @@ -224,8 +230,8 @@ router.post('/admin/api/v1/newpost', adminUserMiddleware.adminAuthenticationRequ } }); + // saving post to database newBlogPost.save().then((post) => { - // successfull apiHelper.sendApiReturn(res, { url: moment(post.meta.date, 'YYYY-MM-DD') + '/' + post.meta.slug }); @@ -269,6 +275,7 @@ router.post('/admin/api/v1/editpost', adminUserMiddleware.adminAuthenticationReq 'meta.category': category }, (err, post) => { if (err) return apiHelper.sendApiError(res, 500, [err]); + apiHelper.sendApiReturn(res, { url: moment(post.meta.date, 'YYYY-MM-DD') + '/' + post.meta.slug }); @@ -303,8 +310,8 @@ router.post('/admin/api/v1/newauthor', adminUserMiddleware.adminAuthenticationRe image }); + // saving author to database newAuthor.save().then((author) => { - // successfull apiHelper.sendApiReturn(res, { id: author.id }); @@ -339,6 +346,7 @@ router.post('/admin/api/v1/editauthor', adminUserMiddleware.adminAuthenticationR const { id, name, description, image } = req.body; + // updating author in database postAuthor.postAuthorModel.findByIdAndUpdate(id, { name, description, @@ -373,6 +381,7 @@ router.post('/admin/api/v1/newprogress', adminUserMiddleware.adminAuthentication if (!req.body) return apiHelper.sendApiGenericError(res); + // parses state and isGame to be valid const { title, description } = req.body; let { state } = req.body; let isGame = false; @@ -390,8 +399,8 @@ router.post('/admin/api/v1/newprogress', adminUserMiddleware.adminAuthentication state }); + // saving progress to database newProgress.save().then((progress) => { - // successfull apiHelper.sendApiReturn(res, { id: progress.id }); @@ -424,6 +433,7 @@ router.post('/admin/api/v1/editprogress', adminUserMiddleware.adminAuthenticatio if (!req.body) return apiHelper.sendApiGenericError(res); + // parsing state and isGame to be valid const { title, description, id } = req.body; let { state } = req.body; let isGame = false; @@ -434,6 +444,7 @@ router.post('/admin/api/v1/editprogress', adminUserMiddleware.adminAuthenticatio isGame = true; } + // updating progress in database progressList.progressListModel.findByIdAndUpdate(id, { title, description, @@ -448,7 +459,7 @@ router.post('/admin/api/v1/editprogress', adminUserMiddleware.adminAuthenticatio }); }); -// configure api 404 +// api 404 router.use('/admin/api', (req, res) => { apiHelper.sendApi404(res); }); diff --git a/routes/blog.js b/routes/blog.js index 273afe5..26ac65e 100644 --- a/routes/blog.js +++ b/routes/blog.js @@ -14,7 +14,7 @@ const postAuthorModel = require('../models/post-author').postAuthorModel; // display single blog post router.get('/news/:date/:title', (req, res) => { - // date format DD-MM-YYY + // 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())) { // params are correct format blogPostModel.getPost(new Date(req.params.date), req.params.title.toLowerCase(), (err, post) => { @@ -40,11 +40,13 @@ router.get('/news/:date/:title', (req, res) => { // display latest blogposts router.get('/news', (req, res) => { + // sort blogposts on date descending blogPostModel.find({}).sort({'meta.date': 'desc'}).exec(function(err, posts) { if (err || !posts) { return utilHelper.sendDefault404(res); } + // makes posts template ready const postCollection = []; for (let i = 0, l = posts.length; i < l; i++) { postCollection.push(posts[i].getBlogPostShortTemplateReady()); diff --git a/routes/contact.js b/routes/contact.js index 627e4df..ccafd45 100644 --- a/routes/contact.js +++ b/routes/contact.js @@ -35,13 +35,15 @@ router.get('/contact', (req, res) => { router.post('/api/v1/sendmessage', function (req, res) { if (!req.body) return apiHelper.sendApiGenericError(res); + const { email, subject, message } = req.body; if (email && subject && message && message.length < 2000) { - console.log('checks passed'); + // request body has everything const postData = JSON.stringify({ content: 'email: ' + email + ' \n subject: ' + subject + ' \n\n' + message }); + // request object const request = https.request({ hostname: config.contactWebhook.host, port: config.contactWebhook.port, @@ -53,14 +55,17 @@ router.post('/api/v1/sendmessage', function (req, res) { 'Content-Length': postData.length } }, () => { + // sends success apiHelper.sendApiReturn(res, {}); }); + // error handling request.on('error', (e) => { apiHelper.sendApiGenericError(res); console.log('request errored' + e); }); + // write post data to request request.write(postData); request.end(); } else { diff --git a/routes/progress.js b/routes/progress.js index 76ce1b9..860b5ee 100644 --- a/routes/progress.js +++ b/routes/progress.js @@ -18,6 +18,7 @@ router.get('/progress', (req, res) => { progressListModel.find({}, (err, progress) => { if (err) return utilHelper.sendDefault404(res); + // filtering games and backend const games = progress.filter(i => i.isGame); const backends = progress.filter(i => !i.isGame); diff --git a/server.js b/server.js index a934f94..f1ef203 100644 --- a/server.js +++ b/server.js @@ -45,6 +45,7 @@ app.use(session({ collection: 'sessions' }) })); +// setups up passportjs authentication passportconfig(app); // handlebars templating setup