From 3ff3f53f9de03c8f15e37a025f0d70ee9dcfc8ef Mon Sep 17 00:00:00 2001 From: Mao Nakamoto Date: Sat, 5 Sep 2026 04:03:44 +0000 Subject: [PATCH] fix(api): stop a failed surface delete from leaving a duplicate row Upsert deleted the existing surface before inserting the new one but never checked the delete's result. If the delete silently failed (RLS misconfig, transient DB error), the insert left two rows for one project, and every later GET for that surface would 500 since it relies on .maybeSingle() expecting at most one row. Same unchecked-error family as PR #36/#37/#39/#40/#43. --- app/src/app/api/surfaces/route.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/app/api/surfaces/route.ts b/app/src/app/api/surfaces/route.ts index 631146a..1168ba5 100644 --- a/app/src/app/api/surfaces/route.ts +++ b/app/src/app/api/surfaces/route.ts @@ -40,7 +40,13 @@ export async function POST(request: NextRequest) { } // Upsert: delete existing surface for project, then insert - await supabase.from('surfaces').delete().eq('project_id', parsed.data.project_id); + const { error: deleteError } = await supabase + .from('surfaces') + .delete() + .eq('project_id', parsed.data.project_id); + + if (deleteError) + return NextResponse.json({ success: false, error: deleteError.message }, { status: 500 }); const { data, error } = await supabase.from('surfaces').insert(parsed.data).select().single();