feat(ui): écran Bibliothèque d'exercices

Ajoute l'écran de bibliothèque d'exercices (presentation/exercise_library_screen.dart)
et ajuste la couche application/domaine (bootstrap, ports, use cases,
entités, repositories Drift) pour l'alimenter. flutter analyze propre,
9/9 tests verts, build APK debug validé.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-17 18:42:41 +02:00
parent f474eb500b
commit 318fc6fcb9
10 changed files with 1041 additions and 18 deletions

View File

@ -1,15 +1,43 @@
import '../infrastructure/local/app_database.dart';
import '../infrastructure/local/local.dart';
import 'application.dart';
final class AppBootstrap {
AppBootstrap._({required this.database});
AppBootstrap._({
required this.database,
required this.exerciseUseCases,
required this.mediaUseCases,
});
final AppDatabase database;
final ExerciseUseCases exerciseUseCases;
final MediaUseCases mediaUseCases;
static Future<AppBootstrap> create() async {
final database = AppDatabase.open();
await database.customSelect('SELECT 1').get();
final exerciseRepository = DriftExerciseRepository(database);
final mediaRepository = DriftMediaAssetRepository(database);
final ids = LocalIdGenerator();
const clock = SystemClock();
const originDeviceId = 'local-device';
return AppBootstrap._(database: database);
return AppBootstrap._(
database: database,
exerciseUseCases: ExerciseUseCases(
repository: exerciseRepository,
clock: clock,
ids: ids,
originDeviceId: originDeviceId,
),
mediaUseCases: MediaUseCases(
mediaRepository: mediaRepository,
exerciseRepository: exerciseRepository,
storage: const PathProviderLocalMediaStorage(),
clock: clock,
ids: ids,
originDeviceId: originDeviceId,
),
);
}
Future<void> dispose() => database.close();