From 3c8cea8c7145b627432592ee87fd49ea2d7129e8 Mon Sep 17 00:00:00 2001 From: Stephan <57194608+stephan418@users.noreply.github.com> Date: Thu, 28 Apr 2022 16:14:48 +0200 Subject: [PATCH] Add routes for getting disciplines + Throwing an error still crashes the server --- src/Controllers/discipline.controller.ts | 102 +++++++++++++++++++++++ src/Routes/discipline.routes.ts | 9 ++ src/app.ts | 5 +- 3 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 src/Controllers/discipline.controller.ts create mode 100644 src/Routes/discipline.routes.ts diff --git a/src/Controllers/discipline.controller.ts b/src/Controllers/discipline.controller.ts new file mode 100644 index 0000000..8a927a1 --- /dev/null +++ b/src/Controllers/discipline.controller.ts @@ -0,0 +1,102 @@ +import { Prisma, Organisation, Admin, AdminLevel, Team } from "@prisma/client"; +import { Request, Response } from "express"; +import prisma from "../lib/prisma"; +import ForwardableError from "../Middleware/error/ForwardableError"; + +const basicDiscipline = { + pid: true, + name: true, + visual: { select: { pid: true, location: true } }, + maxTeamSize: true, + minTeamSize: true, + event: { select: { pid: true, name: true } }, + roles: { select: { pid: true, name: true } }, +} as const; + +const authenticatedDiscipline = { + ...basicDiscipline, + teams: { select: { pid: true, name: true } }, +} as const; + +const elevatedDiscipline: Prisma.DisciplineFindManyArgs["select"] = { + ...authenticatedDiscipline, + teams: { select: { pid: true, name: true, leaderEmail: true } }, +}; + +export const _getAllDisciplines = async ( + res: Response, + authenticated: boolean | undefined, + eventId: string | undefined +) => { + const disciplines = await prisma.discipline.findMany({ + where: { event: { pid: eventId } }, + select: !authenticated ? basicDiscipline : authenticatedDiscipline, + }); + + return res.status(200).json({ + type: "success", + payload: { + disciplines, + }, + }); +}; + +interface GetAllDisciplinesSearchParams { + eventPid?: string; +} + +export const getAllDisciplines = async (req: Request<{}, {}, {}, GetAllDisciplinesSearchParams>, res: Response) => { + return _getAllDisciplines(res, req.auth?.isAuthenticated, req.query.eventPid); +}; + +interface GetAllDisciplinesQueryParams { + eventPid: string; +} + +export const GetAllDisciplinesWithParam = async (req: Request, res: Response) => { + return _getAllDisciplines(res, req.auth?.isAuthenticated, req.params.eventPid); +}; + +interface GetDisciplineQueryParams { + pid: string; +} + +export const getDiscipline = async (req: Request, res: Response) => { + const { pid } = req.params; + + const discipline = await prisma.discipline.findUnique({ + where: { pid }, + select: !req.auth?.isAuthenticated + ? basicDiscipline + : req.auth.permission_level !== "ELEVATED" + ? authenticatedDiscipline + : elevatedDiscipline, + }); + + if (!discipline) { + throw new ForwardableError(404, `The discipline with ID ${pid} could not be found`); + } + + return res.status(200).json({ + type: "success", + payload: { + discipline: { + ...discipline, + event: { + ...discipline.event, + _links: [{ rel: "self", type: "GET", href: `/api/events/${discipline.event.pid}` }], + }, + roles: discipline.roles.map((role) => ({ + ...role, + _links: [{ rel: "self", type: "GET", href: `/api/role/${role.pid}` }], + })), + ...((discipline as any).teams + ? (discipline as any).teams.map((team: Team) => ({ + ...team, + _links: [{ rel: "self", type: "GET", href: `/api/teams/${team.pid}` }], + })) + : {}), + }, + }, + }); +}; diff --git a/src/Routes/discipline.routes.ts b/src/Routes/discipline.routes.ts new file mode 100644 index 0000000..ef158cd --- /dev/null +++ b/src/Routes/discipline.routes.ts @@ -0,0 +1,9 @@ +import express from "express"; +import { getAllDisciplines, getDiscipline } from "../Controllers/discipline.controller"; + +const router = express.Router(); + +router.get("/", getAllDisciplines); // TODO: Optional auth +router.get("/:pid", getDiscipline); + +export default router; diff --git a/src/app.ts b/src/app.ts index da3df2c..64e9789 100644 --- a/src/app.ts +++ b/src/app.ts @@ -6,6 +6,7 @@ import argon2 from "argon2"; import adminRouter from "./Routes/admin.routes"; import organisationRouter from "./Routes/organisation.routes"; import groupRouter from "./Routes/group.routes"; +import disciplineRouter from "./Routes/discipline.routes"; import defaultErrorHandler from "./Middleware/error/handler"; import logger from "./Middleware/error/logger"; import debugLogger from "./Middleware/debug/logger"; @@ -53,8 +54,10 @@ async function main() { app.use("/api/groups", groupRouter); + app.use("/api/disciplines", disciplineRouter); + // Error handling - app.use(defaultErrorHandler); + app.use(defaultErrorHandler); // Not working app.listen(process.env.PORT, () => { logger.info(`Listening on port ${process.env.PORT}`);