Quando usarlo
Una nuova tabella, un bucket o un servizio esterno contiene dati di un utente, per esempio voci di diario, documenti caricati o un'iscrizione alla newsletter. "Delete account" nei controlli privacy deve rimuovere anche questi.
Regole da rispettare
- La cancellazione dell'account rimuove tutto ciò che il prodotto conserva per
l'utente e poi l'utente Auth, come promette
PRODUCT.md. - Cancella solo la Edge Function
delete-account, per l'utente del JWT che ha verificato.public.delete_my_accountresta eseguibile solo daservice_role; non prendere mai l'id utente dal corpo della richiesta. - I file si rimuovono con la Storage API. Una
delete from storage.objectstoglie solo i metadati e lascia il file nel bucket. - Ogni passo che fallisce si ferma con un errore prima di cancellare l'utente Auth, così l'utente può riprovare.
- Le migration sono append-only: ridefinisci la funzione in una nuova migration.
Passi
Dai a ogni nuova tabella un
user_id uuid not null references auth.users(id) on delete cascade(o un riferimento apublic.profiles(id)), così le sue righe non sopravvivono mai all'account.Ridefinisci
public.delete_my_accountin una nuova migration concreate or replace function. Copia il corpo dall'ultima migration che la definisce (ora202611020001_fix_account_deletion.sql) e aggiungi la nuova tabella, così la funzione resta l'elenco completo di ciò che la cancellazione rimuove:delete from public.journal_entries where user_id = p_user_id;Mantieni la firma e
security definer set search_path = ''e ripeti le righerevoke execute ... from public, anon, authenticatedegrant execute ... to service_role.Salva i file sotto
<user-id>/..., come il bucketavatars. Insupabase/functions/delete-account/index.tsrimuovili come gli avatar, prima della RPC:list(user.id)restituisce al massimo 100 voci e non entra nelle sottocartelle, quindi ripetilisteremovefinché l'elenco è vuoto, oppure tieni la cartella piatta.Per i dati in un servizio esterno chiama la sua API di cancellazione dalla Edge Function, con una chiave conservata nei secret della funzione, prima della RPC. Se fallisce, rispondi 500 come negli altri passi.
Estendi
supabase/tests/database/delete_my_account.test.sql: come proprietario del test inserisci righe per due utenti, chiamapublic.delete_my_accountper il primo e verifica che spariscano solo le sue righe. Mantieni i controlli sui privilegi già presenti.Esegui
supabase db resetesupabase test db, poi elimina un account di prova dall'app e verifica nella dashboard che non restino righe o file.Descrivi i nuovi dati in
DATABASE.mde la loro conservazione inPRODUCT.md.
Completato quando
- i comandi di verifica e
supabase test dbsuperano; - eliminare un account di prova non lascia righe, file o record esterni;
delete_my_accountresta non eseguibile daanoneauthenticated;DATABASE.mdePRODUCT.mddescrivono i nuovi dati.
