From a0f507b751d72db65e6ed50b1f7f89ec41d4e3cc Mon Sep 17 00:00:00 2001 From: regalijan Date: Thu, 19 Oct 2023 16:49:39 -0400 Subject: [PATCH] Create new inactivity endpoint --- functions/api/inactivity/new.ts | 76 +++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 functions/api/inactivity/new.ts diff --git a/functions/api/inactivity/new.ts b/functions/api/inactivity/new.ts new file mode 100644 index 0000000..baf5ccc --- /dev/null +++ b/functions/api/inactivity/new.ts @@ -0,0 +1,76 @@ +export async function onRequestPost(context: RequestContext) { + if (!context.data.departments) + return new Response('{"error":"Not in any departments"}', { + headers: { + "content-type": "application/json", + }, + status: 403, + }); + + const { departments, end, reason, start } = context.data.body; + + if ( + !Array.isArray(departments) || + !departments.length || + typeof end !== "string" || + typeof reason !== "string" || + typeof start !== "string" + ) + return new Response('{"error":"Invalid notice"}', { + headers: { + "content-type": "application/json", + }, + status: 400, + }); + + const endDate = new Date(end); + const startDate = new Date(start); + const now = new Date(); + + if ( + isNaN(endDate.getFullYear()) || + isNaN(startDate.getFullYear()) || + endDate.getFullYear() < now.getFullYear() || + endDate.getFullYear() > now.getFullYear() + 1 || + startDate.getFullYear() < now.getFullYear() || + startDate.getFullYear() > now.getFullYear() + 1 || + endDate.valueOf() < startDate.valueOf() + ) + return new Response('{"error":"Dates are invalid"}', { + headers: { + "content-type": "application/json", + }, + status: 400, + }); + + if (!departments.every(d => context.data.departments.includes(d))) + return new Response('{"error":"Cannot file a notice in a department you are not part of"}', { + headers: { + "content-type": "application/json", + }, + status: 400, + }); + + const inactivityId = + context.data.current_user.id + + (context.request.headers.get("cf-ray") as string).split("-")[0] + + Date.now().toString(); + + await context.env.DATA.put(`inactivity_${inactivityId}`, JSON.stringify({ + departments, + end, + reason, + start, + user: { + discriminator: context.data.current_user.discriminator, + id: context.data.current_user.id, + username: context.data.current_user.username, + }, + }), { + expirationTtl: 63072000 + }); + + return new Response(null, { + status: 204, + }); +}