From 757cec74388ea5e60c7d8f0cdf686018d302f785 Mon Sep 17 00:00:00 2001 From: minie4 Date: Fri, 30 Jun 2023 20:52:36 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Add=20key=20management=20to=20admin?= =?UTF-8?q?=20settings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/api/admin.js | 74 ++++++++ src/components/settings/expand-section.vue | 1 + src/components/settings/key-card.vue | 13 +- src/views/settings/AdminSettings.vue | 206 ++++++++++++++++----- src/views/settings/KeySettings.vue | 1 + 5 files changed, 251 insertions(+), 44 deletions(-) diff --git a/server/api/admin.js b/server/api/admin.js index 3b5fb98..cb7044f 100644 --- a/server/api/admin.js +++ b/server/api/admin.js @@ -6,6 +6,11 @@ export function registerAdmin(app) { 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) { @@ -76,3 +81,72 @@ async function deleteTimetable(req, res) { 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); + } +} diff --git a/src/components/settings/expand-section.vue b/src/components/settings/expand-section.vue index a6a9d8a..9e8de26 100644 --- a/src/components/settings/expand-section.vue +++ b/src/components/settings/expand-section.vue @@ -24,5 +24,6 @@ defineProps(["title"]); user-select: none; font-size: 19px; margin: 5px 0px; + cursor: pointer; } diff --git a/src/components/settings/key-card.vue b/src/components/settings/key-card.vue index 9e17ed5..078ca54 100644 --- a/src/components/settings/key-card.vue +++ b/src/components/settings/key-card.vue @@ -1,4 +1,5 @@