169 lines
4.5 KiB
TypeScript
169 lines
4.5 KiB
TypeScript
import { jsonError, jsonResponse } from "../../common.js";
|
|
import sendEmail from "../../email.js";
|
|
import { sendPushNotification } from "../../gcloud.js";
|
|
import { type JsonArray, type JsonObject } from "@prisma/client/runtime/client";
|
|
|
|
export async function onRequestDelete(context: RequestContext) {
|
|
const result = await context.data.prisma.inactivityNotice.findUnique({
|
|
select: {
|
|
user: true,
|
|
},
|
|
where: {
|
|
id: context.params.id as string,
|
|
},
|
|
});
|
|
|
|
if (!result) return jsonError("No inactivity notice with that ID", 404);
|
|
|
|
if (
|
|
(result.user as JsonObject).id !== context.data.current_user.id &&
|
|
!(context.data.current_user.permissions & (1 << 0))
|
|
)
|
|
return jsonError(
|
|
"You do not have permission to delete this inactivity notice",
|
|
403,
|
|
);
|
|
|
|
await context.env.D1.prepare("DELETE FROM inactivity_notices WHERE id = ?;")
|
|
.bind(context.params.id)
|
|
.run();
|
|
|
|
return new Response(null, {
|
|
status: 204,
|
|
});
|
|
}
|
|
|
|
export async function onRequestGet(context: RequestContext) {
|
|
const { current_user: currentUser } = context.data;
|
|
|
|
if (
|
|
![1 << 0, 1 << 2, 1 << 3, 1 << 9, 1 << 10].find(
|
|
(p) => currentUser.permissions & p,
|
|
)
|
|
)
|
|
return jsonError("Forbidden", 403);
|
|
|
|
const result = await context.data.prisma.inactivityNotice.findUnique({
|
|
where: {
|
|
id: context.params.id as string,
|
|
},
|
|
});
|
|
|
|
return jsonResponse(JSON.stringify(result));
|
|
}
|
|
|
|
export async function onRequestPost(context: RequestContext) {
|
|
const { accepted }: { accepted?: any } = context.data.body;
|
|
|
|
if (typeof accepted !== "boolean")
|
|
return jsonError("'accepted' must be a boolean", 400);
|
|
|
|
const adminDepartments: { [k: string]: number } = {
|
|
DM: 1 << 11,
|
|
ET: 1 << 4,
|
|
FM: 1 << 7,
|
|
WM: 1 << 6,
|
|
};
|
|
|
|
const userAdminDepartments = Object.keys(adminDepartments).filter(
|
|
(dept) => context.data.current_user.permissions & adminDepartments[dept],
|
|
);
|
|
|
|
if (!userAdminDepartments.length)
|
|
return jsonError("You are not a manager of any departments", 403);
|
|
|
|
const requestedNotice = await context.data.prisma.inactivityNotice.findUnique(
|
|
{
|
|
select: {
|
|
decisions: true,
|
|
departments: true,
|
|
user: true,
|
|
},
|
|
where: {
|
|
id: context.params.id as string,
|
|
},
|
|
},
|
|
);
|
|
|
|
if (!requestedNotice)
|
|
return jsonError("Inactivity notices does not exist", 404);
|
|
|
|
const decisions = requestedNotice.decisions as { [k: string]: boolean };
|
|
|
|
for (const department of userAdminDepartments) {
|
|
if (!(requestedNotice.departments as JsonArray).includes(department))
|
|
continue;
|
|
decisions[department] = accepted;
|
|
}
|
|
|
|
const applicableDepartments = (requestedNotice.departments as JsonArray)
|
|
.length;
|
|
const user = requestedNotice.user as JsonObject;
|
|
|
|
delete user.email;
|
|
|
|
await context.data.prisma.inactivityNotice.update({
|
|
data: {
|
|
decisions,
|
|
user,
|
|
},
|
|
where: {
|
|
id: context.params.id as string,
|
|
},
|
|
});
|
|
|
|
if (Object.values(decisions).length === applicableDepartments) {
|
|
const approved =
|
|
Object.values(decisions).filter((d) => d).length ===
|
|
applicableDepartments;
|
|
const denied =
|
|
Object.values(decisions).filter((d) => !d).length !==
|
|
applicableDepartments;
|
|
const fcmTokenResult =
|
|
await context.data.prisma.pushNotification.findUnique({
|
|
select: {
|
|
token: true,
|
|
},
|
|
where: {
|
|
event_id: context.params.id as string,
|
|
event_type: "inactivity",
|
|
},
|
|
});
|
|
|
|
if (fcmTokenResult) {
|
|
let status = "Approved";
|
|
|
|
if (denied) status = "Denied";
|
|
else if (!approved) status = "Partially Approved";
|
|
|
|
await sendPushNotification(
|
|
context.env,
|
|
`Inactivity Request ${status}`,
|
|
accepted
|
|
? "Your inactivity request was approved."
|
|
: `Your inactivity request was ${denied ? "denied" : "partially approved"}, please reach out to management if you require more details.`,
|
|
fcmTokenResult.token,
|
|
);
|
|
|
|
await context.data.prisma.pushNotification.delete({
|
|
where: {
|
|
event_id: context.params.id as string,
|
|
event_type: "inactivity",
|
|
},
|
|
});
|
|
} else {
|
|
await sendEmail(
|
|
(requestedNotice.user as JsonObject).email as string,
|
|
context.env.MAILGUN_API_KEY,
|
|
`Inactivity Request ${approved ? "Approved" : "Denied"}`,
|
|
`inactivity_${approved ? "approved" : "denied"}`,
|
|
{ username: (requestedNotice.user as JsonObject).username as string },
|
|
);
|
|
}
|
|
}
|
|
|
|
return new Response(null, {
|
|
status: 204,
|
|
});
|
|
}
|