mirror of
https://github.com/detleph/server.git
synced 2026-09-07 23:44:40 +02:00
Add team routes
This commit is contained in:
@@ -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");
|
||||||
|
};
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
import express from "express";
|
import express from "express";
|
||||||
import { requireAuthentication } from "../Middleware/auth/auth";
|
import { requireAuthentication, requireConfiguredAuthentication } from "../Middleware/auth/auth";
|
||||||
import { requireTeamleaderAuthentication } from "../Middleware/auth/teamleaderAuth";
|
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();
|
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);
|
router.delete<"/:pid/", { pid: string }>("/:pid/", requireAuthentication, requireTeamleaderAuthentication, deleteTeam);
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import logger from "./Middleware/error/logger";
|
|||||||
import debugLogger from "./Middleware/debug/logger";
|
import debugLogger from "./Middleware/debug/logger";
|
||||||
import mediaRouter from "./Routes/media.routes";
|
import mediaRouter from "./Routes/media.routes";
|
||||||
import userRouter from "./Routes/user_auth.routes";
|
import userRouter from "./Routes/user_auth.routes";
|
||||||
|
import TeamRouter from "./Routes/team.routes";
|
||||||
import { notFoundHandler, rootHandler } from "./Middleware/error/defaultRoutes";
|
import { notFoundHandler, rootHandler } from "./Middleware/error/defaultRoutes";
|
||||||
|
|
||||||
// Set up async error handling
|
// Set up async error handling
|
||||||
@@ -86,6 +87,8 @@ async function main() {
|
|||||||
|
|
||||||
app.use("/api/users", userRouter);
|
app.use("/api/users", userRouter);
|
||||||
|
|
||||||
|
app.use("/api/teams", TeamRouter);
|
||||||
|
|
||||||
app.get("/", rootHandler);
|
app.get("/", rootHandler);
|
||||||
app.get("/api", rootHandler);
|
app.get("/api", rootHandler);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user