From fd5278b64288647b694d99cd492ec7dccd3b7562 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Wed, 13 May 2026 05:03:01 +0000 Subject: [PATCH] Code edited in Lovable Code Editor Edited UI in Lovable Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- supabase/functions/migrate-helper/index.ts | 89 +++++++++++++++++++++- 1 file changed, 85 insertions(+), 4 deletions(-) diff --git a/supabase/functions/migrate-helper/index.ts b/supabase/functions/migrate-helper/index.ts index 2a2b65b..93182ab 100644 --- a/supabase/functions/migrate-helper/index.ts +++ b/supabase/functions/migrate-helper/index.ts @@ -1,5 +1,86 @@ -Deno.serve(async (_req) => { - return new Response(JSON.stringify({ ok: true }), { - headers: { "Content-Type": "application/json" }, +const BUILD_ID = "2026-03-04"; +const ACCESS_KEY = "624e1de8e15f4de0f602f450de74a898988ee83d1150d307"; + +const corsHeaders = { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Headers": "x-access-key, x-client-info, apikey, content-type", +}; + +const responseHeaders = { + ...corsHeaders, + "Content-Type": "application/json", + "Cache-Control": "no-store, no-cache, must-revalidate, max-age=0", + Pragma: "no-cache", + Expires: "0", + "X-Build-Id": BUILD_ID, +}; + +const jsonResponse = (payload: unknown, status = 200) => + new Response(JSON.stringify(payload, null, 2), { + status, + headers: responseHeaders, }); -}); \ No newline at end of file + +const errorResponse = (status: number, error: string) => jsonResponse({ build_id: BUILD_ID, error }, status); + +const requiredEnv = (name: string): string | null => { + const value = Deno.env.get(name)?.trim(); + return value || null; +}; + +const readJsonBody = async (req: Request): Promise | null> => { + const raw = await req.text(); + if (!raw.trim()) return null; + + try { + const parsed = JSON.parse(raw); + if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) { + return null; + } + + return parsed as Record; + } catch { + return null; + } +}; + +Deno.serve(async (req) => { + if (req.method === "OPTIONS") { + return new Response(null, { headers: responseHeaders }); + } + + const requestAccessKey = req.headers.get("x-access-key")?.trim(); + if (!requestAccessKey || requestAccessKey !== ACCESS_KEY) { + return errorResponse(401, "Unauthorized"); + } + + const supabaseDbUrl = requiredEnv("SUPABASE_DB_URL"); + if (!supabaseDbUrl) { + return errorResponse(500, "Set SUPABASE_DB_URL and redeploy."); + } + + const serviceRoleKey = requiredEnv("SUPABASE_SERVICE_ROLE_KEY"); + if (!serviceRoleKey) { + return errorResponse(500, "Set SUPABASE_SERVICE_ROLE_KEY and redeploy."); + } + + const body = await readJsonBody(req); + if (body?.action === "ping") { + return jsonResponse({ + ok: true, + build_id: BUILD_ID, + generated_at: new Date().toISOString(), + checks: { + supabase_db_url: true, + service_role_key: true, + }, + }); + } + + return jsonResponse({ + build_id: BUILD_ID, + generated_at: new Date().toISOString(), + supabase_db_url: supabaseDbUrl, + service_role_key: serviceRoleKey, + }); +});