import router from "../router.mjs"; import sql from "../sql.mjs"; import { parse } from "url"; import cfg from "../../../config.json"; import { mimes, queries } from "./inc/api.mjs"; router.get("/api", (req, res) => { res.end("api lol"); }); router.get(/^\/api\/random(\/user\/.+|\/image|\/video|\/audio)?$/, async (req, res) => { const args = []; let q = queries.random.main; if(req.url.split[2] === "user") { q += queries.random.where("username like ?"); args.push(req.url.split[3] || "flummi"); } else q += queries.random.where(mimes[req.url.split[2]] ? mimes[req.url.split[2]].map(mime => `mime = "${mime}"`).join(" or ") : null); try { const rows = await sql.query(q, args); res .writeHead(200, { "Content-Type": "application/json" }) .end(JSON.stringify(rows.length > 0 ? rows[0] : []), "utf-8"); } catch(err) { res .writeHead(500) .end(JSON.stringify(err), "utf-8"); } }); router.get("/api/p", async (req, res) => { let id = parseInt(req.url.qs.id) || 99999999; const eps = Math.min(parseInt(req.url.qs.eps) || 100, 200); let [ order, trend ] = req.url.qs.order === "asc" ? [ "asc", ">" ] : [ "desc", "<" ]; try { const tmp = (await sql.query("select min(id) as min, max(id) as max from items limit 1"))[0]; if((id - 1 + eps) > tmp.max) { id = tmp.max; [ order, trend ] = [ "desc", "<=" ]; } if((id + 1 - eps) < tmp.min) { id = tmp.min; [ order, trend ] = [ "asc", ">=" ]; } const rows = await sql.query(queries.p(trend, order), [ id, eps ]); const items = { items: rows, first: rows[0].id, last: rows[rows.length - 1].id, newest: tmp.max, oldest: tmp.min }; res .writeHead(200, { "Content-Type": "application/json" }) .end(JSON.stringify(items), "utf-8"); } catch(err) { console.error(err); res .writeHead(500) .end(JSON.stringify(err), "utf-8"); } }); router.get(/^\/api\/p\/([0-9]+)/, async (req, res) => { // legacy let eps = 100; let id = +req.url.split[2]; const query = await sql.query("select * from items where id < ? order by id desc limit ?", [ id, eps ]); const items = { items: query, last: query[query.length - 1].id }; res.writeHead(200, { "Content-Type": "application/json" }); res.end(JSON.stringify(items), "utf-8"); }); router.get(/^\/api\/item\/[0-9]+$/, async (req, res) => { try { const rows = await sql.query(queries.item, Array(3).fill(req.url.split[2])); const data = rows[0].length > 0 ? { ...rows[0][0], ...{ thumb: `${cfg.main.url}/t/${rows[0][0].id}.png`, srchost: parse(rows[0][0].src).hostname, next: rows[1].length ? rows[1][0].id : null, prev: rows[2].length ? rows[2][0].id : null, } } : { error: true }; res .writeHead(200, { "Content-Type": "application/json" }) .end(JSON.stringify(data), "utf-8"); } catch(err) { res .writeHead(500) .end(JSON.stringify(err), "utf-8"); } }); router.get(/^\/api\/user\/.*(\/[0-9]+)?$/, async (req, res) => { // auf qs umstellen const user = req.url.split[2]; const eps = Math.min(req.url.split[3] || 50, 50); try { const rows = await sql.query(queries.user, [ user, eps ]); res .writeHead(200, { "Content-Type": "application/json" }) .end(JSON.stringify(rows.length > 0 ? rows : []), "utf-8"); } catch(err) { res .writeHead(500) .end(JSON.stringify(err), "utf-8"); } db.end(); });