feat(data): édition ponctuelle des séries en séance (ticket #21)

Étend le modèle Drift (tables.dart, app_database.dart/.g.dart) et la
couche application (entités, use cases, repositories) pour supporter
l'édition ponctuelle des séries pendant l'exécution d'une séance, sans
modifier le modèle/séance-modèle. build_runner OK, flutter analyze
propre, 30/30 tests verts, build APK debug validé.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-18 00:19:02 +02:00
parent 7eb8f260e0
commit abfbb64de2
7 changed files with 621 additions and 15 deletions

View File

@ -8,6 +8,8 @@ enum WorkoutMeasure { time, reps, score }
enum ActiveWorkoutStatus { running, paused, savedExit, completed, abandoned }
enum SetResultStatus { completed, skipped }
final class DomainException implements Exception {
const DomainException(this.message);
@ -572,7 +574,7 @@ final class ActiveWorkoutSession {
}
final class ActiveSetResult {
const ActiveSetResult({
ActiveSetResult({
required this.metadata,
required this.activeWorkoutSessionId,
required this.programSnapshotId,
@ -588,7 +590,13 @@ final class ActiveSetResult {
this.scoreLabelSnapshot,
this.scoreUnitSnapshot,
this.note,
});
this.status = SetResultStatus.completed,
}) {
if (status == SetResultStatus.skipped &&
(actualTimeMs != null || actualReps != null || actualScore != null)) {
throw const DomainException('Skipped set results cannot have values.');
}
}
final EntityMetadata metadata;
final String activeWorkoutSessionId;
@ -605,6 +613,7 @@ final class ActiveSetResult {
final String? scoreLabelSnapshot;
final String? scoreUnitSnapshot;
final String? note;
final SetResultStatus status;
}
final class ActiveRestState {
@ -682,7 +691,7 @@ final class WorkoutHistory {
}
final class WorkoutHistorySetResult {
const WorkoutHistorySetResult({
WorkoutHistorySetResult({
required this.metadata,
required this.workoutHistoryId,
required this.programSnapshotId,
@ -705,7 +714,15 @@ final class WorkoutHistorySetResult {
this.scoreUnitSnapshot,
this.startedAt,
this.completedAt,
});
this.status = SetResultStatus.completed,
}) {
if (status == SetResultStatus.skipped &&
(actualTimeMs != null || actualReps != null || actualScore != null)) {
throw const DomainException(
'Skipped history results cannot have values.',
);
}
}
final EntityMetadata metadata;
final String workoutHistoryId;
@ -729,6 +746,7 @@ final class WorkoutHistorySetResult {
final String? scoreUnitSnapshot;
final DateTime? startedAt;
final DateTime? completedAt;
final SetResultStatus status;
}
String _nonBlank(String? value, String label) {