diff --git a/app/routes/events-team_.report.tsx b/app/routes/events-team_.report.tsx index f061970..a285fe4 100644 --- a/app/routes/events-team_.report.tsx +++ b/app/routes/events-team_.report.tsx @@ -35,29 +35,24 @@ export async function loader({ context }: { context: RequestContext }) { month = 12; } - const eventMemberQuery = await context.env.D1.prepare( - "SELECT id, name, roblox_id FROM et_members;", - ).all(); - const inactivityQuery: D1Result> = - await context.env.D1.prepare( - "SELECT decisions, json_extract(user, '$.id') AS uid FROM inactivity_notices WHERE (end BETWEEN DATE('now', 'start of month', '-1 month') AND DATE('now', 'start of month', '-1 day')) OR (start BETWEEN DATE('now', 'start of month', '-1 month') AND DATE('now', 'start of month', '-1 day'));", - ).all(); + const batchStatements: D1Result>[] = + await context.env.D1.batch([ + context.env.D1.prepare("SELECT id, name, roblox_id FROM et_members;"), + context.env.D1.prepare( + "SELECT decisions, json_extract(user, '$.id') AS uid FROM inactivity_notices WHERE (end BETWEEN DATE('now', 'start of month', '-1 month') AND DATE('now', 'start of month', '-1 day')) OR (start BETWEEN DATE('now', 'start of month', '-1 month') AND DATE('now', 'start of month', '-1 day'));", + ), + context.env.D1.prepare( + "SELECT approved, answered_at, created_by, performed_at, reached_minimum_player_count, type FROM events WHERE month = ? AND year = ?;", + ).bind(month, year), + ]); - const eventsQuery = await context.env.D1.prepare( - "SELECT approved, answered_at, created_by, performed_at, reached_minimum_player_count, type FROM events WHERE month = ? AND year = ?;", - ) - .bind(month, year) - .all(); const memberMap = Object.fromEntries( - eventMemberQuery.results.map((entry) => { - return [ - entry.id, - { name: entry.name, points: 0, roblox_id: entry.roblox_id }, - ]; + batchStatements[0].results.map((e) => { + return [e.id, { name: e.name, points: 0, roblox_id: e.roblox_id }]; }), ); - for (const event of eventsQuery.results as { + for (const event of batchStatements[2].results as { approved: number; answered_at: number; created_by: string; @@ -77,10 +72,10 @@ export async function loader({ context }: { context: RequestContext }) { for (const member of Object.keys(memberMap)) if ( (memberMap[member].points < 50 || - eventsQuery.results.filter( + batchStatements[2].results.filter( (e) => e.type === "gamenight" && e.created_by === member, ).length === 0) && - !inactivityQuery.results.find( + !batchStatements[1].results.find( (i) => i.uid === member && JSON.parse(i.decisions).et, ) ) diff --git a/app/routes/me.tsx b/app/routes/me.tsx index b67b18e..0136987 100644 --- a/app/routes/me.tsx +++ b/app/routes/me.tsx @@ -33,37 +33,31 @@ export async function loader({ context }: { context: RequestContext }) { if (!currentUser) throw new Response(null, { status: 401 }); - const d1Promises = []; + const batchStatements = []; - for (const itemType of ["appeals", "inactivity_notices", "reports"]) - d1Promises.push( + for (const itemType of ["appeals", "inactivity_notices", "reports"]) { + batchStatements.push( context.env.D1.prepare( - `SELECT * - FROM ${itemType} - WHERE json_extract(user, '$.id') = ? - ORDER BY created_at DESC;`, - ) - .bind(currentUser.id) - .all(), + `SELECT * FROM ${itemType} WHERE json_extract(user, '$.id') = ? ORDER BY created_at DESC;`, + ).bind(currentUser.id), ); - - const settledPromises = await Promise.allSettled(d1Promises); - let etData: { [k: string]: any } | null = null; - - if (currentUser.permissions & (1 << 3)) { - etData = await context.env.D1.prepare( - "SELECT name, points, roblox_id FROM et_members WHERE id = ?;", - ) - .bind(currentUser.id) - .first(); } - return { - etData, - items: settledPromises.map((p) => { - if (p.status === "fulfilled") return p.value.results; + if (currentUser.permissions & (1 << 3)) + batchStatements.push( + context.env.D1.prepare( + "SELECT name, points, roblox_id FROM et_members WHERE id = ? LIMIT 1;", + ).bind(currentUser.id), + ); - return null; + const batchResults = await context.env.D1.batch(batchStatements); + + return { + etData: batchResults.at(3)?.results?.at(0) as { [k: string]: any } | null, + items: batchResults.map((r) => { + if (r.success) return r.results; + + return []; }) as any as ({ [k: string]: any }[] | null)[], permissions: currentUser.permissions as number, };