import { importRouters } from "../lib.js"; import multer from "multer"; import cookieParser from "cookie-parser"; import { initDb } from "../db.js"; import express from "express"; import { randomBytes } from 'node:crypto'; let db = await initDb(); const mimes = { 'image/gif': 'gif', 'image/jpeg': 'jpg', 'text/plain': 'txt', 'application/json': 'json', 'video/mp4': 'mp4', 'video/webm': 'webm', 'image/png': 'png', 'audio/mpeg': 'mp3', 'audio/wav': 'wav', }; const upload = multer.diskStorage({ destination: function (req, file, cb) { cb(null, './uploads/') }, filename: function (req, file, cb) { const uniqueSuffix = randomBytes(8).toString('hex'); const type = mimes[file.mimetype] || 'txt'; cb(null, uniqueSuffix + '.' + type) } }); const upload2 = multer({ storage: upload }); const aliases = { '/': '/walls/get/hub/main/0' }; const routers = { '/you': './routes/you.js', '/api/form/you': './routes/youApi.js', '/api/file/you': './routes/youApi.js', '/api/file/comment': './routes/commenter.js', '/walls': './routes/walls.js', '/comment': './routes/comment.js', '/users': './routes/user.js', '/info': './routes/info.js' } function doAliases(app) { for (let alias in aliases) { let aliasV = aliases[alias]; app.all(alias, (req, res, next) => { res.redirect(aliasV) }) } } async function auther(req, res, next) { let { token } = req.cookies; if (!token) { res.auth = {}; next(); return; } let match = await db.all('SELECT * FROM token WHERE token = ?', [ token || 'blah' ]); let username = match[0] ? match[0].username : '!nobody'; let valid = false; if (username != '!nobody') { valid = await db.all('SELECT * FROM auth WHERE username = ?', [ username ]); } res.auth = { username, valid: valid[0] }; next(); } async function initr(req, res, next) { let msgCount = 0; if (res.auth.valid) { let messages = await db.all('SELECT count(*) FROM messages WHERE username = ? AND status = ?', [ res.auth.username, 'unread' ]); msgCount = messages[0]['count(*)']; } let headerCtx = [ { link: '/walls/get/hub/main/0', icon: '/icon.svg', name: 'DervNet' }, { link: '/walls/list', icon: '/walls.svg', name: 'Explore' }, { link: '/users/' + (res.auth ? res.auth.username : ''), icon: '/login.svg', name: 'You' }, { link: '/you/messages', icon: '/mail.svg', name: `Messages [${msgCount}]` }, { link: '/you/logout', icon: '/logout.svg', name: 'Leave' } ]; if (!res.auth || !res.auth.valid) { headerCtx = [ { link: '/walls/get/hub/main/0', icon: '/icon.svg', name: 'DervNet' }, { link: '/walls/list', icon: '/walls.svg', name: 'Explore' }, { link: '/you/login', icon: '/login.svg', name: 'Log in' }, { link: '/you/new', icon: '/join.svg', name: 'Join' } ]; } res.ctx = { mainPage: '404.ejs', mainCtx: {}, headerCtx }; next(); } async function doInit(app) { app.use(cookieParser()); doAliases(app); app.use(express.static('public')); app.use('/uploads', express.static('uploads')); app.use(auther) app.use(initr) app.use('/api/form', upload2.none()); app.use('/api/file', upload2.single('file')); await importRouters(app, routers); app.use('/api', (req, res, next) => { res.send(res.api); }) app.use((req, res, next) => { res.render('root.ejs', res.ctx) }) } export { doInit };