f0bm/src/inc/routes/index.mjs
2021-12-29 16:26:44 +01:00

83 lines
2.3 KiB
JavaScript

import cfg from "../config.mjs";
import sql from "../sql.mjs";
import lib from "../lib.mjs";
import f0cklib from "./inc/f0cklib.mjs";
const auth = async (req, res, next) => {
if(!req.session)
return res.redirect("/login");
return next();
};
export default (router, tpl) => {
router.get(/^\/?(?:\/tag\/(?<tag>.+?))?(?:\/user\/(?<user>.+?)\/(?:f0cks|favs))?(?:\/(?<mime>image|audio|video))?(?:\/p\/(?<page>\d+))?(?:\/(?<itemid>\d+))?$/, async (req, res) => {
const mode = req.params.itemid ? 'item' : 'index';
const data = await (req.params.itemid ? f0cklib.getf0ck : f0cklib.getf0cks)({
user: req.params.user,
tag: req.params.tag,
mime: req.params.mime,
page: req.params.page,
itemid: req.params.itemid,
mode: req.session.mode
});
if(!data.success) {
return res.reply({
code: 404,
body: tpl.render('error', {
message: data.message,
tmp: null
}, req)
});
}
return res.reply({ body: tpl.render(mode, data, req) });
});
router.get(/^\/(about)$/, (req, res) => {
res.reply({
body: tpl.render(req.url.split[0], { tmp: null }, req)
});
});
router.get(/^\/mode\/(\d)/, auth, async (req, res) => {
const mode = +req.url.split[1];
let referertmp = req.headers.referer;
let referer = "";
if(referertmp.match(/f0ck\.me/))
referer = referertmp.split("/").slice(3).join("/");
if(cfg.allowedModes[mode]) {
await sql("user_options")
.insert({
user_id: req.session.id,
mode: mode,
theme: req.theme ?? "f0ck"
})
.onConflict("user_id")
.merge();
}
res.redirect(`/${referer}`);
});
router.get(/^\/ranking$/, async (req, res) => {
try {
const list = await sql('tags_assign')
.select('user.user', sql.raw('count(distinct tag_id, item_id) count'))
.leftJoin('user', 'user.id', 'tags_assign.user_id')
.groupBy('user.user')
.orderBy('count', 'desc');
const stats = await lib.countf0cks();
res.reply({
body: tpl.render('ranking', { list, stats, tmp: null }, req)
});
} catch(err) {
res.end(JSON.stringify(err.message));
}
});
return router;
};