From 6f730d121416ce99adb383446bf97a4f49b1dd12 Mon Sep 17 00:00:00 2001 From: Stefan-5422 <32109571+Stefan-5422@users.noreply.github.com> Date: Mon, 30 May 2022 20:58:16 +0200 Subject: [PATCH] Add team routes --- src/Controllers/team.controller.ts | 98 ++++++++++++++++++++++++++++++ src/Routes/team.routes.ts | 8 ++- src/app.ts | 3 + 3 files changed, 106 insertions(+), 3 deletions(-) diff --git a/src/Controllers/team.controller.ts b/src/Controllers/team.controller.ts index e69de29..1f2a5dd 100644 --- a/src/Controllers/team.controller.ts +++ b/src/Controllers/team.controller.ts @@ -0,0 +1,98 @@ +import { Request, Response } from "express"; +import prisma from "../lib/prisma"; +import { createInsufficientPermissionsError, DataType, generateInvalidBodyError } from "./common"; +import { requireLeaderOfTeam } from "../Middleware/auth/teamleaderAuth"; +import { z } from "zod"; + +const TeamBody = z.object({ + teamName: z.string().min(1), + leaderEmail: z.string().email(), + disciplineId: z.string().uuid(), + partFirstName: z.string().min(1), + partLastName: z.string().min(1), + partGroupId: z.string().uuid(), +}); + +interface CreateTeamBody { + teamName: string; + leaderEmail: string; + disciplineId: string; + partFirstName: string; + partLastName: string; + partGroupId: string; +} + +export const getTeams = async (req: Request, res: Response) => { + const teams = prisma.team.findMany({ select: { pid: true, name: true, disciplineId: true } }); + + res.status(200).json(teams); +}; + +export const getTeam = async (req: Request, res: Response) => { + const { pid } = req.params; + + const team = prisma.team.findUnique({ + where: { pid }, + select: { + disciplineId: true, + name: true, + pid: true, + }, + }); + + res.status(200).json(team); +}; + +export const updateTeam = async (req: Request, res: Response) => { + const result = TeamBody.merge(z.object({ pid: z.string().min(1) })) + .omit({ partGroupId: true, partFirstName: true, partLastName: true }) + .safeParse(req.body); + + if (result.success === false) { + return res.status(400).json( + generateInvalidBodyError( + { + teamName: DataType.STRING, + leaderEmail: DataType.STRING, + disciplineId: DataType.UUID, + }, + result.error + ) + ); + } + + const body = result.data; + + try { + requireLeaderOfTeam(req.teamleader, body.pid); + } catch { + return res.status(401).json(createInsufficientPermissionsError("STANDARD")); + } + + const team = prisma.team.update({ + where: { + pid: body.pid, + }, + data: { + name: body.teamName, + discipline: { connect: { pid: body.disciplineId } }, + leaderEmail: body.leaderEmail, + }, + }); + + res.status(204).json(team); +}; + +export const deleteTeam = async (req: Request, res: Response) => { + const { pid } = req.params; + + try { + requireLeaderOfTeam(req.teamleader, pid); + } catch { + return res.status(401).json(createInsufficientPermissionsError("STANDARD")); + } + + prisma.team.delete({ where: { pid } }); + + res.status(204).json("Welp its gone"); +}; diff --git a/src/Routes/team.routes.ts b/src/Routes/team.routes.ts index c05b60c..a12afb1 100644 --- a/src/Routes/team.routes.ts +++ b/src/Routes/team.routes.ts @@ -1,12 +1,14 @@ import express from "express"; -import { requireAuthentication } from "../Middleware/auth/auth"; +import { requireAuthentication, requireConfiguredAuthentication } from "../Middleware/auth/auth"; import { requireTeamleaderAuthentication } from "../Middleware/auth/teamleaderAuth"; -import { register } from "../Controllers/user_auth.controller"; +import { deleteTeam, getTeam, getTeams, updateTeam } from "../Controllers/team.controller"; const router = express.Router(); -router.post("/", requireAuthentication, requireTeamleaderAuthentication, register); +router.get("/", requireConfiguredAuthentication({ type: "admin", optional: false }), getTeams); +router.get("/:id", getTeam); +router.put("/", requireTeamleaderAuthentication, updateTeam); router.delete<"/:pid/", { pid: string }>("/:pid/", requireAuthentication, requireTeamleaderAuthentication, deleteTeam); export default router; diff --git a/src/app.ts b/src/app.ts index e65ac98..7a41c6c 100644 --- a/src/app.ts +++ b/src/app.ts @@ -14,6 +14,7 @@ import logger from "./Middleware/error/logger"; import debugLogger from "./Middleware/debug/logger"; import mediaRouter from "./Routes/media.routes"; import userRouter from "./Routes/user_auth.routes"; +import TeamRouter from "./Routes/team.routes"; import { notFoundHandler, rootHandler } from "./Middleware/error/defaultRoutes"; // Set up async error handling @@ -86,6 +87,8 @@ async function main() { app.use("/api/users", userRouter); + app.use("/api/teams", TeamRouter); + app.get("/", rootHandler); app.get("/api", rootHandler);