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

@ -46,6 +46,44 @@ final class ExerciseUseCases {
Future<void> save(Exercise exercise) => repository.save(exercise);
Future<List<Exercise>> listActive() => repository.listActive();
Future<bool> isUsedInPrograms(String id) {
return repository.isReferencedByProgram(id);
}
Future<Exercise> update({
required String id,
required String name,
String? description,
String? imageMediaId,
String? videoMediaId,
required bool hasTimeMeasure,
required bool hasRepsMeasure,
required bool hasScoreMeasure,
String? scoreLabel,
String? scoreUnit,
}) async {
final exercise = await repository.findById(id);
if (exercise == null) {
throw const DomainException('Exercise not found.');
}
final updated = exercise.copyWith(
metadata: exercise.metadata.touch(clock.now()),
name: name,
description: description,
imageMediaId: imageMediaId,
videoMediaId: videoMediaId,
hasTimeMeasure: hasTimeMeasure,
hasRepsMeasure: hasRepsMeasure,
hasScoreMeasure: hasScoreMeasure,
scoreLabel: scoreLabel,
scoreUnit: scoreUnit,
);
await repository.save(updated);
return updated;
}
Future<Exercise> attachImage({
required String exerciseId,
required String mediaAssetId,