import Prisma from "@prisma/client"; const prisma = new Prisma.PrismaClient(); export function registerAdmin(app) { app.get("/api/admin/timetable", listTimetables); app.post("/api/admin/timetable", createTimetable); app.put("/api/admin/timetable", editTimetable); app.delete("/api/admin/timetable", deleteTimetable); app.get("/api/admin/key", listKeys); app.post("/api/admin/key", createKey); app.put("/api/admin/key", editKey); app.delete("/api/admin/key", deleteKey); } function sendMissingArguments(res) { res.status(400).send({ success: false, error: "missing_arguments", }); } async function listTimetables(_, res) { res.send( await prisma.timetable.findMany({ select: { id: true, title: true, class: true, source: true, trusted: true, }, }), ); } async function createTimetable(req, res) { let data = req.body; if (!data.title || !data.data || !data.class) { sendMissingArguments(res); return; } const timetable = await prisma.timetable.create({ data: req.body, }); res.status(201).send(timetable); } async function editTimetable(req, res) { let id = parseInt(req.query.id); if (!id) { sendMissingArguments(res); return; } try { const timetable = await prisma.timetable.update({ where: { id, }, data: req.body, }); res.status(201).send(timetable); } catch (e) { res.status(500).send(e); } } async function deleteTimetable(req, res) { if (!req.query.id) { sendMissingArguments(res); return; } try { await prisma.timetable.delete({ where: { id: parseInt(req.query.id), }, }); res.status(200).send(); } catch (e) { res.status(500).send(e); } } async function listKeys(_, res) { res.send(await prisma.key.findMany()); } async function createKey(req, res) { let data = req.body; if (!data.key) { sendMissingArguments(res); return; } const existingKey = await prisma.key.findUnique({ where: { key: data.key, }, }); if (existingKey) { res.status(400).send({ success: false, error: "key_already_exists", }); return; } const key = await prisma.key.create({ data: { key: data.key, permissions: data.permissions || [], validUntil: data.validUntil, notes: data.notes, }, }); res.status(201).send(key); } async function editKey(req, res) { if (!req.query.id) { sendMissingArguments(res); return; } try { const timetable = await prisma.key.update({ where: { key: req.query.id, }, data: req.body, }); res.status(201).send(timetable); } catch (e) { res.status(500).send(e); } } async function deleteKey(req, res) { if (!req.query.id) { sendMissingArguments(res); return; } try { await prisma.key.delete({ where: { key: req.query.id, }, }); res.status(200).send(); } catch (e) { res.status(500).send(e); } }