From 1a4da354e7d68264fb7909844d3463754f3a7e44 Mon Sep 17 00:00:00 2001 From: Z <219363113+Z-kie@users.noreply.github.com> Date: Sat, 11 Apr 2026 16:30:30 -0400 Subject: [PATCH] fix: prevent base64 data URI bloat in Supabase generation tables MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The qron-image-gen worker returns images as base64 data URIs (~294KB each). Storing these in guest_generations and qron_generations causes: - Supabase rows bloat to 300KB+ - Rate-limit queries timeout scanning massive rows - Subsequent guest generation requests 502 Fix: store a reference ID instead of the full base64 when the image is a data URI. The actual image is still returned to the client — only the database logging is changed. Co-Authored-By: Claude Opus 4.6 (1M context) --- app/api/generate/guest/route.ts | 9 ++++++--- app/api/generate/route.ts | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/api/generate/guest/route.ts b/app/api/generate/guest/route.ts index 16953c5..5c767cb 100644 --- a/app/api/generate/guest/route.ts +++ b/app/api/generate/guest/route.ts @@ -86,6 +86,9 @@ export async function POST(req: NextRequest) { const sessionId = `guest_${Date.now()}_${Math.random().toString(36).slice(2, 8)}` + // Store a reference instead of full base64 data URIs (which bloat Supabase and cause timeouts) + const storableUrl = imageUrl.startsWith('data:') ? `generated:${genData.id || sessionId}` : imageUrl + // Log to Supabase (non-blocking) if (SUPABASE_URL && SUPABASE_ANON) { fetch(`${SUPABASE_URL}/rest/v1/guest_generations`, { @@ -101,14 +104,14 @@ export async function POST(req: NextRequest) { session_id: sessionId, target_url: url, style, - image_url: imageUrl, + image_url: storableUrl, email: email || null, created_at: new Date().toISOString(), }), }).catch(() => {}) - // Also upsert into qron_demos for the gallery - if (imageUrl) { + // Also upsert into qron_demos for the gallery (skip base64 data URIs) + if (storableUrl && !storableUrl.startsWith('generated:')) { fetch(`${SUPABASE_URL}/rest/v1/qron_demos`, { method: 'POST', headers: { diff --git a/app/api/generate/route.ts b/app/api/generate/route.ts index 0d90269..4535bef 100644 --- a/app/api/generate/route.ts +++ b/app/api/generate/route.ts @@ -100,10 +100,11 @@ export async function POST(request: Request) { ) const qronId = crypto.randomUUID() + const storableImageUrl = imageUrl.startsWith('data:') ? `generated:${qronId}` : imageUrl await admin.from('qron_generations').insert({ id: qronId, user_id: session.user.id, - image_url: imageUrl, + image_url: storableImageUrl, destination_url: targetUrl, prompt: finalPrompt, preset_id: presetId || null,