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:
parent
74aee8d47f
commit
716509e10e
6 changed files with 1226 additions and 36 deletions
81
CHANGELOG.md
81
CHANGELOG.md
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue