Add timetable, substitutions and history API

This commit is contained in:
2022-05-01 23:23:20 +02:00
parent 0fbcd02169
commit a47d913d6f
2 changed files with 138 additions and 5 deletions

129
server/api/index.js Normal file
View File

@ -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);
}

View File

@ -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}`);
});