From e70fd3594cfa8e0e29c3e9fb25991a9bad048469 Mon Sep 17 00:00:00 2001 From: LMBishop <13875753+LMBishop@users.noreply.github.com> Date: Tue, 21 Dec 2021 15:16:27 +0000 Subject: Seperate router modules from index.ts --- app/index.ts | 110 ++++++++----------------------------------- app/middlewares/index.ts | 23 +++++++++ app/routes/page/router.ts | 36 ++++++++++++++ app/routes/special/router.ts | 52 ++++++++++++++++++++ package-lock.json | 28 ++++++++++- package.json | 2 + 6 files changed, 159 insertions(+), 92 deletions(-) create mode 100644 app/middlewares/index.ts create mode 100644 app/routes/page/router.ts create mode 100644 app/routes/special/router.ts diff --git a/app/index.ts b/app/index.ts index 9a2b693..845b793 100644 --- a/app/index.ts +++ b/app/index.ts @@ -3,6 +3,9 @@ import { PageDirectory, Page, PageMetadata } from './directory.js'; import express from 'express'; import dotenv from 'dotenv'; +import * as page from './routes/page/router.js'; +import * as special from './routes/special/router.js'; +import { navbar } from './middlewares/index.js' dotenv.config() @@ -11,110 +14,35 @@ const directory = new PageDirectory(process.env.PAGES_DIR); directory.rebuild(); -function navbar(current: string = ''): string { - let navbar = ''; - directory.primaryPages.forEach(page => { - navbar += `
`; - }) - return navbar -} - -function error(res, code) { - res.render('error.ejs', { - code: code, - navbar: navbar() - }); -} - -app.use(express.static('static')); app.set('view engine', 'ejs'); app.set('views', 'views'); -app.get('/:page.wiki', (req, res) => { - let path = req.params.page; - let raw = directory.getRaw(path); - - if (!raw) { - error(res, 404); - return; - } - - res.type('text/plain'); - res.send(raw).end(); -}); - -app.get('/:page?', (req, res) => { - let path = req.params.page ?? 'index'; - let page = directory.get(path); - - if (!page) { - error(res, 404); - return; - } - - res.render('page.ejs', { - navbar: navbar(), - path: path, - content: page.html, - title: page.metadata.displayTitle, - buildTime: new Date(page.buildTime) - }); -}); - -app.get('/special/purge/:page?', (req, res) => { - let path = req.params.page ?? 'index'; - let page = directory.get(path); - - if (!page) { - error(res, 404); - return; - } +app.use(express.static('static')); - res.render('purge.ejs', { - navbar: navbar(), - page: path, - buildTime: new Date(page.buildTime) ?? 'never', - buildTimeRelative: Math.round((Date.now() - page.buildTime) / 1000 / 60) - }); +app.use((req, res, next) => { + res.locals.directory = directory; + next(); }); -app.get('/special/purge/:page/confirm', (req, res) => { - let path = req.params.page; - let page = directory.get(path); - - if (!page) { - error(res, 404); - return; - } +app.use(page.router); +app.use(special.router); - if (directory.purge(path)) { - res.status(200).send(); - } else { - res.status(429).send(); - } -}); - -app.get('/special/rebuild', (req, res) => { - res.render('rebuild.ejs', { - navbar: navbar() +app.use(navbar, (req, res, next) => { + res.render('error.ejs', { + code: '404', + navbar: res.locals.navbarHtml }); }); -app.get('/special/rebuild/confirm', (req, res) => { - if (directory.rebuild()) { - res.status(200).send(); - } else { - res.status(429).send(); - } -}); - -app.listen(process.env.PORT, () => { - console.log(`App listening on ${process.env.PORT}`); +const server = app.listen(process.env.PORT, () => { + console.log(`App listening on port ${process.env.PORT}`); }); const exit = () => { - console.info('Exiting application'); - process.exit(0); + console.info('Stopping server...'); + server.close(() => { + process.exit(0); + }) } process.on('SIGINT', exit); diff --git a/app/middlewares/index.ts b/app/middlewares/index.ts new file mode 100644 index 0000000..d0ba721 --- /dev/null +++ b/app/middlewares/index.ts @@ -0,0 +1,23 @@ +export const navbar = ((req, res, next) => { + let navbar = ''; + res.locals.directory.primaryPages.forEach(page => { + navbar += ``; + }) + res.locals.navbarHtml = navbar; + next(); +}); + +export const page = ((req, res, next) => { + let path = req.params.page ?? 'index'; + res.locals.path = path; + + let page = res.locals.directory.get(path); + + if (!page) { + next(); + return; + } + + res.locals.page = page; + next(); +}); diff --git a/app/routes/page/router.ts b/app/routes/page/router.ts new file mode 100644 index 0000000..89cd59a --- /dev/null +++ b/app/routes/page/router.ts @@ -0,0 +1,36 @@ +import express, { Router } from 'express'; +import { navbar, page } from '../../middlewares/index.js'; + +export const router = express.Router({ mergeParams: true }); + +router.use('/:page.wiki', page); +router.use('/:page?', page); + +router.get('/:page.wiki', (req, res, next) => { + let page = res.locals.page; + + if (!page) { + next(); + return; + } + + res.type('text/plain'); + res.send(page.raw).end(); +}); + +router.get('/:page?', navbar, (req, res, next) => { + let page = res.locals.page; + + if (!page) { + next(); + return; + } + + res.render('page.ejs', { + navbar: res.locals.navbarHtml, + path: res.locals.path, + content: page.html, + title: page.metadata.displayTitle, + buildTime: new Date(page.buildTime) + }); +}); diff --git a/app/routes/special/router.ts b/app/routes/special/router.ts new file mode 100644 index 0000000..1508ffa --- /dev/null +++ b/app/routes/special/router.ts @@ -0,0 +1,52 @@ +import express, { Router } from 'express'; +import { navbar, page } from '../../middlewares/index.js'; + +export const router = express.Router({ mergeParams: true }); + +router.use('/special/purge/:page?', page); +router.use('/special/purge/:page/confirm', page); + +router.get('/special/purge/:page?', navbar, (req, res, next) => { + let page = res.locals.page; + + if (!page) { + next(); + return; + } + + res.render('purge.ejs', { + navbar: res.locals.navbarHtml, + page: res.locals.path, + buildTime: new Date(page.buildTime) ?? 'never', + buildTimeRelative: Math.round((Date.now() - page.buildTime) / 1000 / 60) + }); +}); + +router.get('/special/purge/:page/confirm', (req, res, next) => { + let page = res.locals.page; + + if (!page) { + next(); + return; + } + + if (res.locals.directory.purge(res.locals.path)) { + res.status(200).send(); + } else { + res.status(429).send(); + } +}); + +router.get('/special/rebuild', navbar, (req, res) => { + res.render('rebuild.ejs', { + navbar: res.locals.navbarHtml + }); +}); + +router.get('/special/rebuild/confirm', (req, res) => { + if (res.locals.directory.rebuild()) { + res.status(200).send(); + } else { + res.status(429).send(); + } +}); diff --git a/package-lock.json b/package-lock.json index 2e03481..8ef860d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,7 @@ "": { "name": "website", "version": "unpublished", - "license": "UNLICENSED", + "license": "ISC", "dependencies": { "dateformat": "^5.0.2", "dotenv": "^10.0.0", @@ -17,6 +17,8 @@ "glob": "^7.2.0" }, "devDependencies": { + "@types/dateformat": "^5.0.0", + "@types/escape-html": "^1.0.1", "@types/express": "^4.17.13", "@types/glob": "^7.2.0", "@typescript-eslint/eslint-plugin": "^5.7.0", @@ -173,6 +175,18 @@ "@types/node": "*" } }, + "node_modules/@types/dateformat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/dateformat/-/dateformat-5.0.0.tgz", + "integrity": "sha512-SZg4JdHIWHQGEokbYGZSDvo5wA4TLYPXaqhigs/wH+REDOejcJzgH+qyY+HtEUtWOZxEUkbhbdYPqQDiEgrXeA==", + "dev": true + }, + "node_modules/@types/escape-html": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/escape-html/-/escape-html-1.0.1.tgz", + "integrity": "sha512-4mI1FuUUZiuT95fSVqvZxp/ssQK9zsa86S43h9x3zPOSU9BBJ+BfDkXwuaU7BfsD+e7U0/cUUfJFk3iW2M4okA==", + "dev": true + }, "node_modules/@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", @@ -2395,6 +2409,18 @@ "@types/node": "*" } }, + "@types/dateformat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/dateformat/-/dateformat-5.0.0.tgz", + "integrity": "sha512-SZg4JdHIWHQGEokbYGZSDvo5wA4TLYPXaqhigs/wH+REDOejcJzgH+qyY+HtEUtWOZxEUkbhbdYPqQDiEgrXeA==", + "dev": true + }, + "@types/escape-html": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/escape-html/-/escape-html-1.0.1.tgz", + "integrity": "sha512-4mI1FuUUZiuT95fSVqvZxp/ssQK9zsa86S43h9x3zPOSU9BBJ+BfDkXwuaU7BfsD+e7U0/cUUfJFk3iW2M4okA==", + "dev": true + }, "@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", diff --git a/package.json b/package.json index 0519db1..eabc30e 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,8 @@ }, "type": "module", "devDependencies": { + "@types/dateformat": "^5.0.0", + "@types/escape-html": "^1.0.1", "@types/express": "^4.17.13", "@types/glob": "^7.2.0", "@typescript-eslint/eslint-plugin": "^5.7.0", -- cgit v1.2.3-70-g09d2