docs: document password reset and member delete as additions to PROJ-1/PROJ-3

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0143yYvjesjHndBACoweyK67
This commit is contained in:
patrickandClaude Sonnet 5 committed 2026-09-11 18:43:47 +02:00
1 parent bc4d74995f
commit 568c56a4a7
3 files changed
+12 -4

No files matched your search

+3 -1
View File
@@ -24,7 +24,9 @@
| PROJ-10 | Deployment (Docker Compose + Synapse Installer) | Deployed | [PROJ-10-deployment.md](PROJ-10-deployment.md) | 2026-09-11 | | PROJ-10 | Deployment (Docker Compose + Synapse Installer) | Deployed | [PROJ-10-deployment.md](PROJ-10-deployment.md) | 2026-09-11 |
| PROJ-11 | Chat (Matrix Client-Server API) | Planned | [PROJ-11-chat.md](PROJ-11-chat.md) | 2026-09-11 | | PROJ-11 | Chat (Matrix Client-Server API) | Planned | [PROJ-11-chat.md](PROJ-11-chat.md) | 2026-09-11 |
Noch nicht gestartet (siehe [docs/PRD.md](../docs/PRD.md) Core Features): Passwort-Reset, dedizierte Tenant-Isolation-Tests. P2 (Medien-Anhänge, Push) bewusst aus PROJ-11 ausgeklammert, siehe dessen Non-Goals. Noch nicht gestartet (siehe [docs/PRD.md](../docs/PRD.md) Core Features): dedizierte Tenant-Isolation-Tests. P2 (Medien-Anhänge, Push) bewusst aus PROJ-11 ausgeklammert, siehe dessen Non-Goals.
Nachträge 2026-09-11 (commit bc4d749): Passwort-Reset → [[PROJ-1]], Mitglied hart löschen → [[PROJ-3]].
<!-- Add features above this line --> <!-- Add features above this line -->
+4 -2
View File
@@ -13,16 +13,18 @@ E-Mail/Passwort-Auth mit JWT-Session für TalkTime. Grundlage für alle geschüt
- `frontend/src/pages/LoginPage.tsx`, `RegisterPage.tsx` - `frontend/src/pages/LoginPage.tsx`, `RegisterPage.tsx`
- `frontend/src/lib/auth-context.tsx` — Session-State im Frontend - `frontend/src/lib/auth-context.tsx` — Session-State im Frontend
- `frontend/src/routes/ProtectedRoute.tsx` — Redirect bei fehlender Session - `frontend/src/routes/ProtectedRoute.tsx` — Redirect bei fehlender Session
- **Nachtrag 2026-09-11 (commit bc4d749):** Passwort-Reset — `backend/src/db/schema.ts` (`password_reset_tokens`-Tabelle, 60min TTL, single-use), `POST /api/auth/forgot-password` + `POST /api/auth/reset-password/:token` in `backend/src/routes/auth.ts`, Mail-Versand über bestehenden `services/mail.ts`; Frontend: `ForgotPasswordForm.tsx`/`ResetPasswordForm.tsx`, `ForgotPasswordPage.tsx`/`ResetPasswordPage.tsx`, Link im `LoginForm.tsx`
## Acceptance Criteria ## Acceptance Criteria
- [x] Registrierung mit E-Mail + Passwort, Passwort gehasht (bcrypt, Cost 12) - [x] Registrierung mit E-Mail + Passwort, Passwort gehasht (bcrypt, Cost 12)
- [x] Login liefert JWT, generische Fehlermeldung bei falschen Zugangsdaten (kein User-Enumeration-Leak) - [x] Login liefert JWT, generische Fehlermeldung bei falschen Zugangsdaten (kein User-Enumeration-Leak)
- [x] Geschützte Frontend-Routen leiten unauthentifizierte Nutzer zum Login um - [x] Geschützte Frontend-Routen leiten unauthentifizierte Nutzer zum Login um
- [x] Geschützte Backend-Routen verifizieren JWT via `request.jwtVerify()` - [x] Geschützte Backend-Routen verifizieren JWT via `request.jwtVerify()`
- [x] Passwort-Reset per E-Mail-Link, Token läuft nach 60min ab, einmalig verwendbar
- [x] `forgot-password` antwortet immer generisch, unabhängig davon ob die E-Mail registriert ist (kein Enumeration-Leak)
## Open Items ## Open Items
- Passwort-Reset (siehe PRD P0) noch nicht gebaut
- E-Mail-Verification laut PRD P1 noch offen - E-Mail-Verification laut PRD P1 noch offen
## Notes ## Notes
Retro-Spec: Feature war bereits produktiv im Code, INDEX.md/Spec wurden nachträglich nachgezogen. Retro-Spec: Feature war bereits produktiv im Code, INDEX.md/Spec wurden nachträglich nachgezogen. Passwort-Reset am 2026-09-11 nachgebaut und getestet auf talkhub-LXC (192.168.66.8).
+5 -1
View File
@@ -10,14 +10,18 @@ Mitglieder eines Vereins verwalten: Liste, Status-Aktionen (aktivieren/deaktivie
- `backend/src/routes/members.ts` - `backend/src/routes/members.ts`
- `frontend/src/pages/MembersPage.tsx` - `frontend/src/pages/MembersPage.tsx`
- Mitglied-Status-Aktionen + Deaktivierungs-Sync (commit b38a5a4) - Mitglied-Status-Aktionen + Deaktivierungs-Sync (commit b38a5a4)
- **Nachtrag 2026-09-11 (commit bc4d749):** `DELETE /api/members/:memberId` — Admin-only, hartes Löschen. Audit-Log-Eintrag wird vor dem Delete geschrieben (`audit_logs.targetId` ist unconstrained text, überlebt das Löschen). Matrix-Account wird per `deactivateUser(matrixUserId, erase=true)` gelöscht. Abhängige Daten (`parent_links`, `team_members`, `org_roles`) laufen über bestehende `onDelete: cascade`-FKs mit. Frontend: Bestätigungsdialog (`AlertDialog`) im Dropdown-Menü der Mitgliederliste.
## Acceptance Criteria ## Acceptance Criteria
- [x] Mitgliederliste pro Verein abrufbar (paginiert) - [x] Mitgliederliste pro Verein abrufbar (paginiert)
- [x] Status ändern (aktiv/inaktiv) durch berechtigte Rollen - [x] Status ändern (aktiv/inaktiv) durch berechtigte Rollen
- [x] Deaktivierung löst Sync-Schritt Richtung Matrix aus - [x] Deaktivierung löst Sync-Schritt Richtung Matrix aus
- [x] Mitglied kann durch Org-Admin endgültig gelöscht werden (mit Bestätigungsdialog im Frontend)
- [x] Löschen entfernt/erased den zugehörigen Matrix-Account und alle abhängigen Datensätze (Team-Zuordnungen, Rollen, Eltern-Verknüpfungen)
- [x] Audit-Log-Eintrag bleibt nach dem Löschen erhalten
## Open Items ## Open Items
- Vollständige Membership-Sync mit Outbox/Retry/Reconciliation laut PRD noch nicht fertig — aktuell nur direkter Sync-Aufruf, kein Retry-Mechanismus geprüft - Vollständige Membership-Sync mit Outbox/Retry/Reconciliation laut PRD noch nicht fertig — aktuell nur direkter Sync-Aufruf, kein Retry-Mechanismus geprüft
## Notes ## Notes
Retro-Spec. Retro-Spec. Löschen-Feature am 2026-09-11 nachgebaut und getestet auf talkhub-LXC (192.168.66.8).