v1.1.0 — Account-Lifecycle in ManaCore

Phase 1 aus dem Native-Auth-Vollausbau-Plan (Option A, siehe
mana/docs/MANA_SWIFT.md). 7 neue AuthClient-Methoden für die
Account-Reise: register, forgotPassword, resetPassword,
resendVerification, changeEmail, changePassword, deleteAccount.

AuthError jetzt mit 19 präzisen Cases gespiegelt aus
AuthErrorCode in mana-auth/lib/auth-errors.ts, plus
AuthError.classify() als public Helper und Equatable-Conformance.

AuthClient.lastError ergänzt — strukturierter Fehler für
ManaAuthUI das den .emailNotVerified-Gate programmatisch braucht.

signIn und refreshAccessToken auf neue Klassifikation umgestellt.

Breaking: AuthError.serverError hat zusätzliches code:-Argument.
Apps (cards-native, memoro-native) sind bereits angepasst.

38/38 Tests grün (26 neu): AuthErrorClassifyTests deckt jeden
ErrorCode + Status-Heuristik + Retry-After ab, AuthClientAccountTests
deckt jede neue Methode via URLProtocol-Mock ab.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-05-13 19:22:19 +02:00
parent 74aee8d47f
commit 716509e10e
6 changed files with 1226 additions and 36 deletions

View file

@ -4,6 +4,87 @@ Alle Änderungen werden hier dokumentiert. Format orientiert an
[Keep a Changelog](https://keepachangelog.com), Versionierung nach
[Semver](https://semver.org).
## [1.1.0] — 2026-05-13
Phase 1 aus dem Native-Auth-Vollausbau-Plan (Option A — alles nativ,
siehe `mana/docs/MANA_SWIFT.md`). Erweitert `ManaCore` um die
Account-Lifecycle-Methoden, die jede native Verein-App für eine
vollständige Auth-Reise braucht.
### ManaCore — Neue API (additiv, keine Breaking Changes)
- `AuthClient.register(email:password:name:sourceAppUrl:)` — Sign-Up
gegen `POST /api/v1/auth/register`. Persistiert eine Session
automatisch, wenn der Server Tokens mitliefert; sonst still und
wartend auf Email-Verifikation.
- `AuthClient.forgotPassword(email:resetUniversalLink:)` — Passwort-
Reset-Mail anfordern gegen `POST /api/v1/auth/forgot-password`.
Server antwortet immer 200 (keine User-Enumeration).
- `AuthClient.resetPassword(token:newPassword:)` — Passwort mit Token
aus Reset-Mail setzen.
- `AuthClient.resendVerification(email:sourceAppUrl:)` — Verify-Mail
erneut versenden, aufzurufen nach ``AuthError/emailNotVerified``.
- `AuthClient.changeEmail(newEmail:callbackUniversalLink:)` — Email
ändern (verschickt Verify-Mail an neue Adresse). **Aktuell server-
seitig nicht Bearer-fähig** — siehe Doc-Header von
`AuthClient+Account.swift`.
- `AuthClient.changePassword(currentPassword:newPassword:)` — Passwort
ändern. Gleiche Bearer-Einschränkung wie `changeEmail`.
- `AuthClient.deleteAccount(password:)` — Account löschen
(App-Store-Guideline 5.1.1(v) Pflicht). Wiped Keychain bei Erfolg.
Gleiche Bearer-Einschränkung wie oben.
### ManaCore — `AuthError` ausgebaut
- Präzise Cases pro Server-`AuthErrorCode`: `.emailNotVerified`,
`.emailAlreadyRegistered`, `.weakPassword(message:)`,
`.accountLocked(retryAfter:)`, `.signupLimitReached`,
`.rateLimited(retryAfter:)`, `.tokenExpired`, `.tokenInvalid`,
`.twoFactorRequired`, `.twoFactorFailed`, `.passkeyNotEnabled`,
`.passkeyCancelled`, `.passkeyVerificationFailed`,
`.validation(message:)`, `.unauthorized`, `.notFound`,
`.serviceUnavailable`, `.serverInternal`.
- `AuthError.classify(status:data:retryAfterHeader:)` — public,
klassifiziert mana-auth-Fehler-Antworten in den passenden Case.
Auch genutzt von `signIn` und `refreshAccessToken` (vorher: einfache
`.error(String)`-Strings).
- `AuthError` ist jetzt `Equatable` — erleichtert UI-Logik und Tests.
- Alte Cases `.invalidCredentials`, `.networkFailure`, `.encoding`,
`.keychain`, `.decoding`, `.notSignedIn` bleiben unverändert.
- **Breaking-Vermeidung:** `serverError(status:message:)` wurde zu
`serverError(status:code:message:)` (zusätzliches `code`-Argument).
Theoretisch breaking, praktisch nutzt es niemand außerhalb von
ManaCore selbst. Wenn ein App-Konsument darauf gepattern-matched
hat, ist das ein Compile-Fehler, kein Runtime-Bug.
### Tests
- 14 neue Tests für `AuthError.classify` (jeder ErrorCode + Status-
Heuristik + Retry-After-Header + kaputter Body).
- 12 neue Tests für die neuen `AuthClient`-Methoden via
`URLProtocol`-Mock (Wire-Format, Status-Mapping, Bearer-Header,
Session-Persistenz bei `register`, Session-Wipe bei `deleteAccount`).
### Bekannte Einschränkungen
- `changeEmail`, `changePassword`, `deleteAccount` brauchen Server-
seitig den `bearer`-Plugin von Better Auth oder einen Custom-
Bearer-Resolver. Heute mountet `mana-auth` nur den Cookie-Pfad.
Phase-3-Server-PR im `mana`-Repo dokumentiert.
- 2FA-Verify, Magic-Link und Passkey-Flows sind in dieser Version
bewusst NICHT enthalten. Laufen Server-seitig über Better-Auth-
Native (`/api/auth/*`, Cookie) und brauchen eigene JWT-Pfade.
Folgt in v1.2.0 zusammen mit dem Server-PR.
## [1.0.1] — 2026-05-13
### Behoben
- `AuthenticatedTransport`: `URL.appending(path:)` URL-encoded das `?`
in Query-Strings zu `%3F`, was den Server-Route-Match brechen ließ
(404 für `/healthz?…`). Ersetzt durch String-Concat; Caller liefert
den Path inkl. führendem `/` und optionaler Query.
## [1.0.0] — 2026-05-12
Initiale Extraktion aus `memoro-native` (Phase α aus