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, }); }