1
0
forked from w0bm/f0bm
Files
f0bm/src/inc/routes/api.mjs
2019-05-11 09:20:01 +00:00

115 lines
3.2 KiB
JavaScript

import router from "../router";
import sql from "../sql";
import { parse } from "url";
import cfg from "../../../config.json";
import { mimes, queries } from "./inc/api";
router.get(/^\/api$/, (req, res) => {
res.end("api lol");
});
router.get(/^\/api\/random(\/user\/.+|\/image|\/video|\/audio)?$/, async (req, res) => {
const db = await sql.getConnection();
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 db.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');
}
db.end();
});
router.get(/^\/api\/p$/, async (req, res) => {
const db = await sql.getConnection();
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 db.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 db.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');
}
db.end();
});
router.get(/^\/api\/item\/[0-9]+$/, async (req, res) => {
const db = await sql.getConnection();
try {
const rows = await db.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');
}
db.end();
});
router.get(/^\/api\/user\/.*(\/[0-9]+)?$/, async (req, res) => { // auf qs umstellen
const db = await sql.getConnection();
const user = req.url.split[2];
const eps = Math.min(req.url.split[3] || 50, 50);
try {
const rows = await db.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();
});