From 5c5772b76df403fb3c55892cbe081f73749cd75b Mon Sep 17 00:00:00 2001 From: mrjvs Date: Sat, 13 Oct 2018 23:11:53 +0200 Subject: [PATCH] blog post posting and reading finished. now just edit, sort and delete --- helpers/common.js | 10 ++++++++- models/blog-post.js | 18 +++++++++------- routes/admin.js | 51 +++++++++++++++++++++++++++++++++++++++++++++ routes/blog.js | 15 ++++++++----- views/admin.hbs | 15 +++++++++++++ views/post.hbs | 10 ++++----- 6 files changed, 100 insertions(+), 19 deletions(-) diff --git a/helpers/common.js b/helpers/common.js index 11f55f3..6143096 100644 --- a/helpers/common.js +++ b/helpers/common.js @@ -63,11 +63,19 @@ function sendApiError(res, code, errors) { }); } +// convert date to string +function convertDateToString(date) { + return date.getUTCFullYear() + '-' + + ('0' + (date.getUTCMonth()+1)).slice(-2) + '-' + + ('0' + date.getUTCDate()).slice(-2); +} + module.exports = { sendDefault404, sendApiReturn, sendApi404, sendApiGenericError, sendApiError, - sendApiAuthError + sendApiAuthError, + convertDateToString }; \ No newline at end of file diff --git a/models/blog-post.js b/models/blog-post.js index 3d1281d..642e5e8 100644 --- a/models/blog-post.js +++ b/models/blog-post.js @@ -7,9 +7,11 @@ file containing the model file for a blog post // imports const mongoose = require('mongoose'); -const postAuthor = require('./post-author').postAuthorModel; +const common = require('../helpers/common'); +//const postAuthor = require('./post-author').postAuthorModel; const showdown = require('showdown'); const converter = new showdown.Converter(); +converter.setFlavor('github'); // admin user database layout const blogPostSchema = new mongoose.Schema({ @@ -36,7 +38,9 @@ const blogPostSchema = new mongoose.Schema({ }, date: { type: Date, - default: Date.now + default: () => { + return new Date(common.convertDateToString(new Date())); + } }, category: { type: String, @@ -54,8 +58,8 @@ blogPostSchema.methods.getBlogPostTemplateReady = function() { content: this.content, title: this.name, date: this.meta.date, - category: this.meta.category, - author: postAuthor.findById(this.meta.author).getPostAuthorTemplateReady() + category: this.meta.category/*, + author: postAuthor.findById(this.meta.author).getPostAuthorTemplateReady()*/ }; }; @@ -64,10 +68,8 @@ blogPostSchema.statics.convertMarkdownToHtml = function(markdown) { }; blogPostSchema.statics.getPost = function(date, urlTitle, callback) { return blogPostModel.findOne({ - meta: { - date, - urlTitle - } + 'meta.date': date, + 'meta.urlTitle': urlTitle }, callback); }; diff --git a/routes/admin.js b/routes/admin.js index 91de6bf..9b60c5a 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -11,6 +11,7 @@ const passport = require('passport'); const common = require('../helpers/common'); const adminUserMiddleware = require('../middleware/admin-authentication'); const adminUser = require('../models/admin-user'); +const blogPost = require('../models/blog-post'); // display admin panel router.get('/admin', (req, res) => { @@ -123,6 +124,56 @@ router.get('/admin/api/v1/logout', adminUserMiddleware.adminAuthenticationRequir common.sendApiReturn(res, {}); }); +/* +* /admin/api/v1/newpost +* +* posts a new blog post +* +* post { +* content - content of the blog post in markdown +* title - title of the blog post +* author - id of the author +* category - category name of the blog post +* +* } +* return { +* code: http code +* success: boolean - true if login succesfull +* url: string | undefined - url of the blog post if successfull +* errors: Strings[messages] +* } +*/ +router.post('/admin/api/v1/newpost', adminUserMiddleware.adminAuthenticationRequired, function (req, res) { + + if (!req.body) return common.sendApiGenericError(res); + + const { content, title, author, category } = req.body; + const newBlogPost = new blogPost.blogPostModel({ + content: blogPost.blogPostModel.convertMarkdownToHtml(content), + name: title, + meta: { + author, + category, + urlTitle: title + .trim() + .replace(/\s/g, '-') + .replace(/[^A-z0-9-]/g, '') + .toLowerCase() + } + }); + + newBlogPost.save().then((post) => { + // successfull + common.sendApiReturn(res, { + url: common.convertDateToString(post.meta.date) + '/' + post.meta.urlTitle + }); + }).catch((rejection) => { + // TODO format exception so it doesnt have a huge list of errors + common.sendApiError(res, 500, [rejection]); + return; + }); +}); + // configure api 404 router.use('/admin/api', (req, res) => { common.sendApi404(res); diff --git a/routes/blog.js b/routes/blog.js index 7575367..f80aadf 100644 --- a/routes/blog.js +++ b/routes/blog.js @@ -12,15 +12,20 @@ const blogPostModel = require('../models/blog-post').blogPostModel; // display blog post router.get('/news/:date/:title', (req, res) => { - if (/[0-9]{2}-[0-9]{2}-[0-9]{4}/.test(req.params.date) && /([a-z]|[0-9]|-)+/.test(req.params.title.toLowerCase())) { + // date format DD-MM-YYY + 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(req.params.date, req.params.title.toLowerCase(), (err, post) => { + blogPostModel.getPost(new Date(req.params.date), req.params.title.toLowerCase(), (err, post) => { // error exists or no post exists with the date and name - if (err || !post) return common.sendDefault404(res); + if (err || !post) { + console.log('error: ' + err + ' and post: ' + post); + return common.sendDefault404(res); + } // render blogpost - res.render('post', post.getBlogPostTemplateReady()); + res.render('post', { + post: post.getBlogPostTemplateReady() + }); }); } else { // params are incorrect diff --git a/views/admin.hbs b/views/admin.hbs index 1d4185f..88a4b36 100644 --- a/views/admin.hbs +++ b/views/admin.hbs @@ -20,7 +20,22 @@ +

create blog post

+
+

content

+ +

category

+ +

title

+ +

author id - yea, authors dont work yet. just ignore

+ + +
+
Check if logged in +
+ Logout {{> footer }} diff --git a/views/post.hbs b/views/post.hbs index b986f49..137c814 100644 --- a/views/post.hbs +++ b/views/post.hbs @@ -6,15 +6,15 @@ {{> navbar }}

blog post

-

{{ date }}

-

{{ category }}

+

{{ post.date }}

+

{{ post.category }}

- {{{ content }}} + {{{ post.content }}}
-

{{ author.name }} - {{ author.description }}

- + {{> footer }}