111 lines
2.9 KiB
TypeScript
111 lines
2.9 KiB
TypeScript
import { jsonError } from "../../common.js";
|
|
import validateInactivityNotice from "./validate.js";
|
|
|
|
export async function onRequestDelete(context: RequestContext) {
|
|
const kvResult = await context.env.DATA.get(
|
|
`inactivity_${context.params.id}`,
|
|
);
|
|
|
|
if (!kvResult) return jsonError("No inactivity notice with that ID", 404);
|
|
|
|
if (
|
|
JSON.parse(kvResult).user.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.DATA.delete(`inactivity_${context.params.id}`);
|
|
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 onRequestPost(context: RequestContext) {
|
|
const { accepted }: { accepted?: boolean } = 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.values(adminDepartments).filter(
|
|
(dept) => context.data.current_user.permissions & dept,
|
|
);
|
|
|
|
if (!userAdminDepartments.length)
|
|
return jsonError("You are not a manager of any departments", 403);
|
|
|
|
const requestedNotice = await context.env.DATA.get(
|
|
`inactivity_${context.params.id as string}`,
|
|
{ type: "json" },
|
|
);
|
|
|
|
if (!requestedNotice)
|
|
return jsonError("Inactivity notices does not exist", 404);
|
|
}
|
|
|
|
export async function onRequestPut(context: RequestContext) {
|
|
const kvResult: InactivityNoticeProps | null = await context.env.DATA.get(
|
|
`inactivity_${context.params.id}`,
|
|
{ type: "json" },
|
|
);
|
|
|
|
if (!kvResult) return jsonError("No inactivity notice with that ID", 404);
|
|
|
|
if (kvResult.user.id !== context.data.current_user.id)
|
|
return jsonError(
|
|
"You do not have permission to modify this inactivity notice",
|
|
403,
|
|
);
|
|
|
|
const d1entry = await context.env.D1.prepare(
|
|
"SELECT open FROM inactivity_notices WHERE id = ?;",
|
|
)
|
|
.bind(context.params.id)
|
|
.run();
|
|
|
|
if (!Boolean(d1entry.results.at(0)?.open))
|
|
return jsonError("Cannot modify a closed inactivity notice", 403);
|
|
|
|
const { departments, end, reason, start } = context.data.body;
|
|
|
|
const validationFailureResponse = validateInactivityNotice(
|
|
departments,
|
|
end,
|
|
reason,
|
|
start,
|
|
context.data.departments,
|
|
);
|
|
|
|
if (validationFailureResponse) return validationFailureResponse;
|
|
|
|
kvResult.departments = departments;
|
|
kvResult.end = end;
|
|
kvResult.reason = reason;
|
|
kvResult.start = start;
|
|
|
|
await context.env.DATA.put(
|
|
`inactivity_${context.params.id}`,
|
|
JSON.stringify(kvResult),
|
|
{
|
|
expirationTtl: 63072000,
|
|
},
|
|
);
|
|
|
|
return new Response(null, {
|
|
status: 204,
|
|
});
|
|
}
|