feat: Wahl-Phasen, Verantwortliche-Invites, Auth fixes, GRUPPE chat #1

Merged
linus merged 28 commits from feat/backend-phases-0-6 into main 2026-09-12 11:26:16 +00:00
Showing only changes of commit f12bb51f3e - Show all commits
+14 -7
View File
@@ -83,6 +83,13 @@ client's host - no separate web server is needed.
`MailService.sendTeamerInvite()` composes the personal-invite email with a
link built from `APP_BASE_URL`. Delivery is best-effort — failures are
logged and swallowed, never blocking the invite.
- `push/` — global `PushProvider` abstraction; default `log`, `PUSH_PROVIDER=fcm`
uses FCM HTTP v1 (service-account JWT → OAuth token, no extra dep;
`FCM_PROJECT_ID`, `GOOGLE_APPLICATION_CREDENTIALS`). `DeviceToken` rows
(bound to a `User` or `GuestAccount`) via `POST /push/register` +
`/unregister`. `PushService.notifyChannel()` resolves a channel's readable
audience → their tokens (minus the sender) → send, pruning invalid ones;
`ChatService.sendMessage()` fires it best-effort.
- `wahl/` — Wahl/Workshop administration (Leitungsteam-only), guest
Teilnehmer submission, Force-Zuteilung overrides, and `ZuteilungService`:
a faithful port of the WP plugin's `kc_run_zuteilung` (force-assignments →
@@ -119,11 +126,11 @@ client's host - no separate web server is needed.
- `common/``Role` enum, `@Roles()` decorator, `RolesGuard` (KC-scoped,
Leitungsteam roles are global across all KCs).
All planned backend phases are implemented. `npm test` runs Jest unit tests
(`ZuteilungService`, `TeamAuthService`, `TeamerService`, `OnboardingService`,
All planned backend features are implemented (`prisma/migrations/` holds the
schema history). `npm test` runs Jest unit tests (`ZuteilungService`,
`TeamAuthService`, `TeamerService`, `OnboardingService`,
`resolveOrProvisionAuthentikUser` / `toAuthenticatedUser`; Prisma mocked).
Remaining work: the Flutter clients (see repo root README), push
notifications, and the first real Prisma migration (only `schema.prisma`
exists so far). Ops notes: the Authentik provider must emit a `groups` claim
for the LT check, and `MAIL_PROVIDER=smtp` + `SMTP_*` must be set for invite
emails to actually leave the box.
Ops notes to go live: the Authentik provider must emit a `groups` claim for
the LT check; `MAIL_PROVIDER=smtp` + `SMTP_*` for invite emails;
`PUSH_PROVIDER=fcm` + a Firebase service-account JSON for push; and real
Nextcloud/S3 credentials for file storage.