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.

202 lines
6.6 KiB

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