From d1127968c80501613f481bf16646a6d214597761 Mon Sep 17 00:00:00 2001 From: Regalijan Date: Mon, 18 Nov 2024 02:11:41 -0500 Subject: [PATCH] Support real-time point updates --- .../api/events-team/events/[id]/certify.ts | 34 ++++++++++++++++--- .../api/events-team/events/[id]/complete.ts | 33 +++++++++++++++--- .../api/events-team/events/[id]/forgotten.ts | 34 ++++++++++++++++--- 3 files changed, 86 insertions(+), 15 deletions(-) diff --git a/functions/api/events-team/events/[id]/certify.ts b/functions/api/events-team/events/[id]/certify.ts index 6a98e51..91bfa27 100644 --- a/functions/api/events-team/events/[id]/certify.ts +++ b/functions/api/events-team/events/[id]/certify.ts @@ -4,11 +4,35 @@ export async function onRequestPost(context: RequestContext) { if (context.data.event.reached_minimum_player_count) return jsonError("This event is already certified", 400); - await context.env.D1.prepare( - "UPDATE events SET reached_minimum_player_count = 1 WHERE id = ?;", - ) - .bind(context.data.event.id) - .run(); + const { D1 } = context.env; + + await D1.exec("BEGIN TRANSACTION;"); + + try { + const row = await D1.prepare( + "UPDATE events SET reached_minimum_player_count = 1 WHERE id = ? RETURNING created_by;", + ) + .bind(context.data.event.id) + .first(); + + if (!row) { + await D1.exec("ROLLBACK;"); + return jsonError("Event does not exist", 404); + } + + await D1.prepare("UPDATE et_members SET points = points + 10 WHERE id = ?;") + .bind(row.created_by) + .run(); + await D1.exec("COMMIT;"); + } catch (e) { + console.log(e); + await D1.exec("ROLLBACK;"); + + return jsonError( + "Failed to certify event because the event or points could not be updated", + 500, + ); + } return new Response(null, { status: 204, diff --git a/functions/api/events-team/events/[id]/complete.ts b/functions/api/events-team/events/[id]/complete.ts index 4feea44..07712f8 100644 --- a/functions/api/events-team/events/[id]/complete.ts +++ b/functions/api/events-team/events/[id]/complete.ts @@ -1,11 +1,34 @@ +import { jsonError } from "../../../../common.js"; + export async function onRequestPost(context: RequestContext) { const id = context.params.id as string; + const { D1 } = context.env; + + await D1.exec("BEGIN TRANSACTION;"); + + try { + const row = await D1.prepare( + "UPDATE events SET performed_at = ? WHERE id = ? RETURNING created_by;", + ) + .bind(Date.now(), id) + .first(); + + if (!row) { + await D1.exec("ROLLBACK;"); + return jsonError("Event does not exist", 404); + } + + await D1.prepare("UPDATE et_members SET points = points + 10 WHERE id = ?;") + .bind(row.created_by) + .run(); + + await D1.exec("COMMIT;"); + } catch (e) { + console.log(e); + await D1.exec("ROLLBACK;"); - await context.env.D1.prepare( - "UPDATE events SET performed_at = ? WHERE id = ?;", - ) - .bind(Date.now(), id) - .run(); + return jsonError("Failed to update event data", 500); + } return new Response(null, { status: 204, diff --git a/functions/api/events-team/events/[id]/forgotten.ts b/functions/api/events-team/events/[id]/forgotten.ts index 48adcda..f92f016 100644 --- a/functions/api/events-team/events/[id]/forgotten.ts +++ b/functions/api/events-team/events/[id]/forgotten.ts @@ -1,11 +1,35 @@ +import { jsonError } from "../../../../common.js"; + export async function onRequestPost(context: RequestContext) { const id = context.params.id as string; + const { D1 } = context.env; + + await D1.exec("BEGIN TRANSACTION;"); + + try { + const row = await D1.prepare( + "UPDATE events SET performed_at = 0 WHERE id = ? RETURNING created_by;", + ) + .bind(id) + .first(); + + if (!row) { + await D1.exec("ROLLBACK;"); + return jsonError("Nonexistent event cannot be marked as forgotten.", 404); + } + + await D1.prepare("UPDATE et_members SET points = points - 5 WHERE id = ?;") + .bind(row.created_by) + .run(); + } catch (e) { + console.log(e); + await D1.exec("ROLLBACK;"); - await context.env.D1.prepare( - "UPDATE events SET performed_at = 0 WHERE id = ?;", - ) - .bind(id) - .run(); + return jsonError( + "Failed to mark event as forgotten, points were not changed.", + 500, + ); + } return new Response(null, { status: 204,