From 92058110eede05a6082c2469b45b46bc131c789d Mon Sep 17 00:00:00 2001 From: Dlurak <84224239+Dlurak@users.noreply.github.com> Date: Wed, 10 Apr 2024 09:54:13 +0200 Subject: [PATCH] Implement an endpoint to delete calendar events --- src/routes/assignments/delete.ts | 4 +-- src/routes/calendar/delete.ts | 44 ++++++++++++++++++++++++++++++++ src/routes/calendar/index.ts | 4 ++- 3 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 src/routes/calendar/delete.ts diff --git a/src/routes/assignments/delete.ts b/src/routes/assignments/delete.ts index e278708..5d2f42a 100644 --- a/src/routes/assignments/delete.ts +++ b/src/routes/assignments/delete.ts @@ -1,5 +1,5 @@ import e from "@edgedb"; -import { DATABASE_READ_FAILED, UNAUTHORIZED } from "constants/responses"; +import { DATABASE_DELETE_FAILED, UNAUTHORIZED } from "constants/responses"; import Elysia from "elysia"; import { HttpStatusCode } from "elysia-http-status-code"; import { client } from "index"; @@ -27,7 +27,7 @@ export const deleteAssignment = new Elysia() if (result.isError) { set.status = httpStatus.HTTP_500_INTERNAL_SERVER_ERROR; - return DATABASE_READ_FAILED; + return DATABASE_DELETE_FAILED; } if (!result.data) { // Either the user isn't in the class and/or the homework doesn't exist diff --git a/src/routes/calendar/delete.ts b/src/routes/calendar/delete.ts new file mode 100644 index 0000000..aab15be --- /dev/null +++ b/src/routes/calendar/delete.ts @@ -0,0 +1,44 @@ +import e from "@edgedb"; +import { DATABASE_DELETE_FAILED, UNAUTHORIZED } from "constants/responses"; +import Elysia from "elysia"; +import { HttpStatusCode } from "elysia-http-status-code"; +import { client } from "index"; +import { auth } from "plugins/auth"; +import { promiseResult } from "utils/errors"; +import { responseBuilder } from "utils/response"; + +export const deleteCalendar = new Elysia() + .use(auth) + .use(HttpStatusCode()) + .delete("/:id", async ({ set, httpStatus, auth, params }) => { + if (!auth.isAuthorized) { + set.status = httpStatus.HTTP_401_UNAUTHORIZED; + return UNAUTHORIZED; + } + + const query = e.delete(e.Calendar, (c) => ({ + filter_single: e.op( + e.op(c.id, "=", e.cast(e.uuid, params.id)), + "and", + e.op(auth.username, "in", c.class.students.username), + ), + })); + + const result = await promiseResult(() => query.run(client)); + + if (result.isError) { + set.status = httpStatus.HTTP_500_INTERNAL_SERVER_ERROR; + return DATABASE_DELETE_FAILED; + } + if (!result.data) { + set.status = httpStatus.HTTP_404_NOT_FOUND; + return responseBuilder("error", { + error: "Calendar event not found in any of your classes", + }); + } + + return responseBuilder("success", { + message: "Successfully deleted calendar event", + data: null, + }); + }); diff --git a/src/routes/calendar/index.ts b/src/routes/calendar/index.ts index f0953cf..3a1e248 100644 --- a/src/routes/calendar/index.ts +++ b/src/routes/calendar/index.ts @@ -1,7 +1,9 @@ import Elysia from "elysia"; import { createCalendar } from "./create"; +import { deleteCalendar } from "./delete"; import { listCalendar } from "./list"; export const calendarRouter = new Elysia({ prefix: "/calendar" }) .use(createCalendar) - .use(listCalendar); + .use(listCalendar) + .use(deleteCalendar);