diff --git a/app/api/cron/supabase-keepalive/route.ts b/app/api/cron/supabase-keepalive/route.ts new file mode 100644 index 0000000..85368c6 --- /dev/null +++ b/app/api/cron/supabase-keepalive/route.ts @@ -0,0 +1,42 @@ +import 'server-only' +import { NextRequest, NextResponse } from 'next/server' +import { createAdminClient } from '@/lib/database/supabase-admin' + +export async function GET(request: NextRequest) { + const cronSecret = process.env.CRON_SECRET + const authorization = request.headers.get('authorization') + + if (!cronSecret || authorization !== `Bearer ${cronSecret}`) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }) + } + + const supabase = createAdminClient() + + if (!supabase) { + return NextResponse.json( + { error: 'Supabase service role is not configured' }, + { status: 500 } + ) + } + + const startedAt = Date.now() + const { error, count } = await supabase + .from('profiles') + .select('id', { count: 'exact', head: true }) + .limit(1) + + if (error) { + console.error('Supabase keepalive failed:', error.message) + return NextResponse.json( + { error: 'Supabase keepalive failed' }, + { status: 502 } + ) + } + + return NextResponse.json({ + ok: true, + checked: 'profiles', + count, + latencyMs: Date.now() - startedAt, + }) +} diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..35e1c76 --- /dev/null +++ b/vercel.json @@ -0,0 +1,8 @@ +{ + "crons": [ + { + "path": "/api/cron/supabase-keepalive", + "schedule": "0 3 * * *" + } + ] +}