Personal blog written from scratch using Node.js, Bootstrap, and MySQL. https://jrtechs.net
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

212 lines
6.9 KiB

  1. const utils = require('./utils');
  2. const whiskers = require('whiskers');
  3. const includes = require("../includes/includes");
  4. const cache = require('memory-cache');
  5. const CACHE_ENABLED = utils.getConfig()['CACHE'];
  6. const ADMIN_CHECK = utils.getConfig()["ADMIN_CHECK"];
  7. /** used to parse the request URL */
  8. const url = require('url');
  9. const TEMPLATE_FILE="blog/blogMain.html";
  10. const HEADER_TEMPLATE_FILE="blog/header.html";
  11. const HEADER_TEMPLATE_KEY="header";
  12. const PAGINATION_TEMPLATE_KEY = "paginationTemplate";
  13. const PAGINATION_TEMPLATE_FILE = "blog/paginationBar.html";
  14. module.exports =
  15. {
  16. /**
  17. * Displays 404 error to user
  18. *
  19. * @param result
  20. * @returns {*}
  21. */
  22. print404: function(result)
  23. {
  24. includes.include("includes/html/404.html").then(function(html)
  25. {
  26. result.write(html);
  27. result.end();
  28. })
  29. },
  30. constructAdminPage: function(request, result, templateFiller)
  31. {
  32. var templateContext = Object();
  33. var promises = [];
  34. promises.push(includes.fetchTemplate("admin/adminMain.html"));
  35. promises.push(includes.printAdminHeader(templateContext));
  36. promises.push(includes.printFooter(templateContext));
  37. if(module.exports.loggedIn(request))
  38. {
  39. templateContext.loggedIn = true;
  40. promises.push(templateFiller(templateContext));
  41. }
  42. else
  43. {
  44. //login
  45. const clientAddress = (request.headers['x-forwarded-for'] || '').split(',')[0]
  46. || request.connection.remoteAddress;
  47. promises.push(require("../admin/login").main(request, clientAddress,templateContext));
  48. }
  49. Promise.all(promises).then(function(content)
  50. {
  51. result.write(whiskers.render(content[0], templateContext));
  52. result.end();
  53. }).catch(function(err)
  54. {
  55. console.log(err);
  56. throw err;
  57. });
  58. },
  59. adminPostPageWithOutput: function(request, result, templateFiller)
  60. {
  61. utils.getPostData(request).then(function(postData)
  62. {
  63. var templateContext = Object();
  64. var promises = [];
  65. promises.push(includes.fetchTemplate("admin/adminMain.html"));
  66. promises.push(includes.printAdminHeader(templateContext));
  67. promises.push(includes.printFooter(templateContext));
  68. if (module.exports.loggedIn(request))
  69. {
  70. templateContext.loggedIn = true;
  71. promises.push(templateFiller(templateContext, postData));
  72. }
  73. else
  74. {
  75. //login
  76. const clientAddress = (request.headers['x-forwarded-for'] || '').split(',')[0]
  77. || request.connection.remoteAddress;
  78. promises.push(require("../admin/login").main(request, clientAddress, templateContext));
  79. }
  80. Promise.all(promises).then(function (content)
  81. {
  82. result.write(whiskers.render(content[0], templateContext));
  83. result.end();
  84. }).catch(function (err) {
  85. console.log(err);
  86. throw err;
  87. });
  88. });
  89. },
  90. adminPostRoute: function(request, templateFiller)
  91. {
  92. return new Promise(function(resolve, reject)
  93. {
  94. utils.getPostData(request).then(function(postData)
  95. {
  96. templateFiller(postData).then(function()
  97. {
  98. resolve();
  99. })
  100. }).catch(function(e)
  101. {
  102. reject(e);
  103. })
  104. })
  105. },
  106. loggedIn(request)
  107. {
  108. return(ADMIN_CHECK == false || (request.session && request.session.user));
  109. },
  110. buildBlogPageWithURL: function(request, result, templateFiller, filename)
  111. {
  112. var page = request.query.page;
  113. if(typeof page == "undefined")
  114. page = 1;
  115. page = Number(page);
  116. const html = CACHE_ENABLED == true ? cache.get(filename + "?page=" + page) : null;
  117. result.writeHead(200, {'Content-Type': 'text/html'});
  118. if (html == null)
  119. {
  120. var templateContext = Object();
  121. Promise.all([includes.fetchTemplate(TEMPLATE_FILE),
  122. includes.includeInObject(PAGINATION_TEMPLATE_KEY, templateContext, "templates/" + PAGINATION_TEMPLATE_FILE),
  123. includes.includeInObject(HEADER_TEMPLATE_KEY, templateContext, "templates/" + HEADER_TEMPLATE_FILE),
  124. includes.printFooter(templateContext),
  125. templateFiller(filename, request, templateContext),
  126. require("../blog/sidebar.js").main(templateContext)])
  127. .then(function (content)
  128. {
  129. const html = whiskers.render(content[0], templateContext);
  130. result.write(html);
  131. result.end();
  132. if(CACHE_ENABLED == true)
  133. {
  134. cache.put(filename + "?page=" + page, html);
  135. }
  136. }).catch(function (err)
  137. {
  138. cache.del(filename + "?page=" + page);
  139. module.exports.print404(result)
  140. });
  141. }
  142. else
  143. {
  144. result.write(html);
  145. result.end();
  146. }
  147. },
  148. buildBlogPage: function(request, result, templateFiller)
  149. {
  150. var filename = url.parse(request.url, true).pathname;
  151. module.exports.buildBlogPageWithURL(request, result,templateFiller, filename);
  152. },
  153. /**
  154. * Clears the memory cache.
  155. */
  156. clearCache: function()
  157. {
  158. console.log("Blog cache cleared");
  159. cache.clear();
  160. },
  161. buildPageWithTemplate: function(request, result, templateFiller, templateFile)
  162. {
  163. var templateContext = Object();
  164. Promise.all([includes.include("templates/" + templateFile),
  165. includes.printHeader(templateContext),
  166. templateFiller(request.url, request, templateContext),
  167. includes.printFooter(templateContext),
  168. require("../blog/sidebar.js").main(templateContext)])
  169. .then(function (content)
  170. {
  171. const html = whiskers.render(content[0], templateContext);
  172. result.write(html);
  173. result.end();
  174. })
  175. }
  176. };