feat(online): session compte, stockage sécurisé et adapter API (ticket #64)
Ajoute l'adapter API distant (infrastructure/remote/auth_api.dart, http_api_client.dart) et le stockage sécurisé du token d'auth (infrastructure/security/secure_storage_auth_token_store.dart), câblés dans app_bootstrap.dart. Étend le modèle Drift (migration schemaVersion 9→10) et la couche application (ports, use cases, entités) pour la session de compte. flutter pub get OK (ajout http, flutter_secure_storage), build_runner OK, dart format appliqué, analyze propre (mêmes infos préexistantes), 109/109 tests verts, build APK debug validé. Premier ticket du chantier "Ajouter les features serveur au client" (#63). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -115,7 +115,14 @@ void main() {
|
||||
|
||||
final class _FakeBootstrap implements AppDependencies {
|
||||
_FakeBootstrap(_FakeActiveSessionRepository activeRepository)
|
||||
: activeWorkoutSessionUseCases = ActiveWorkoutSessionUseCases(
|
||||
: authUseCases = AuthUseCases(
|
||||
tokenStore: _FakeAuthTokenStore(),
|
||||
accountRepository: _FakeOnlineAccountRepository(),
|
||||
remoteAuthApi: _FakeRemoteAuthApi(),
|
||||
clock: _FakeClock(DateTime.utc(2026, 7, 17, 12)),
|
||||
ids: _FakeIds(),
|
||||
),
|
||||
activeWorkoutSessionUseCases = ActiveWorkoutSessionUseCases(
|
||||
sessionRepository: activeRepository,
|
||||
templateRepository: _FakeWorkoutTemplateRepository(),
|
||||
clock: _FakeClock(DateTime.utc(2026, 7, 17, 12)),
|
||||
@ -170,6 +177,9 @@ final class _FakeBootstrap implements AppDependencies {
|
||||
clock: _FakeClock(DateTime.utc(2026, 7, 17, 12)),
|
||||
);
|
||||
|
||||
@override
|
||||
final AuthUseCases authUseCases;
|
||||
|
||||
@override
|
||||
final ExerciseUseCases exerciseUseCases;
|
||||
|
||||
@ -249,6 +259,50 @@ final class _FakeIds implements IdGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
final class _FakeAuthTokenStore implements AuthTokenStore {
|
||||
@override
|
||||
Future<void> clearToken() async {}
|
||||
|
||||
@override
|
||||
Future<String?> readToken() async => null;
|
||||
|
||||
@override
|
||||
Future<void> saveToken(String token, DateTime expiresAt) async {}
|
||||
}
|
||||
|
||||
final class _FakeOnlineAccountRepository implements OnlineAccountRepository {
|
||||
@override
|
||||
Future<void> clearSession() async {}
|
||||
|
||||
@override
|
||||
Future<UserAccountSession?> currentSession() async => null;
|
||||
|
||||
@override
|
||||
Future<void> saveSession(UserAccountSession session) async {}
|
||||
}
|
||||
|
||||
final class _FakeRemoteAuthApi implements RemoteAuthApi {
|
||||
@override
|
||||
Future<RemoteAuthResult> login({
|
||||
required String email,
|
||||
required String password,
|
||||
}) async {
|
||||
throw const RemoteAuthException(RemoteAuthFailure.network);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> logout(String token) async {}
|
||||
|
||||
@override
|
||||
Future<RemoteAuthResult> register({
|
||||
required String email,
|
||||
required String password,
|
||||
String? displayName,
|
||||
}) async {
|
||||
throw const RemoteAuthException(RemoteAuthFailure.network);
|
||||
}
|
||||
}
|
||||
|
||||
final class _FakeActiveSessionRepository implements ActiveSessionRepository {
|
||||
ActiveWorkoutSession? session;
|
||||
final restStates = <ActiveRestState>[];
|
||||
|
||||
Reference in New Issue
Block a user