Files

66 lines
2.4 KiB
TypeScript

// Edge Function: apaga TODA a conta do utilizador autenticado — linhas em
// `children`/`profiles` e o próprio registo em `auth.users`. Isto é o que
// falta para permitir criar uma nova conta com o mesmo e-mail depois de
// "Apagar dados da conta": o app (client) nunca teve a service role key para
// poder chamar `auth.admin.deleteUser`, por isso essa etapa faltava e o
// e-mail continuava "ocupado" no Supabase Auth.
//
// Deploy (uma vez, com a Supabase CLI já autenticada):
// supabase functions deploy delete-account --project-ref mannjismlhlwaqqqnvog
//
// SUPABASE_URL e SUPABASE_SERVICE_ROLE_KEY já ficam disponíveis
// automaticamente dentro de toda Edge Function — não é preciso configurar
// nenhum secret manualmente.
import { createClient } from 'https://esm.sh/@supabase/supabase-js@2';
const SUPABASE_URL = Deno.env.get('SUPABASE_URL')!;
const SERVICE_ROLE_KEY = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!;
Deno.serve(async (req) => {
if (req.method !== 'POST') {
return new Response(JSON.stringify({ error: 'Method not allowed' }), {
status: 405,
headers: { 'Content-Type': 'application/json' },
});
}
const authHeader = req.headers.get('Authorization') ?? '';
const jwt = authHeader.replace('Bearer ', '').trim();
if (!jwt) {
return new Response(JSON.stringify({ error: 'Sessão em falta' }), {
status: 401,
headers: { 'Content-Type': 'application/json' },
});
}
const admin = createClient(SUPABASE_URL, SERVICE_ROLE_KEY);
// Valida o JWT do chamador e identifica o uid — nunca confiar num uid vindo
// do corpo do pedido, sob pena de qualquer pessoa poder apagar outra conta.
const { data: userData, error: userError } = await admin.auth.getUser(jwt);
if (userError || !userData?.user) {
return new Response(JSON.stringify({ error: 'Sessão inválida' }), {
status: 401,
headers: { 'Content-Type': 'application/json' },
});
}
const uid = userData.user.id;
await admin.from('children').delete().eq('owner_id', uid);
await admin.from('profiles').delete().eq('id', uid);
const { error: deleteUserError } = await admin.auth.admin.deleteUser(uid);
if (deleteUserError) {
return new Response(JSON.stringify({ error: deleteUserError.message }), {
status: 500,
headers: { 'Content-Type': 'application/json' },
});
}
return new Response(JSON.stringify({ ok: true }), {
status: 200,
headers: { 'Content-Type': 'application/json' },
});
});