83 lines
2.1 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();
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 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 day > ? AND day <= ? 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, created_at, created_by, day, id, month, type, year) VALUES (?, ?, ?, ?, ?, ?, ?);",
)
.bind(
context.data.body.answer || null,
now.getTime(),
context.data.current_user.id,
day,
id,
currentMonth,
type,
currentYear,
)
.run();
return new Response(null, {
status: 204,
});
}