108 lines
2.9 KiB
TypeScript

import { jsonError } from "../../../common.js";
export async function onRequestPost(context: RequestContext) {
const { day, details, type } = context.data.body;
const now = new Date();
const currentMonth = now.getUTCMonth() + 1;
const currentYear = now.getUTCFullYear();
const lastDayOfMonth = new Date(currentYear, currentMonth, 0).getUTCDate();
if (
typeof day !== "number" ||
day < 1 ||
// Last day of that month
day > lastDayOfMonth ||
// Stop people sending weird decimal days
parseInt(day.toString()) !== day ||
typeof details !== "string" ||
!details.length ||
!["fotd", "gamenight", "rotw", "qotd"].includes(type) ||
(type === "rotw" && !context.data.body.answer)
)
return jsonError("Invalid body", 400);
if (
await context.env.D1.prepare(
"SELECT * FROM events WHERE (approved = 1 OR pending =1) AND day = ? AND month = ? AND type = ? AND year = ?;",
)
.bind(day, currentMonth, type, currentYear)
.first()
)
return jsonError(
"Event with that type already exists for the specified date",
400,
);
if (type === "rotw") {
const weekRanges: { [k: number]: number } = {
0: 7,
1: 14,
2: 21,
3: 28,
4: 35,
};
const weekRange = Math.floor(day / 7);
const existingEventInRange = await context.env.D1.prepare(
"SELECT id FROM events WHERE (approved = 1 OR pending = 1) AND day BETWEEN ? AND ? AND month = ? AND type = 'rotw' AND year = ?;",
)
.bind(
weekRanges[weekRange] - 7,
weekRanges[weekRange],
currentMonth,
currentYear,
)
.first();
if (existingEventInRange)
return jsonError("There is already an rotw for that week", 400);
}
const id = `${now.getTime()}${crypto.randomUUID().replaceAll("-", "")}`;
await context.env.D1.prepare(
"INSERT INTO events (answer, approved, created_at, created_by, day, details, id, month, pending, type, year) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);",
)
.bind(
context.data.body.answer || null,
now.getTime(),
Number(type === "gamenight"),
context.data.current_user.id,
day,
details,
id,
currentMonth,
Number(type !== "gamenight"),
type,
currentYear,
)
.run();
await fetch(context.env.EVENTS_WEBHOOK, {
body: JSON.stringify({
embeds: [
{
title: "Event Submitted",
color: 3756250,
description: `${context.data.current_user.username} submitted an event for ${currentYear}-${currentMonth}-${day}. See it at https://carcrushers.cc/events-team`,
},
],
}),
headers: {
"content-type": "application/json",
},
method: "POST",
});
await context.env.DATA.put(
`eventemail_${id}`,
context.data.current_user.email,
{ expirationTtl: 2678400 },
);
return new Response(null, {
status: 204,
});
}