Tutti i playbookConsumer Subscription App

Includere nuovi dati nella cancellazione dell'account

Quando l'app salva nuovi dati o file dell'utente, estendere la cancellazione dell'account perché non resti nulla dell'utente e solo l'utente verificato possa avviarla.

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_account resta eseguibile solo da service_role; non prendere mai l'id utente dal corpo della richiesta.
  • I file si rimuovono con la Storage API. Una delete from storage.objects toglie 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

  1. Dai a ogni nuova tabella un user_id uuid not null references auth.users(id) on delete cascade (o un riferimento a public.profiles(id)), così le sue righe non sopravvivono mai all'account.

  2. Ridefinisci public.delete_my_account in una nuova migration con create or replace function. Copia il corpo dall'ultima migration che la definisce (ora 202611020001_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 righe revoke execute ... from public, anon, authenticated e grant execute ... to service_role.

  3. Salva i file sotto <user-id>/..., come il bucket avatars. In supabase/functions/delete-account/index.ts rimuovili come gli avatar, prima della RPC: list(user.id) restituisce al massimo 100 voci e non entra nelle sottocartelle, quindi ripeti list e remove finché l'elenco è vuoto, oppure tieni la cartella piatta.

  4. 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.

  5. Estendi supabase/tests/database/delete_my_account.test.sql: come proprietario del test inserisci righe per due utenti, chiama public.delete_my_account per il primo e verifica che spariscano solo le sue righe. Mantieni i controlli sui privilegi già presenti.

  6. Esegui supabase db reset e supabase test db, poi elimina un account di prova dall'app e verifica nella dashboard che non restino righe o file.

  7. Descrivi i nuovi dati in DATABASE.md e la loro conservazione in PRODUCT.md.

Completato quando

  • i comandi di verifica e supabase test db superano;
  • eliminare un account di prova non lascia righe, file o record esterni;
  • delete_my_account resta non eseguibile da anon e authenticated;
  • DATABASE.md e PRODUCT.md descrivono i nuovi dati.