diff --git a/admin/adminHome.js b/admin/adminHome.js index 42f07ab..50f565a 100644 --- a/admin/adminHome.js +++ b/admin/adminHome.js @@ -96,7 +96,7 @@ const processPost = function(postData) } else if(post.clear_cache) { - require("../sites/blog.js").clearCache(); + require("../utils/pageBuilder").clearCache(); require("../includes/includes.js").clearCache(); resolve(); } diff --git a/blog/category.js b/blog/category.js index a9eb476..68d609e 100644 --- a/blog/category.js +++ b/blog/category.js @@ -16,34 +16,26 @@ module.exports= */ main: function(requestURL, request, templateContext) { + console.log(requestURL); return new Promise(function(resolve, reject) { var page = request.query.page; - const splitURL = requestURL.split("/"); - if(splitURL.length >= 3) - { + const category = requestURL.split("/").join(""); - sql.getPostsFromCategory(splitURL[2]).then(function(posts) - { - Promise.all([blogBodyRenderer.renderBatchOfPosts(requestURL, posts, page, 5, templateContext), - require('./renderNextBar').main(requestURL, page, 5, posts.length, templateContext)]).then(function() - { - resolve(); - }); - }).catch(function() + sql.getPostsFromCategory(category).then(function(posts) + { + Promise.all([blogBodyRenderer.renderBatchOfPosts(requestURL, posts, page, 5, templateContext), + require('./renderNextBar').main(requestURL, page, 5, posts.length, templateContext)]).then(function() { - delete templateContext["posts"]; resolve(); }); - } - - else + }).catch(function() { - //page is not found but, posts list will be empty - // so 404 will display - resolve(); - } + delete templateContext["posts"]; + reject(); + }); + }); } }; \ No newline at end of file diff --git a/routes/admin/analytics.js b/routes/admin/analytics.js index 14b0e06..b2882b7 100644 --- a/routes/admin/analytics.js +++ b/routes/admin/analytics.js @@ -1,10 +1,10 @@ const routes = require('express').Router(); -const utils = require('../../utils/utils.js'); +const builder = require('../../utils/pageBuilder'); routes.get('/', (request, result) => { - utils.constructAdminPage(request, result, require("../../admin/analytics").main) + builder.constructAdminPage(request, result, require("../../admin/analytics").main) }); module.exports = routes; \ No newline at end of file diff --git a/routes/admin/downloads.js b/routes/admin/downloads.js index 73ad62b..5f335b2 100644 --- a/routes/admin/downloads.js +++ b/routes/admin/downloads.js @@ -1,15 +1,15 @@ const routes = require('express').Router(); -const utils = require('../../utils/utils.js'); +const builder = require('../../utils/pageBuilder'); routes.get('/', (request, result) => { - utils.constructAdminPage(request, result, require("../../admin/adminDownloads").main) + builder.constructAdminPage(request, result, require("../../admin/adminDownloads").main) }); routes.post('/', (request, result) => { - utils.adminPostRoute(request ,require("../../admin/adminDownloads").processPostData).then(function() + builder.adminPostRoute(request ,require("../../admin/adminDownloads").processPostData).then(function() { result.redirect('/admin/downloads'); }) diff --git a/routes/admin/index.js b/routes/admin/index.js index c0e2768..04bdc89 100644 --- a/routes/admin/index.js +++ b/routes/admin/index.js @@ -15,16 +15,16 @@ routes.use('/downloads', downloads); const users = require('./users'); routes.use('/users', users); -const utils = require('../../utils/utils.js'); +const builder = require('../../utils/pageBuilder.js'); routes.get('/', (request, result) => { - utils.constructAdminPage(request, result, require("../../admin/adminHome").main) + builder.constructAdminPage(request, result, require("../../admin/adminHome").main) }); routes.post('/', (request, result) => { - utils.adminPostRoute(request, require("../../admin/adminHome").processPostData).then(function() + builder.adminPostRoute(request, require("../../admin/adminHome").processPostData).then(function() { result.redirect("/admin"); }); @@ -32,7 +32,7 @@ routes.post('/', (request, result) => routes.get('*', (request, result) => { - utils.print404(result); + builder.print404(result); }); module.exports = routes; \ No newline at end of file diff --git a/routes/admin/login.js b/routes/admin/login.js index f57764b..65324c2 100644 --- a/routes/admin/login.js +++ b/routes/admin/login.js @@ -1,17 +1,16 @@ const routes = require('express').Router(); -const utils = require('../../utils/utils.js'); +const builder = require('../../utils/pageBuilder.js'); routes.get('/', (request, result) => { - utils.constructAdminPage(request, result, require("../../admin/adminHome").main) + builder.constructAdminPage(request, result, require("../../admin/adminHome").main) }); routes.post('/', (request, result) => { - console.log("login request"); - utils.constructAdminPage(request, result, require("../../admin/login").main) + builder.constructAdminPage(request, result, require("../../admin/login").main) }); module.exports = routes; \ No newline at end of file diff --git a/routes/admin/posts.js b/routes/admin/posts.js index 28afb3b..7699d5b 100644 --- a/routes/admin/posts.js +++ b/routes/admin/posts.js @@ -1,15 +1,15 @@ const routes = require('express').Router(); -const utils = require('../../utils/utils.js'); +const builder = require('../../utils/pageBuilder'); routes.get('/', (request, result) => { - utils.constructAdminPage(request, result, require("../../admin/posts").main) + builder.constructAdminPage(request, result, require("../../admin/posts").main) }); routes.post('/', (request, result) => { - utils.adminPostPageWithOutput(request, result ,require("../../admin/posts").processPostData) + builder.adminPostPageWithOutput(request, result ,require("../../admin/posts").processPostData) }); module.exports = routes; \ No newline at end of file diff --git a/routes/admin/users.js b/routes/admin/users.js index b9048ec..c252497 100644 --- a/routes/admin/users.js +++ b/routes/admin/users.js @@ -1,15 +1,15 @@ const routes = require('express').Router(); -const utils = require('../../utils/utils.js'); +const builder = require('../../utils/pageBuilder.js'); routes.get('/', (request, result) => { - utils.constructAdminPage(request, result, require("../../admin/users").main) + builder.constructAdminPage(request, result, require("../../admin/users").main) }); routes.post('/', (request, result) => { - utils.adminPostPageWithOutput(request, result ,require("../../admin/users").processPostData) + builder.adminPostPageWithOutput(request, result ,require("../../admin/users").processPostData) }); module.exports = routes; \ No newline at end of file diff --git a/routes/category/index.js b/routes/category/index.js index 5c68232..7339d18 100644 --- a/routes/category/index.js +++ b/routes/category/index.js @@ -1,8 +1,10 @@ const routes = require('express').Router(); -routes.get('/', (request, result) => -{ +const pageBuilder = require('../../utils/pageBuilder'); +routes.get('*', (request, result) => +{ + pageBuilder.buildBlogPage(request, result, require("../../blog/category").main) }); module.exports = routes; \ No newline at end of file diff --git a/routes/index.js b/routes/index.js index 74e0fae..a5f8451 100644 --- a/routes/index.js +++ b/routes/index.js @@ -20,6 +20,13 @@ routes.use('/downloads', downloads); const includes = require('./includes'); routes.use('/includes', includes); + +/** category pages */ +const category = require('./category'); +routes.use('/category', category); + + + const projects = ["/steam/"]; diff --git a/sites/admin.js b/sites/admin.js deleted file mode 100644 index 9b9ea2a..0000000 --- a/sites/admin.js +++ /dev/null @@ -1,44 +0,0 @@ -//sending static content -const includes = require('../includes/includes.js'); - -const whiskers = require('whiskers'); - - -/** - * @author Jeffery Russell 11-3-18 - * - * @type {{main: (function(*=, *): Promise)}} - */ -module.exports= - { - /** - * Calls blog and sidebar modules to render blog contents in order - * - * @param requestURL - * @returns {Promise|*} - */ - main: function(request, result, filename) - { - const clientAddress = (request.headers['x-forwarded-for'] || '').split(',')[0] - || request.connection.remoteAddress; - - result.writeHead(200, {'Content-Type': 'text/html'}); - - const file = "../admin/admin.js"; - - var templateContext = Object(); - Promise.all([includes.fetchTemplate("admin/adminMain.html"), - includes.printAdminHeader(templateContext), - require(file).main(request, clientAddress, templateContext, filename), - includes.printFooter(templateContext), - ]).then(function(content) - { - result.write(whiskers.render(content[0], templateContext)); - result.end(); - }).catch(function(err) - { - console.log(err); - throw err; - }); - } - }; \ No newline at end of file diff --git a/sites/blog.js b/sites/blog.js index 3d798ae..6b59187 100644 --- a/sites/blog.js +++ b/sites/blog.js @@ -34,77 +34,67 @@ module.exports= */ main: function(request, result, filename) { - if(contentLoader.serveStaticContent(request, result, filename, "")) - { - //do nothing - } - //downloads - else if (filename.includes("/downloads/")) - { - require("../includes/downloads.js").main(result, filename); - } - else - { - var page = request.query.page; - if(typeof page == "undefined") - page = 1; - page = Number(page); - const html = cache.get(filename + "?page=" + page); + var page = request.query.page; + if(typeof page == "undefined") + page = 1; + page = Number(page); + + const html = cache.get(filename + "?page=" + page); - result.writeHead(200, {'Content-Type': 'text/html'}); - if (html == null) + result.writeHead(200, {'Content-Type': 'text/html'}); + if (html == null) + { + var file = ""; + + if (filename === '' || filename === '/') { - var file = ""; + file = "../blog/homePage.js"; + } + else + { + var urlSplit = filename.split("/"); - if (filename === '' || filename === '/') - { - file = "../blog/homePage.js"; - } + if (urlSplit.length >= 2 && urlSplit[1] === 'category') //single category page + file = "../blog/category.js"; else { - var urlSplit = filename.split("/"); - - if (urlSplit.length >= 2 && urlSplit[1] === 'category') //single category page - file = "../blog/category.js"; - else - { - file = "../blog/posts.js"; - page = 1; // all blog are single page, everyone must be one to ensure - // cache is not tricked into storing same blog post a ton of times - } + file = "../blog/posts.js"; + page = 1; // all blog are single page, everyone must be one to ensure + // cache is not tricked into storing same blog post a ton of times } - - var templateContext = Object(); - Promise.all([includes.fetchTemplate(TEMPLATE_FILE), - utils.includeInObject(PAGINATION_TEMPLATE_KEY, templateContext, "templates/" + PAGINATION_TEMPLATE_FILE), - includes.printHeader(templateContext), - includes.printFooter(templateContext), - require(file).main(filename, request, templateContext), - require("../blog/sidebar.js").main(templateContext)]) - .then(function (content) - { - const html = whiskers.render(content[0], templateContext); - result.write(html); - result.end(); - cache.put(filename + "?page=" + page, html); - }).catch(function (err) - { - console.log(err); - cache.del(filename + "?page=" + page); - utils.print404().then(function(content) - { - result.write(content); - result.end(); - }) - }); } - else + + var templateContext = Object(); + Promise.all([includes.fetchTemplate(TEMPLATE_FILE), + utils.includeInObject(PAGINATION_TEMPLATE_KEY, templateContext, "templates/" + PAGINATION_TEMPLATE_FILE), + includes.printHeader(templateContext), + includes.printFooter(templateContext), + require(file).main(filename, request, templateContext), + require("../blog/sidebar.js").main(templateContext)]) + .then(function (content) { + const html = whiskers.render(content[0], templateContext); result.write(html); result.end(); - } + cache.put(filename + "?page=" + page, html); + }).catch(function (err) + { + console.log(err); + cache.del(filename + "?page=" + page); + utils.print404().then(function(content) + { + result.write(content); + result.end(); + }) + }); } + else + { + result.write(html); + result.end(); + } + }, /** diff --git a/utils/pageBuilder.js b/utils/pageBuilder.js new file mode 100644 index 0000000..f6cce9d --- /dev/null +++ b/utils/pageBuilder.js @@ -0,0 +1,203 @@ +const utils = require('./utils'); + +const whiskers = require('whiskers'); + +const includes = require("../includes/includes"); + +const cache = require('memory-cache'); + +/** used to parse the request URL */ +const url = require('url'); + + +const TEMPLATE_FILE="blog/blogMain.html"; + + +const PAGINATION_TEMPLATE_KEY = "paginationTemplate"; +const PAGINATION_TEMPLATE_FILE = "blog/paginationBar.html"; + + +module.exports = + { + /** + * Displays 404 error to user + * + * @param result + * @returns {*} + */ + print404: function(result) + { + includes.include("includes/html/404.html").then(function(html) + { + result.write(html); + result.end(); + }) + }, + + + constructAdminPage: function(request, result, templateFiller) + { + var templateContext = Object(); + var promises = []; + + promises.push(includes.fetchTemplate("admin/adminMain.html")); + promises.push(includes.printAdminHeader(templateContext)); + promises.push(includes.printFooter(templateContext)); + + if(module.exports.loggedIn(request)) + { + templateContext.loggedIn = true; + promises.push(templateFiller(templateContext)); + } + else + { + //login + const clientAddress = (request.headers['x-forwarded-for'] || '').split(',')[0] + || request.connection.remoteAddress; + promises.push(require("../admin/login").main(request, clientAddress,templateContext)); + } + + Promise.all(promises).then(function(content) + { + result.write(whiskers.render(content[0], templateContext)); + result.end(); + }).catch(function(err) + { + console.log(err); + throw err; + }); + }, + + adminPostPageWithOutput: function(request, result, templateFiller) + { + utils.getPostData(request).then(function(postData) + { + var templateContext = Object(); + var promises = []; + + promises.push(includes.fetchTemplate("admin/adminMain.html")); + promises.push(includes.printAdminHeader(templateContext)); + promises.push(includes.printFooter(templateContext)); + + if (module.exports.loggedIn(request)) + { + templateContext.loggedIn = true; + promises.push(templateFiller(templateContext, postData)); + } + else + { + //login + const clientAddress = (request.headers['x-forwarded-for'] || '').split(',')[0] + || request.connection.remoteAddress; + promises.push(require("../admin/login").main(request, clientAddress, templateContext)); + } + + Promise.all(promises).then(function (content) + { + result.write(whiskers.render(content[0], templateContext)); + result.end(); + }).catch(function (err) { + console.log(err); + throw err; + }); + }); + }, + + + adminPostRoute: function(request, templateFiller) + { + return new Promise(function(resolve, reject) + { + utils.getPostData(request).then(function(postData) + { + templateFiller(postData).then(function() + { + resolve(); + }) + }).catch(function(e) + { + reject(e); + }) + }) + }, + + + loggedIn(request) + { + return(request.session && request.session.user); + }, + + + buildBlogPage: function(request, result, templateFiller) + { + var page = request.query.page; + if(typeof page == "undefined") + page = 1; + page = Number(page); + + var filename = url.parse(request.url, true).pathname; + + const html = cache.get(filename + "?page=" + page); + + result.writeHead(200, {'Content-Type': 'text/html'}); + if (html == null) + { + // var file = ""; + // + // if (filename === '' || filename === '/') + // { + // file = "../blog/homePage.js"; + // } + // else + // { + // var urlSplit = filename.split("/"); + // + // if (urlSplit.length >= 2 && urlSplit[1] === 'category') //single category page + // file = "../blog/category.js"; + // else + // { + // file = "../blog/posts.js"; + // page = 1; // all blog are single page, everyone must be one to ensure + // // cache is not tricked into storing same blog post a ton of times + // } + // } + + var templateContext = Object(); + Promise.all([includes.fetchTemplate(TEMPLATE_FILE), + includes.includeInObject(PAGINATION_TEMPLATE_KEY, templateContext, "templates/" + PAGINATION_TEMPLATE_FILE), + includes.printHeader(templateContext), + includes.printFooter(templateContext), + templateFiller(filename, request, templateContext), + require("../blog/sidebar.js").main(templateContext)]) + .then(function (content) + { + console.log(JSON.stringify(content)); + const html = whiskers.render(content[0], templateContext); + result.write(html); + result.end(); + cache.put(filename + "?page=" + page, html); + }).catch(function (err) + { + console.log("dewie"); + console.log(err); + cache.del(filename + "?page=" + page); + + module.exports.print404(result) + }); + } + else + { + result.write(html); + result.end(); + } + }, + + /** + * Clears the memory cache. + */ + clearCache: function() + { + console.log("Blog cache cleared"); + cache.clear(); + } + }; \ No newline at end of file diff --git a/utils/utils.js b/utils/utils.js index ed982e6..fca1aec 100644 --- a/utils/utils.js +++ b/utils/utils.js @@ -6,11 +6,6 @@ //used for file io const fs = require('fs'); -const whiskers = require('whiskers'); - - -const includes = require("../includes/includes"); - module.exports= { @@ -106,113 +101,4 @@ module.exports= } }); }, - - - /** - * Displays 404 error to user - * - * @param result - * @returns {*} - */ - print404: function(result) - { - includes.include("includes/html/404.html").then(function(html) - { - result.write(html); - result.end(); - }) - }, - - - constructAdminPage: function(request, result, templateFiller) - { - var templateContext = Object(); - var promises = []; - - promises.push(includes.fetchTemplate("admin/adminMain.html")); - promises.push(includes.printAdminHeader(templateContext)); - promises.push(includes.printFooter(templateContext)); - - if(module.exports.loggedIn(request)) - { - templateContext.loggedIn = true; - promises.push(templateFiller(templateContext)); - } - else - { - //login - const clientAddress = (request.headers['x-forwarded-for'] || '').split(',')[0] - || request.connection.remoteAddress; - promises.push(require("../admin/login").main(request, clientAddress,templateContext)); - } - - Promise.all(promises).then(function(content) - { - result.write(whiskers.render(content[0], templateContext)); - result.end(); - }).catch(function(err) - { - console.log(err); - throw err; - }); - }, - - adminPostPageWithOutput: function(request, result, templateFiller) - { - module.exports.getPostData(request).then(function(postData) - { - var templateContext = Object(); - var promises = []; - - promises.push(includes.fetchTemplate("admin/adminMain.html")); - promises.push(includes.printAdminHeader(templateContext)); - promises.push(includes.printFooter(templateContext)); - - if (module.exports.loggedIn(request)) - { - templateContext.loggedIn = true; - promises.push(templateFiller(templateContext, postData)); - } - else - { - //login - const clientAddress = (request.headers['x-forwarded-for'] || '').split(',')[0] - || request.connection.remoteAddress; - promises.push(require("../admin/login").main(request, clientAddress, templateContext)); - } - - Promise.all(promises).then(function (content) - { - result.write(whiskers.render(content[0], templateContext)); - result.end(); - }).catch(function (err) { - console.log(err); - throw err; - }); - }); - }, - - - adminPostRoute: function(request, templateFiller) - { - return new Promise(function(resolve, reject) - { - module.exports.getPostData(request).then(function(postData) - { - templateFiller(postData).then(function() - { - resolve(); - }) - }).catch(function(e) - { - reject(e); - }) - }) - }, - - - loggedIn(request) - { - return(request.session && request.session.user); - } }; \ No newline at end of file