diff --git a/src/Router.ts b/src/Router.ts index a8799ba..3423de0 100644 --- a/src/Router.ts +++ b/src/Router.ts @@ -242,10 +242,11 @@ router.use( routerGroup((r: Router) => { r.get("/template", LogTemplateAdministrationController.getAll); r.post("/template", LogTemplateAdministrationController.create); + r.get("/template/min", LogTemplateAdministrationController.getAllMinimalData); + r.get("/template/:id", LogTemplateAdministrationController.getByID); r.patch("/template/:id", LogTemplateAdministrationController.update); - - r.get("/template/min", LogTemplateAdministrationController.getAllMinimalData); + r.delete("/template/:id", LogTemplateAdministrationController.destroy); }) ); diff --git a/src/controllers/log-template/LogTemplateAdminController.ts b/src/controllers/log-template/LogTemplateAdminController.ts index a52460e..c9375ca 100644 --- a/src/controllers/log-template/LogTemplateAdminController.ts +++ b/src/controllers/log-template/LogTemplateAdminController.ts @@ -114,10 +114,33 @@ async function update(request: Request, response: Response, next: NextFunction) } } +/** + * Delete a training log template + * @param request + * @param response + * @param next + */ +async function destroy(request: Request, response: Response, next: NextFunction) { + try { + const params = request.params as { id: string }; + + await TrainingLogTemplate.destroy({ + where: { + id: params.id, + }, + }); + + response.sendStatus(HttpStatusCode.Ok); + } catch (e) { + next(e); + } +} + export default { getAll, getAllMinimalData, getByID, create, update, + destroy, }; diff --git a/src/controllers/training-session/TrainingSessionAdminController.ts b/src/controllers/training-session/TrainingSessionAdminController.ts index 32fe5dc..a07ad94 100644 --- a/src/controllers/training-session/TrainingSessionAdminController.ts +++ b/src/controllers/training-session/TrainingSessionAdminController.ts @@ -1,4 +1,4 @@ -import { Request, Response } from "express"; +import { NextFunction, Request, Response } from "express"; import { User } from "../../models/User"; import _TrainingSessionAdminValidator from "./_TrainingSessionAdminValidator"; import { Course } from "../../models/Course"; @@ -358,39 +358,39 @@ async function getCourseTrainingTypes(request: Request, response: Response) { response.send(session.course?.training_types); } -async function createTrainingLogs(request: Request, response: Response) { - const user: User = request.body.user; - const params = request.params as { uuid: string }; - const body = request.body as { - user_id: number; - next_training_id: number; - course_completed: boolean; - log_public: boolean; - passed: boolean; - user_log: any[]; - }[]; - - if (body == null || body.length == 0) { - response.sendStatus(HttpStatusCode.BadRequest); - return; - } - - const session = await TrainingSession.findOne({ - where: { - uuid: params.uuid, - }, - include: [TrainingSession.associations.course], - }); - - if (session == null) { - response.sendStatus(HttpStatusCode.InternalServerError); - return; - } - +async function createTrainingLogs(request: Request, response: Response, next: NextFunction) { // All of these steps MUST complete, else we are left in an undefined state const t = await sequelize.transaction(); try { + const user: User = request.body.user; + const params = request.params as { uuid: string }; + const body = request.body as { + user_id: number; + next_training_id: number; + course_completed: boolean; + log_public: boolean; + passed: boolean; + user_log: any[]; + }[]; + + if (body == null || body.length == 0) { + response.sendStatus(HttpStatusCode.BadRequest); + return; + } + + const session = await TrainingSession.findOne({ + where: { + uuid: params.uuid, + }, + include: [TrainingSession.associations.course], + }); + + if (session == null) { + response.sendStatus(HttpStatusCode.InternalServerError); + return; + } + for (let i = 0; i < body.length; i++) { const user_id = body[i].user_id; @@ -476,18 +476,16 @@ async function createTrainingLogs(request: Request, response: Response) { } await t.commit(); + + await session.update({ + completed: true, + }); + + response.sendStatus(HttpStatusCode.Ok); } catch (e) { await t.rollback(); - response.sendStatus(HttpStatusCode.BadRequest); - console.error(e); - return; + next(e); } - - await session.update({ - completed: true, - }); - - response.sendStatus(HttpStatusCode.Ok); } export default { diff --git a/src/middlewares/ExceptionInterceptorMiddleware.ts b/src/middlewares/ExceptionInterceptorMiddleware.ts index cb4a248..27cebb0 100644 --- a/src/middlewares/ExceptionInterceptorMiddleware.ts +++ b/src/middlewares/ExceptionInterceptorMiddleware.ts @@ -5,6 +5,8 @@ import { ValidationException } from "../exceptions/ValidationException"; import { UnauthorizedException } from "../exceptions/UnauthorizedException"; import { VatsimConnectException } from "../exceptions/VatsimConnectException"; +const sequelizeErrors = ["SequelizeValidationError", "SequelizeForeignKeyConstraintError"]; + export async function exceptionInterceptorMiddleware(error: any, request: Request, response: Response, next: NextFunction) { if (error instanceof UnauthorizedException) { response.status(HttpStatusCode.Unauthorized).send({ @@ -42,7 +44,7 @@ export async function exceptionInterceptorMiddleware(error: any, request: Reques return; } - if (error.name === "SequelizeValidationError") { + if (sequelizeErrors.includes(error.name)) { response.status(HttpStatusCode.InternalServerError).send({ path: request.url, method: request.method, @@ -52,7 +54,6 @@ export async function exceptionInterceptorMiddleware(error: any, request: Reques return; } - console.error(error); response.status(HttpStatusCode.InternalServerError).send({ path: request.url, method: request.method,