From a47d913d6fdcb9d5b8d56a8c1cc9d2b6f746d06b Mon Sep 17 00:00:00 2001 From: minie4 Date: Sun, 1 May 2022 23:23:20 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Add=20timetable,=20substitutions=20?= =?UTF-8?q?and=20history=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/api/index.js | 129 ++++++++++++++++++++++++++++++++++++++++++++ server/index.js | 14 +++-- 2 files changed, 138 insertions(+), 5 deletions(-) create mode 100644 server/api/index.js diff --git a/server/api/index.js b/server/api/index.js new file mode 100644 index 0000000..34f8452 --- /dev/null +++ b/server/api/index.js @@ -0,0 +1,129 @@ +import Prisma from "@prisma/client"; +const prisma = new Prisma.PrismaClient(); + +export async function getTimetable(req, res) { + if (!req.query.class) { + res.status(400).send({ + success: false, + error: "missing_parameter", + message: "No class parameter provided", + }); + return; + } + const requestedClass = req.query.class.toLowerCase(); + const timetable = await prisma.timetable.findFirst({ + where: { + class: requestedClass, + }, + orderBy: { + updatedAt: "desc", + }, + }); + if (!timetable) { + res.status(400).send({ + success: false, + error: "no_timetable", + message: "No timetable was found for this class", + }); + return; + } + res.send(timetable.data); +} + +export async function getSubstitutions(req, res) { + const requestedClass = (req.query.class || "").toLowerCase(); + var from, to, date; + if (req.query.from && req.query.to) { + from = new Date(req.query.from).setUTCHours(0, 0, 0, 0); + to = new Date(req.query.to).setUTCHours(0, 0, 0, 0); + } else { + date = new Date(req.query.date || new Date()).setUTCHours(0, 0, 0, 0); + console.log(date); + } + + const prismaOptions = { + where: { + removed: false, + }, + orderBy: { + lesson: "asc", + }, + }; + if (requestedClass) { + prismaOptions.where.class = { has: requestedClass }; + } + if (from && to) { + prismaOptions.where.date = { + gte: new Date(from), + lte: new Date(to), + }; + } else { + prismaOptions.where.date = new Date(date); + } + + const rawSubstitutions = await prisma.substitution.findMany(prismaOptions); + const substitutions = rawSubstitutions.map((element) => { + const substitution = { + id: element.id, + class: element.class, + type: element.type, + lesson: element.lesson, + date: new Date(element.date).getTime(), + change: {}, + }; + if (element.changedRoom) substitution.change.room = element.changedRoom; + if (element.changedTeacher) + substitution.change.teacher = element.changedTeacher; + if (element.changedSubject) + substitution.change.subject = element.changedSubject; + return substitution; + }); + res.send(substitutions); +} + +export async function getHistory(req, res) { + const requestedClass = (req.query.class || "").toLowerCase(); + var from, to, date; + if (req.query.from && req.query.to) { + from = new Date(req.query.from).setUTCHours(0, 0, 0, 0); + to = new Date(req.query.to).setUTCHours(0, 0, 0, 0); + } else { + date = new Date(req.query.date || new Date()).setUTCHours(0, 0, 0, 0); + console.log(date); + } + + const prismaOptions = { + where: {}, + include: { + substitution: true, + }, + }; + if (requestedClass) { + prismaOptions.where.class = { has: requestedClass }; + } + if (from && to) { + prismaOptions.where.substitution = { + date: { + gte: new Date(from), + lte: new Date(to), + }, + }; + } else { + prismaOptions.where.substitution = { date: new Date(date) }; + } + + const rawChanges = await prisma.substitutionChange.findMany(prismaOptions); + const changes = rawChanges.map((element) => { + return { + id: element.id, + type: element.type, + substitutionId: element.substitutionId, + lesson: element.substitution.lesson, + updatedAt: new Date(element.createdAt).getTime(), + date: new Date(element.substitution.date).getTime(), + change: element.changes, + parseEventId: element.parseEventId, + }; + }); + res.send(changes); +} diff --git a/server/index.js b/server/index.js index 12cbe36..ecc1eab 100644 --- a/server/index.js +++ b/server/index.js @@ -1,15 +1,19 @@ import express from "express"; -import Prisma from "@prisma/client"; +import { getTimetable, getSubstitutions, getHistory } from "./api/index.js"; const app = express(); -const prisma = new Prisma.PrismaClient(); const port = process.send.PORT || 3000; -app.get("/", async (_req, res) => { - const result = await prisma.substitution.findMany(); - res.send(result); +app.get("/api/timetable", getTimetable); +app.get("/api/substitutions", getSubstitutions); +app.get("/api/history", getHistory); +app.get("/api/*", (req, res) => { + res.sendStatus(400); }); +app.use("/", express.static("../dist")); +app.use("/*", express.static("../dist")); + app.listen(port, () => { console.log(`Server listening on http://localhost:${port}`); });