diff --git a/public/js/nav-toggle.js b/public/js/nav-toggle.js index ba7c24c..bd8ff23 100644 --- a/public/js/nav-toggle.js +++ b/public/js/nav-toggle.js @@ -1,4 +1,8 @@ +<<<<<<< HEAD function setupNavToggle() { +======= +window.addEventListener("DOMContentLoaded", () => { +>>>>>>> testing const nav = document.getElementById("siteNav"); const toggleBtn = document.getElementById("menuToggle"); @@ -15,11 +19,25 @@ } }); } +<<<<<<< HEAD } window.addEventListener("DOMContentLoaded", setupNavToggle); window.addEventListener("resize", setupNavToggle); +======= +<<<<<<< Updated upstream +}); +======= +} +>>>>>>> Stashed changes +>>>>>>> testing function toggleMenu() { document.getElementById("siteNav").classList.toggle("hide"); } +<<<<<<< HEAD +======= + +window.addEventListener("DOMContentLoaded", setupNavToggle); +window.addEventListener("resize", setupNavToggle); +>>>>>>> testing diff --git a/src/middleware/errorHandler.js b/src/middleware/errorHandler.js new file mode 100644 index 0000000..6de8015 --- /dev/null +++ b/src/middleware/errorHandler.js @@ -0,0 +1,43 @@ +const path = require("path"); +const getBaseContext = require("../utils/baseContext"); + +module.exports = async (err, req, res, next) => { + const statusCode = err.statusCode ?? 500; + const message = err.message ?? "Internal Server Error"; + + if (req?.log?.error) { + req.log.error( + JSON.stringify({ + message, + stack: err.stack || "No stack trace available", + method: req.method, + url: req.originalUrl || req.url, + statusCode, + code: err.code || null, + }) + ); + } else { + console.error(err); + } + const errorContextMap = { + EBADCSRFTOKEN: { + title: "Forbidden", + message: "Your request could not be processed.", + statusCode: 403, + }, + 404: { + title: "Not Found", + message: "The requested resource was not found.", + statusCode: 404, + }, + }; + const errorKey = err.code || err.statusCode; + const defaultErrorContext = { + title: `Error ${statusCode}`, + message: "An unexpected error occurred. Please try again later.", + statusCode, + }; + const errorContext = errorContextMap[errorKey] || defaultErrorContext; + + res.redirect(`/error?code=${errorContext.statusCode}`); +}; diff --git a/src/middleware/index.js b/src/middleware/index.js index edaf7eb..4d4b310 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -11,6 +11,7 @@ const applyProductionSecurity = require("./applyProductionSecurity"); const validateRequestIntegrity = require("./validateRequestIntegrity"); const { registerHelpers } = require("../utils/hbsHelpers"); +const errorHandler = require("./errorHandler"); const { loggingMiddleware, @@ -59,6 +60,7 @@ app.use(validateRequestIntegrity); app.use(formatHtml); app.use(routes); + app.use(errorHandler); return app; } diff --git a/src/routes/errorHandler.js b/src/routes/errorHandler.js deleted file mode 100644 index dbb745c..0000000 --- a/src/routes/errorHandler.js +++ /dev/null @@ -1,50 +0,0 @@ -const path = require("path"); -const getBaseContext = require("../utils/baseContext"); - -module.exports = async (err, req, res, next) => { - const statusCode = err.statusCode ?? 500; - const message = err.message ?? "Internal Server Error"; - - if (req?.log?.error) { - req.log.error( - JSON.stringify({ - message, - stack: err.stack || "No stack trace available", - method: req.method, - url: req.originalUrl || req.url, - statusCode, - code: err.code || null, - }) - ); - } else { - console.error(err); - } - const errorContextMap = { - EBADCSRFTOKEN: { - title: "Forbidden", - message: - "Invalid CSRF token. Your request was blocked for security reasons.", - statusCode: 403, - }, - 404: { - title: "Not Found", - message: "The requested resource was not found.", - statusCode: 404, - }, - }; - const errorKey = err.code || err.statusCode; - const errorContext = errorContextMap[errorKey] || { - title: "Error", - message, - statusCode, - }; - - const context = await getBaseContext({ - title: errorContext.title, - message: errorContext.message, - statusCode: errorContext.statusCode, - content: "", - }); - - res.status(errorContext.statusCode).render("pages/error", context); -}; diff --git a/src/routes/errorPage.js b/src/routes/errorPage.js new file mode 100644 index 0000000..a57c150 --- /dev/null +++ b/src/routes/errorPage.js @@ -0,0 +1,30 @@ +const getBaseContext = require("../utils/baseContext"); +module.exports = async (req, res) => { + const code = parseInt(req.query.code, 10) || 500; + + const errorContextMap = { + 403: { + title: "Forbidden", + message: "Your request could not be processed.", + }, + 404: { + title: "Not Found", + message: "The requested resource was not found.", + }, + 500: { + title: "Server Error", + message: "An unexpected error occurred. Please try again later.", + }, + }; + + const errorContext = errorContextMap[code] || errorContextMap[500]; + + const context = await getBaseContext({ + title: errorContext.title, + message: errorContext.message, + statusCode: code, + content: "", + }); + + res.status(code).render("pages/error", context); +}; diff --git a/src/routes/index.js b/src/routes/index.js index 696e818..829777d 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -2,12 +2,11 @@ const express = require("express"); const router = express.Router(); -// const getBaseContext = require("../utils/baseContext"); const analytics = require("./analytics"); const robots = require("./robots"); const blog_index = require("./blog_index"); const csrfToken = require("../middleware/csrfToken"); -const errorHandler = require("./errorHandler"); +const errorPage = require("./errorPage"); const contact = require("./contact"); const sitemap = require("./sitemap"); @@ -15,6 +14,10 @@ const pages = require("./pages"); const rssFeed = require("./rssFeed"); +router.get("/error", errorPage); // Landing page after error is logged + +router.get("/favicon.ico", (req, res) => res.status(204).end()); +router.post("/track", analytics); router.use( "/static", express.static("public", { @@ -40,15 +43,6 @@ router.get("/blog/:year/:month/:name", post); -// router.get("/", async (req, res) => { -// const context = await getBaseContext({ -// title: "Blog Home", -// content: "Welcome to the blog.", -// }); - -// res.render("pages/home.handlebars", context); -// }); - router.get("/", async (req, res) => { res.redirect(301, "/blog"); }); @@ -59,6 +53,4 @@ next(err); }); -router.use(errorHandler); - module.exports = router; diff --git a/src/views/pages/error.handlebars b/src/views/pages/error.handlebars index 6d367e8..4297203 100644 --- a/src/views/pages/error.handlebars +++ b/src/views/pages/error.handlebars @@ -1,3 +1,3 @@ -
{{message}}
{{{content}}}