diff options
| author | LMBishop <13875753+LMBishop@users.noreply.github.com> | 2021-12-21 15:16:27 +0000 |
|---|---|---|
| committer | LMBishop <13875753+LMBishop@users.noreply.github.com> | 2021-12-21 15:16:27 +0000 |
| commit | e70fd3594cfa8e0e29c3e9fb25991a9bad048469 (patch) | |
| tree | 6984c870820526bfc48ced41cbd5c0a1c580ad4f | |
| parent | f4b697f0e4248ecbeb9606a113d602e28c740b38 (diff) | |
Seperate router modules from index.ts
| -rw-r--r-- | app/index.ts | 110 | ||||
| -rw-r--r-- | app/middlewares/index.ts | 23 | ||||
| -rw-r--r-- | app/routes/page/router.ts | 36 | ||||
| -rw-r--r-- | app/routes/special/router.ts | 52 | ||||
| -rw-r--r-- | package-lock.json | 28 | ||||
| -rw-r--r-- | package.json | 2 |
6 files changed, 159 insertions, 92 deletions
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 += `<div class="navbar-element"><a href="/${page.standardName}"${current == page.standardName ? ' class="highlight"' : ''}>${page.metadata.displayTitle}</a></div>`; - }) - 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 += `<div class="navbar-element"><a href="/${page.standardName}"${(req.params.page ?? '' )== page.standardName ? ' class="highlight"' : ''}>${page.metadata.displayTitle}</a></div>`; + }) + 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", |
