const __ = require('./lib/Extensions'); import * as fs from 'fs'; import * as express from 'express'; import __rootDir from './lib/RootDirFinder'; import { c } from './lib/Log'; import * as Utils from './lib/Utils'; const app = express(); const PORT = 3200; const __frontDir = __rootDir+`/front`; // Express setup app.set('trust proxy', 'loopback'); const staticHandler = express.static(__frontDir); const staticHandlerNoHtml: express.RequestHandler = function(req, res, next) { if (req.path === '/' || req.path.endsWith('.html')) { return next(); } else { return staticHandler(req, res, next); } }; app.use(staticHandlerNoHtml); const PERSONAS = { MAP: new Map(), /// <- LST: [] as { slug: string, text: string }[], }; (async () => { const o: Obj = JSON.parse(await fs.promises.readFile(__rootDir+`/server/data/personas.json`, 'utf8')); for (const [k, v] of Object.entries(o)) { PERSONAS.MAP.set(k, v); PERSONAS.LST.push({ slug: k, text: v }); } c.debug(`personas:loaded`); })(); const templateHtml = async (slug: string, text: string): Promise => { const jsStr = `window.PERSONA_ATLOAD = ${ JSON.stringify({ slug, text }) };`; /// Transform text. Should be the exact same function client-side. const persona = text.split('.').map(x => Utils.capitalize(x)).join(`.
`); let s = await fs.promises.readFile(__frontDir+`/index.html`, 'utf8'); s = s.replace('/* //u */', jsStr); s = s.replace('', persona); return s; } // GET / app.get('/', async function(req, res) { const p = PERSONAS.LST.randomItem(); res.send( await templateHtml(p.slug, p.text) ); }); // GET persona/:slug app.get('/persona/:slug', async function(req, res) { const slug: string = req.params.slug; const text = PERSONAS.MAP.get(slug); if (!text) { return res.redirect('/'); } res.send( await templateHtml(slug, text) ); }); // GET /shuffle app.get('/shuffle', function(req, res) { res.json( PERSONAS.LST.randomItem() ); }); // Start engine. app.listen(PORT, () => { c.debug(`Running on ${PORT}`); });