Alle PlaybooksConsumer Subscription App

Neue Daten in die Kontolöschung aufnehmen

Die Kontolöschung erweitern, wenn die App neue Nutzerdaten oder Dateien speichert, damit nichts vom Nutzer zurückbleibt und nur der verifizierte Nutzer sie auslösen kann.

Wann du es brauchst

Eine neue Tabelle, ein Bucket oder ein externer Dienst enthält Daten eines Nutzers, zum Beispiel Tagebucheinträge, hochgeladene Dokumente oder ein Newsletter-Abo. "Delete account" in den Datenschutzeinstellungen muss auch diese entfernen.

Regeln

  • Die Kontolöschung entfernt alles, was das Produkt für den Nutzer speichert, und danach den Auth-Nutzer, wie PRODUCT.md es verspricht.
  • Nur die Edge Function delete-account löscht, und zwar für den Nutzer des JWT, den sie geprüft hat. public.delete_my_account bleibt nur für service_role ausführbar; nimm die Nutzer-ID nie aus dem Request-Body.
  • Dateien werden über die Storage API entfernt. Ein delete from storage.objects entfernt nur die Metadaten und lässt die Datei im Bucket.
  • Jeder fehlgeschlagene Schritt bricht mit einem Fehler ab, bevor der Auth-Nutzer gelöscht wird, damit der Nutzer es erneut versuchen kann.
  • Migrationen sind append-only: Definiere die Funktion in einer neuen Migration neu.

Schritte

  1. Gib jeder neuen Tabelle ein user_id uuid not null references auth.users(id) on delete cascade (oder eine Referenz auf public.profiles(id)), damit ihre Zeilen das Konto nie überleben.

  2. Definiere public.delete_my_account in einer neuen Migration mit create or replace function neu. Übernimm den Rumpf aus der letzten Migration, die sie definiert (derzeit 202611020001_fix_account_deletion.sql), und ergänze die neue Tabelle, damit die Funktion die vollständige Liste dessen bleibt, was die Löschung entfernt:

    delete from public.journal_entries where user_id = p_user_id;
    

    Behalte die Signatur und security definer set search_path = '' bei und wiederhole die Zeilen revoke execute ... from public, anon, authenticated und grant execute ... to service_role.

  3. Lege Dateien unter <user-id>/... ab, wie der Bucket avatars. Entferne sie in supabase/functions/delete-account/index.ts wie die Avatare, vor dem RPC: list(user.id) liefert höchstens 100 Einträge und geht nicht in Unterordner, wiederhole also list und remove, bis die Liste leer ist, oder halte den Ordner flach.

  4. Für Daten in einem externen Dienst rufe dessen Lösch-API aus der Edge Function auf, mit einem Schlüssel aus den Secrets der Funktion, vor dem RPC. Schlägt der Aufruf fehl, antworte wie die anderen Schritte mit 500.

  5. Erweitere supabase/tests/database/delete_my_account.test.sql: Füge als Eigentümer des Tests Zeilen für zwei Nutzer ein, rufe public.delete_my_account für den ersten auf und prüfe, dass nur seine Zeilen weg sind. Behalte die vorhandenen Prüfungen der Rechte.

  6. Führe supabase db reset und supabase test db aus, lösche dann ein Testkonto in der App und prüfe im Dashboard, dass keine Zeilen oder Dateien übrig sind.

  7. Beschreibe die neuen Daten in DATABASE.md und ihre Aufbewahrung in PRODUCT.md.

Fertig, wenn

  • die Prüfbefehle und supabase test db durchlaufen;
  • das Löschen eines Testkontos keine Zeilen, Dateien oder externen Datensätze zurücklässt;
  • delete_my_account weiterhin nicht von anon oder authenticated ausführbar ist;
  • DATABASE.md und PRODUCT.md die neuen Daten beschreiben.