diff --git a/README.md b/README.md index 23f8a73..7b573c6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# TeamVis — Self-Hosting-Bundle (v0.59.1) +# TeamVis — Self-Hosting-Bundle (v0.60.0) Dieses Bundle enthält alles zum **Betreiben** von TeamVis auf eigener Infrastruktur — **keinen** App-Quellcode. Die App selbst kommt als fertiges @@ -36,4 +36,4 @@ Vollständige Schritt-für-Schritt-Anleitung (von der nackten VM bis live): | `supabase/migrations/` | Datenbank-Schema (DDL) | | `docs/` | Anleitungen | -Stand: TeamVis 0.59.1. +Stand: TeamVis 0.60.0. diff --git a/package.json b/package.json index 1ef5b60..7c927fa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "teamvis-selfhost", - "version": "0.59.1", + "version": "0.60.0", "private": true, "description": "Self-Hosting-Bundle für TeamVis (Installer + Migrationen, ohne App-Quellcode).", "type": "module", diff --git a/release.json b/release.json index 9c07afb..5bd57ec 100644 --- a/release.json +++ b/release.json @@ -1,6 +1,6 @@ { - "version": "0.59.1", - "released": "2026-10-22", - "security": false, - "summary": "Schrift durchgehend Funnel Sans, auch in serverseitig erzeugten Bildern. Keine Migration, keine neuen Variablen." + "version": "0.60.0", + "released": "2026-10-29", + "security": true, + "summary": "Konto löschen aus der App (Apple 5.1.1(v)) und Rechte-Härtung M22. SQL-first: Migrationen 0073 und 0074 vor dem Image-Update einspielen." } diff --git a/supabase/migrations/0074_konto_loeschung.sql b/supabase/migrations/0074_konto_loeschung.sql new file mode 100644 index 0000000..c2157be --- /dev/null +++ b/supabase/migrations/0074_konto_loeschung.sql @@ -0,0 +1,52 @@ +-- Konto löschen aus der App (Apple Guideline 5.1.1(v)) +-- ==================================================================== +-- Bisher schickte die App nur einen Antrag an die Verwaltung. Apple +-- verlangt, dass sich das Konto in der App selbst löschen lässt. Ablauf +-- ab jetzt: +-- +-- 1. sofort: App-Zugang weg (Tokens, Login-Codes, Push), Karte +-- deaktiviert und öffentlich nicht mehr erreichbar — auch nicht als +-- „nicht mehr im Unternehmen"-Seite +-- 2. nach `account_deletion_days` (Default 30): Datensatz samt Foto +-- endgültig gelöscht, die Person bekommt eine Bestätigung +-- +-- Die Frist dazwischen erlaubt der Verwaltung, versehentliche Anträge +-- zurückzunehmen und Kontakte/Termine der Karte zu übernehmen (sie hängen +-- per ON DELETE CASCADE an der Karte). + +alter table public.employees + add column if not exists deletion_requested_at timestamptz; + +comment on column public.employees.deletion_requested_at is + 'Zeitpunkt, zu dem die Person ihr Konto in der App gelöscht hat. Gesetzt → Karte offline, endgültige Löschung nach site_settings.account_deletion_days.'; + +create index if not exists employees_deletion_requested_at_idx + on public.employees (deletion_requested_at) + where deletion_requested_at is not null; + +alter table public.site_settings + add column if not exists account_deletion_days integer not null default 30; + +comment on column public.site_settings.account_deletion_days is + 'Tage zwischen Kontolöschung in der App und endgültiger Löschung des Kartendatensatzes.'; + +-- Mindestens ein Tag (sonst gibt es kein Zurücknehmen), höchstens ein +-- Jahr (die App nennt die Frist der Person; darüber ist sie für einen +-- Datensatz ohne weiteren Zweck nicht mehr begründbar). +alter table public.site_settings + drop constraint if exists site_settings_account_deletion_days_check; +alter table public.site_settings + add constraint site_settings_account_deletion_days_check + check (account_deletion_days between 1 and 365); + +-- Beide Spalten sind nur für den Server bestimmt. Spaltenrechte hat +-- 0073 für anon/authenticated explizit vergeben — neue Spalten sind +-- davon nicht erfasst; das revoke hält es auch auf Instanzen fest, auf +-- denen noch ein Tabellenrecht liegt. +do $$ +begin + revoke select (deletion_requested_at) on public.employees from anon, authenticated; + revoke select (account_deletion_days) on public.site_settings from anon, authenticated; +exception when others then + raise notice 'Spaltenrechte nicht angepasst (%).', sqlerrm; +end $$;