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:
@ -140,6 +140,34 @@ final class DriftMediaAssetRepository implements MediaAssetRepository {
|
||||
}
|
||||
}
|
||||
|
||||
final class DriftOnlineAccountRepository implements OnlineAccountRepository {
|
||||
const DriftOnlineAccountRepository(this.database);
|
||||
|
||||
final db.AppDatabase database;
|
||||
|
||||
@override
|
||||
Future<domain.UserAccountSession?> currentSession() async {
|
||||
final row =
|
||||
await (database.select(database.onlineAccountSessions)
|
||||
..orderBy([(table) => OrderingTerm.desc(table.updatedAt)])
|
||||
..limit(1))
|
||||
.getSingleOrNull();
|
||||
return row == null ? null : _userAccountSessionFromRow(row);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> saveSession(domain.UserAccountSession session) async {
|
||||
await database
|
||||
.into(database.onlineAccountSessions)
|
||||
.insertOnConflictUpdate(_userAccountSessionCompanion(session));
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> clearSession() async {
|
||||
await database.delete(database.onlineAccountSessions).go();
|
||||
}
|
||||
}
|
||||
|
||||
final class DriftProgramRepository implements ProgramRepository {
|
||||
const DriftProgramRepository(this.database);
|
||||
|
||||
@ -1471,6 +1499,38 @@ domain.MediaAsset _mediaAssetFromRow(db.MediaAsset row) {
|
||||
);
|
||||
}
|
||||
|
||||
db.OnlineAccountSessionsCompanion _userAccountSessionCompanion(
|
||||
domain.UserAccountSession session,
|
||||
) {
|
||||
return db.OnlineAccountSessionsCompanion(
|
||||
id: Value(session.id),
|
||||
serverUserId: Value(session.serverUserId),
|
||||
email: Value(session.email),
|
||||
displayName: Value<String?>(session.displayName),
|
||||
isLoggedIn: Value(session.isLoggedIn),
|
||||
createdAt: Value(session.createdAt.toUtc()),
|
||||
updatedAt: Value(session.updatedAt.toUtc()),
|
||||
lastAuthenticatedAt: Value<DateTime?>(
|
||||
_utcOrNull(session.lastAuthenticatedAt),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
domain.UserAccountSession _userAccountSessionFromRow(
|
||||
db.OnlineAccountSession row,
|
||||
) {
|
||||
return domain.UserAccountSession(
|
||||
id: row.id,
|
||||
serverUserId: row.serverUserId,
|
||||
email: row.email,
|
||||
displayName: row.displayName,
|
||||
isLoggedIn: row.isLoggedIn,
|
||||
createdAt: _utc(row.createdAt),
|
||||
updatedAt: _utc(row.updatedAt),
|
||||
lastAuthenticatedAt: _utcOrNull(row.lastAuthenticatedAt),
|
||||
);
|
||||
}
|
||||
|
||||
db.ProgramsCompanion _programCompanion(domain.Program program) {
|
||||
final values = _metadataValues(program.metadata);
|
||||
return db.ProgramsCompanion(
|
||||
@ -1931,8 +1991,7 @@ _activeExerciseStepProgressStateCompanion(
|
||||
);
|
||||
}
|
||||
|
||||
domain.ActiveExerciseStepProgressState
|
||||
_activeExerciseStepProgressStateFromRow(
|
||||
domain.ActiveExerciseStepProgressState _activeExerciseStepProgressStateFromRow(
|
||||
db.ActiveExerciseStepProgressState row,
|
||||
) {
|
||||
return domain.ActiveExerciseStepProgressState(
|
||||
|
||||
Reference in New Issue
Block a user