66 lines
2.4 KiB
TypeScript
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' },
|
|
});
|
|
});
|