aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLMBishop <13875753+LMBishop@users.noreply.github.com>2021-12-21 15:16:27 +0000
committerLMBishop <13875753+LMBishop@users.noreply.github.com>2021-12-21 15:16:27 +0000
commite70fd3594cfa8e0e29c3e9fb25991a9bad048469 (patch)
tree6984c870820526bfc48ced41cbd5c0a1c580ad4f
parentf4b697f0e4248ecbeb9606a113d602e28c740b38 (diff)
Seperate router modules from index.ts
-rw-r--r--app/index.ts110
-rw-r--r--app/middlewares/index.ts23
-rw-r--r--app/routes/page/router.ts36
-rw-r--r--app/routes/special/router.ts52
-rw-r--r--package-lock.json28
-rw-r--r--package.json2
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",