From 4bf08f9170156e35b34af2301b93678cd126eea1 Mon Sep 17 00:00:00 2001 From: marcin2121 <13873718+marcin2121@users.noreply.github.com> Date: Tue, 31 Mar 2026 19:35:57 +0000 Subject: [PATCH] perf: optimize N+1 query in urwis-decay cron route Batched `.update()` calls using `.in()` based on shared hunger drops to reduce database roundtrips. Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> --- app/api/cron/urwis-decay/route.ts | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/app/api/cron/urwis-decay/route.ts b/app/api/cron/urwis-decay/route.ts index 790326e..8828515 100644 --- a/app/api/cron/urwis-decay/route.ts +++ b/app/api/cron/urwis-decay/route.ts @@ -39,14 +39,16 @@ export async function GET(request: Request) { let notificationsSent = 0; - // 2. Przelicz spadek statystyk i zaktualizuj bazę + // 2. Przelicz spadek statystyk i przygotuj paczki do aktualizacji + const updatesByHunger = new Map(); + for (const pet of hungryPets) { const newHunger = Math.max(0, pet.hunger_level - 20); - await supabase - .from('urwis_pet') - .update({ hunger_level: newHunger }) - .eq('user_id', pet.user_id); + if (!updatesByHunger.has(newHunger)) { + updatesByHunger.set(newHunger, []); + } + updatesByHunger.get(newHunger)!.push(pet.user_id); // Jeśli głód spadł poniżej 30%, zliczamy powiadomienie if (newHunger < 30) { @@ -56,6 +58,17 @@ export async function GET(request: Request) { } } + // 3. Wykonaj aktualizację (po jednej dla każdego unikalnego poziomu głodu) + const updatePromises = Array.from(updatesByHunger.entries()).map(([hungerLevel, userIds]) => + supabase + .from('urwis_pet') + .update({ hunger_level: hungerLevel }) + .in('user_id', userIds) + ); + + // Czekamy na wykonanie wszystkich aktualizacji grupowych + await Promise.all(updatePromises); + return NextResponse.json({ success: true, processed: hungryPets.length,