aboutsummaryrefslogtreecommitdiffstats
path: root/app/index.ts
diff options
context:
space:
mode:
authorLMBishop <13875753+LMBishop@users.noreply.github.com>2021-12-20 14:48:04 +0000
committerLMBishop <13875753+LMBishop@users.noreply.github.com>2021-12-20 14:48:04 +0000
commit3f91a121b33151cd466de930d0e68bdf87f4d19e (patch)
tree62e9555661340d85537d8441da8cb92384d21180 /app/index.ts
parent1a1f5a10fb60426dae868d2a73ed2cac46100f2b (diff)
Convert to typescript
Diffstat (limited to 'app/index.ts')
-rw-r--r--app/index.ts113
1 files changed, 113 insertions, 0 deletions
diff --git a/app/index.ts b/app/index.ts
new file mode 100644
index 0000000..9b16ec5
--- /dev/null
+++ b/app/index.ts
@@ -0,0 +1,113 @@
+'use strict';
+
+import { PageDirectory, Page, PageMetadata } from './directory.js';
+import express from 'express';
+import dotenv from 'dotenv';
+
+dotenv.config()
+
+const app = express();
+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
+}
+
+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;
+ }
+
+ res.render('purge.ejs', {
+ navbar: navbar(),
+ page: path,
+ buildTime: new Date(page.buildTime) ?? 'never',
+ buildTimeRelative: Math.round((Date.now() - page.buildTime) / 1000 / 60)
+ });
+});
+
+app.get('/special/purge/:page/confirm', (req, res) => {
+ let path = req.params.page;
+ let page = directory.get(path);
+
+ if (!page) {
+ error(res, 404);
+ return;
+ }
+
+ 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.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}`);
+});
+
+function error(res, code) {
+ res.render('error.ejs', {
+ code: code,
+ navbar: navbar()
+ });
+}