141 lines
No EOL
3.4 KiB
JavaScript
141 lines
No EOL
3.4 KiB
JavaScript
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();
|
|
}
|
|
|
|
function initr(req, res, next) {
|
|
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' },
|
|
{ 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 }; |