aboutsummaryrefslogtreecommitdiffstats
path: root/app/index.ts
blob: 9b16ec5fd10426f1357164dff85f6777408424ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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()
    });
}