# Migration State

## Done
- Globales Auth-Handling für Android-App implementiert:
  - OkHttp Interceptor hängt `authcode`/`userid` aus Session an Requests.
  - 401/403 + Unauthorized-Codes (`ERROR_UNAUTHORIZED`, `ERROR_FORBIDDEN`, `ERROR_SESSION_EXPIRED`) werden zentral erkannt.
  - Session wird bei Unauthorized gelöscht und per globalem Event auf Login navigiert.
- Feature-Slice `registration -> login -> home` end-to-end umgesetzt:
  - Compose-Screens für Registrierung, Login, Home.
  - Navigation zwischen den drei Screens.
  - ViewModels: `RegisterViewModel`, `LoginViewModel`, `HomeViewModel`.
  - Repository-Calls auf API-Contract-Endpunkte (`/auth/register`, `/auth/login`, `/clubs`).
  - Loading/Error-States in den Flows.
- Auth-Erweiterungen end-to-end umgesetzt:
  - `Activate` mit Repository + Service + ViewModel + Compose-Screen (`/auth/activate/:activationCode`).
  - `ForgotPassword` mit Repository + Service + ViewModel + Compose-Screen (`/auth/forgot-password`).
  - `ResetPassword` mit Repository + Service + ViewModel + Compose-Screen (`/auth/reset-password`).
  - Login verlinkt auf Forgot-Password-Flow.
  - Deeplinks für Auth-Flows über `trainingstagebuch://auth/...` (activate/reset-password/forgot-password).
- Wiederverwendbares Error-Pattern eingeführt:
  - `StandardErrorMapper` (Netzwerk, Timeout, 4xx, 5xx, Unknown).
  - `ErrorBanner` + `ErrorSnackbarHost` als Compose-Bausteine.
  - Nutzung im Login-Screen als Referenz.
- i18n-Baseline umgesetzt:
  - `values/strings.xml` + `values-en/strings.xml` ausgebaut.
  - `UiText`-Pattern in ViewModels/Screens aktiv.
  - Build-Guard gegen neue hardcoded UI-Strings (`checkI18nHardcodedUiStrings`).
- Feature-Slice `Members` (Basis) umgesetzt:
  - Compose-Screen mit Loading/Error/Retry + einfacher Mitgliederliste.
  - ViewModel (`MembersViewModel`) lädt Club aus Session und Members über Service/Repository.
  - Repository-Mapping für Members aus `/clubmembers/get/{clubId}/true`.
  - Unit-Test für Member-Mapping ergänzt (`RepositoryMappersTest`).
- Feature-Slice `Members` erweitert:
  - Stats-Zähler im Screen ergänzt (aktive / Test- / inaktive Mitglieder).
  - Suche, Inaktiv-Filter und Sortierung (Name A-Z/Z-A, Status).
  - Core-Form für Create/Edit (Vorname, Nachname, aktiv, Testmitglied) via `/clubmembers/set/{clubId}`.
  - Kontakte (Telefon/E-Mail) im Editor hinzugefügt und mit `/clubmembers/set/{clubId}` persistiert.
  - Quick-Aktionen ergänzt: Teststatus entfernen (`/clubmembers/quick-update-test-membership/{clubId}/{memberId}`) und Mitglied deaktivieren (`/clubmembers/quick-deactivate/{clubId}/{memberId}`).
  - Bilder-Basis ergänzt: Upload, Primär setzen und Löschen für ausgewähltes Mitglied (`/clubmembers/image/{clubId}/{memberId}*`).
  - Training-Groups ergänzt: laden, für Mitglied zuweisen/entfernen (`/training-groups/{clubId}*`).
  - Notizen ergänzt: laden/anlegen/löschen über `/membernotes`.
  - Zusätzlicher Unit-Test für Filter-/Sortierlogik (`MembersFilterUtilsTest`).
- Feature-Slice `Member Transfer Settings` umgesetzt:
  - Compose-Screen `MemberTransferSettingsScreen` ersetzt Placeholder.
  - ViewModel `MemberTransferSettingsViewModel` mit Loading/Error/Message-State.
  - Service/Repository-Integration für:
    - Laden: `/member-transfer-config/{clubId}`
    - Speichern: `/member-transfer-config/{clubId}`
    - Löschen: `/member-transfer-config/{clubId}`
    - Ausführen: `/clubmembers/transfer/{clubId}`
  - UI enthält Save/Delete/Execute sowie Ergebnisanzeige (`transferred/total`, invalid members, errors).
  - i18n-Strings (de/en) für den kompletten Transfer-Screen ergänzt.
- Feature-Slice `Create Club` umgesetzt:
  - Compose-Screen `CreateClubScreen` ersetzt Placeholder.
  - ViewModel `CreateClubViewModel` mit Eingabevalidierung, Loading/Error und Erfolgspfad.
  - Repository/Service-Integration für `POST /clubs` (`createClub`).
  - Nach erfolgreichem Erstellen wird `currentClub` in der Session gesetzt (falls Club-ID aus Response extrahierbar).
  - Navigation Home -> CreateClub ergänzt und Rücknavigation nach Erfolg eingebaut.
- Feature-Slice `Show Club` (Basis) umgesetzt:
  - Compose-Screen `ShowClubScreen` ersetzt Placeholder.
  - ViewModel `ShowClubViewModel` mit Loading/Error/Retry-State.
  - Repository/Service-Integration für `GET /clubs/{clubId}` (`loadClub`).
  - Home bietet Navigation zum aktuellen Club (`AppState.currentClub` -> `showclub/{clubId}`).
  - Aktive Mitglieder werden im Detail-Screen gelistet.
  - Access-Flow ergänzt: 403/Pending-State + `GET /clubs/request/{clubId}` (Zugriff anfragen) umgesetzt.
  - Open-Requests ergänzt: `GET /clubmembers/notapproved/{clubId}` wird geladen und angezeigt.
- Feature-Slice `Pending Approvals` umgesetzt:
  - Compose-Screen `PendingApprovalsScreen` ersetzt Placeholder.
  - ViewModel `PendingApprovalsViewModel` lädt/synchronisiert offene Anfragen für `currentClub`.
  - Repository/Service-Integration:
    - Laden: `GET /clubs/pending/{clubId}`
    - Freigeben: `POST /clubs/approve`
    - Ablehnen: `POST /clubs/reject`
  - Home-Navigation ergänzt (`Freigaben öffnen`).
- Feature-Slice `Club Settings` (Basis) umgesetzt:
  - Compose-Screen `ClubSettingsScreen` ersetzt Placeholder.
  - ViewModel `ClubSettingsViewModel` lädt/speichert für `currentClub`.
  - Repository/Service-Integration:
    - Laden: `GET /clubs/{clubId}` (Settings-Felder aus Club-Objekt)
    - Speichern: `PUT /clubs/{clubId}/settings`
  - Felder: `greetingText`, `associationMemberNumber`; inkl. Loading/Error/Success-State.
  - Tab-Erweiterung umgesetzt:
    - `Settings` Tab: Greeting + Association Number speichern.
    - `Training Groups` Tab: Laden/Anlegen/Bearbeiten/Löschen (`/training-groups/{clubId}`).
    - `Training Times` Tab: Laden/Anlegen/Bearbeiten/Löschen (`/training-times/{clubId}`).
  - UX-Upgrade umgesetzt:
    - Dropdown-Auswahl für Training Group und Weekday im Time-Create-Flow.
    - Bearbeiten von Gruppen/Zeiten über kompaktere Dialoge.
- Minimale Unit-Tests ergänzt:
  - Mapper/Error-Parsing Tests (`RepositoryMappersTest`).
- AGP-Warnung zu `compileSdk=35` behoben durch SDK-Absenkung:
  - `compileSdk = 34`, `targetSdk = 34`.
- Builds/Tests zuletzt erfolgreich:
  - `./gradlew assembleDebug`
  - `./gradlew testDebugUnitTest`

## Next
- Error-Pattern (`ErrorBanner`/`ErrorSnackbarHost`) auf Register/Home/Forgot/Reset vereinheitlichen.
- Zusätzliche Unit-Tests für neue Auth-Repositories/ViewModels ergänzen (Forgot/Reset/Activate, inkl. Fehlpfade).
- API-Responses für Home (`/clubs`) stärker typisieren (statt reinem `JsonElement`).
- Nächsten vertikalen Feature-Flow umsetzen (z. B. Members oder Diary) inkl. Socket-Event-Nutzung.
- Members-Flow weiter auf Vue-Parität ausbauen (erweiterte Kontakt-/Bilddetails, Feinschliff Transfer-UX).
- ShowClub/ClubSettings als nächste Club-Detail-Flows von Placeholder auf echte Implementierung heben.
- ClubSettings weiter auf volle Vue-Parität heben (z. B. detailliertere Validierungen/Interaktionen).
- Socket-Events in Members/Diary integrieren und State live aktualisieren.
- Optional: DI (z. B. Hilt/Koin) für Repository/ApiService/ViewModels einführen, um Testbarkeit und Lifecycle-Konsistenz zu verbessern.
- Entscheidung treffen, ob langfristig wieder auf `compileSdk=35` + aktualisierte Toolchain migriert werden soll.

## Risks
- `runBlocking` im Interceptor beim Unauthorized-Handling kann in Randfällen Latenz verursachen.
- Error-Mapping ist aktuell generisch; backend-spezifische Fehlertexte/Codes könnten in einzelnen Flows detaillierter benötigt werden.
- Unit-Test-Abdeckung bleibt noch minimal und fokussiert nicht auf vollständige Auth-/DeepLink-End-to-End-Pfade.
- Members ist aktuell nur als Basisliste umgesetzt; komplexe Geschäftslogik aus Vue fehlt noch.
- Mit `compileSdk/targetSdk = 34` fehlen potenzielle neue Plattform-APIs/Verhaltensanpassungen aus API 35.
