import { Router } from 'express'; import { isValidToken } from './db.js'; import { listArticles, getArticle, updateArticle, deleteArticle } from './db.js'; const router = Router(); function escapeHtml(s: unknown): string { return String(s ?? '') .replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); } // Same dark, monospace-accented theme as flit/wisp — same CSS vars, same // card/button/input vocabulary — so stash reads as part of the same family // of tools rather than a bare database inspector. function page(title: string, body: string): string { return `
Missing or invalid ?t= token.
Not found.
')); return; } if (!article.read_at) { article = updateArticle(article.id, { read_at: new Date().toISOString() }) ?? article; } const t = req.token; res.send(page(article.title, `Not found.
')); return; } updateArticle(article.id, { read_at: article.read_at ? null : new Date().toISOString() }); const redirect = typeof req.body?.redirect === 'string' ? req.body.redirect : `/?t=${encodeURIComponent(req.token)}`; res.redirect(redirect); }); router.post('/delete/:id', requireTokenQuery, (req: any, res) => { deleteArticle(Number(req.params.id)); const redirect = typeof req.body?.redirect === 'string' ? req.body.redirect : `/?t=${encodeURIComponent(req.token)}`; res.redirect(redirect); }); export default router;