Ajoute la migration Drift v16 (enum ExerciseCategory, champ isExample sur exercises/programs/workout_templates, table local_seed_metadata), le contenu seed basket déterministe (21 exercices, 1 programme, 1 séance- modèle) dans lib/application/starter_content/, les ports StarterSeedStateRepository/StarterContentRepository et le use case SeedStarterContentUseCase branché dans AppBootstrap.create(). Validé GO par QA/Main : dart analyze propre, suite complète 167 tests (4 échecs préexistants sans rapport avec ce lot), 4 nouveaux tests seed tous verts. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
527 lines
16 KiB
Dart
527 lines
16 KiB
Dart
import '../../domain/domain.dart';
|
|
import 'starter_content.dart';
|
|
|
|
const basketStarterExerciseSeedsV1 = [
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-form-shooting',
|
|
name: 'Form shooting proche panier',
|
|
description: 'Travail technique près du cercle, priorité au geste propre.',
|
|
category: ExerciseCategory.shoot,
|
|
hasRepsMeasure: true,
|
|
hasScoreMeasure: true,
|
|
scoreLabel: 'Réussites',
|
|
scoreUnit: 'paniers',
|
|
defaultTargetReps: 25,
|
|
defaultTargetScore: 20,
|
|
),
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-spot-shooting-5-positions',
|
|
name: 'Spot shooting 5 positions',
|
|
description: '5 tirs depuis 5 spots autour de la raquette ou du périmètre.',
|
|
category: ExerciseCategory.shoot,
|
|
hasRepsMeasure: true,
|
|
hasScoreMeasure: true,
|
|
scoreLabel: 'Réussites',
|
|
scoreUnit: 'paniers',
|
|
defaultTargetReps: 1,
|
|
defaultTargetScore: 15,
|
|
steps: [
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-spot-shooting-right-corner',
|
|
name: 'Coin droit',
|
|
type: ExerciseStepType.reps,
|
|
defaultTargetValue: 5,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-spot-shooting-right-wing',
|
|
name: 'Aile droite',
|
|
type: ExerciseStepType.reps,
|
|
defaultTargetValue: 5,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-spot-shooting-top',
|
|
name: 'Face cercle',
|
|
type: ExerciseStepType.reps,
|
|
defaultTargetValue: 5,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-spot-shooting-left-wing',
|
|
name: 'Aile gauche',
|
|
type: ExerciseStepType.reps,
|
|
defaultTargetValue: 5,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-spot-shooting-left-corner',
|
|
name: 'Coin gauche',
|
|
type: ExerciseStepType.reps,
|
|
defaultTargetValue: 5,
|
|
),
|
|
],
|
|
),
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-catch-and-shoot',
|
|
name: 'Catch & shoot',
|
|
description: 'Recevoir, armer vite, tirer équilibré.',
|
|
category: ExerciseCategory.shoot,
|
|
hasRepsMeasure: true,
|
|
hasScoreMeasure: true,
|
|
scoreLabel: 'Réussites',
|
|
scoreUnit: 'paniers',
|
|
defaultTargetReps: 20,
|
|
defaultTargetScore: 12,
|
|
),
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-pull-up-shooting',
|
|
name: 'Tir après dribble',
|
|
description: 'Création d\'espace puis tir en rythme.',
|
|
category: ExerciseCategory.shoot,
|
|
hasRepsMeasure: true,
|
|
hasScoreMeasure: true,
|
|
scoreLabel: 'Réussites',
|
|
scoreUnit: 'paniers',
|
|
defaultTargetReps: 20,
|
|
defaultTargetScore: 10,
|
|
steps: [
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-pull-up-right',
|
|
name: 'Départ main droite',
|
|
type: ExerciseStepType.reps,
|
|
defaultTargetValue: 10,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-pull-up-left',
|
|
name: 'Départ main gauche',
|
|
type: ExerciseStepType.reps,
|
|
defaultTargetValue: 10,
|
|
),
|
|
],
|
|
),
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-free-throw-routine',
|
|
name: 'Routine lancers francs',
|
|
description: 'Série calme avec routine complète avant chaque tir.',
|
|
category: ExerciseCategory.freeThrows,
|
|
hasRepsMeasure: true,
|
|
hasScoreMeasure: true,
|
|
scoreLabel: 'Réussites',
|
|
scoreUnit: 'lancers',
|
|
defaultTargetReps: 20,
|
|
defaultTargetScore: 16,
|
|
),
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-fatigue-free-throws',
|
|
name: 'Lancers francs sous fatigue',
|
|
description: 'Lancers francs après effort court.',
|
|
category: ExerciseCategory.freeThrows,
|
|
hasRepsMeasure: true,
|
|
hasScoreMeasure: true,
|
|
scoreLabel: 'Réussites',
|
|
scoreUnit: 'lancers',
|
|
defaultTargetReps: 5,
|
|
defaultTargetScore: 8,
|
|
steps: [
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-fatigue-free-throws-baseline-run',
|
|
name: 'Course ligne de fond',
|
|
type: ExerciseStepType.time,
|
|
defaultTargetValue: 15,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-fatigue-free-throws-two-shots',
|
|
name: '2 lancers francs',
|
|
type: ExerciseStepType.reps,
|
|
defaultTargetValue: 2,
|
|
),
|
|
],
|
|
),
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-stationary-dribble-alternating',
|
|
name: 'Dribble stationnaire alterné',
|
|
description: 'Contrôle de balle enchaîné main droite/main gauche.',
|
|
category: ExerciseCategory.dribble,
|
|
hasTimeMeasure: true,
|
|
defaultTargetTimeSeconds: 60,
|
|
steps: [
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-stationary-dribble-right-low',
|
|
name: 'Main droite basse',
|
|
type: ExerciseStepType.time,
|
|
defaultTargetValue: 15,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-stationary-dribble-left-low',
|
|
name: 'Main gauche basse',
|
|
type: ExerciseStepType.time,
|
|
defaultTargetValue: 15,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-stationary-dribble-crossovers',
|
|
name: 'Crossovers',
|
|
type: ExerciseStepType.time,
|
|
defaultTargetValue: 15,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-stationary-dribble-between-legs',
|
|
name: 'Entre les jambes',
|
|
type: ExerciseStepType.time,
|
|
defaultTargetValue: 15,
|
|
),
|
|
],
|
|
),
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-combo-change-of-hand',
|
|
name: 'Combo changement de main',
|
|
description: 'Enchaîner les changements de main avec régularité.',
|
|
category: ExerciseCategory.dribble,
|
|
hasRepsMeasure: true,
|
|
defaultTargetReps: 10,
|
|
steps: [
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-combo-crossover',
|
|
name: 'Crossover',
|
|
type: ExerciseStepType.reps,
|
|
defaultTargetValue: 1,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-combo-between-legs',
|
|
name: 'Entre les jambes',
|
|
type: ExerciseStepType.reps,
|
|
defaultTargetValue: 1,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-combo-behind-back',
|
|
name: 'Dans le dos',
|
|
type: ExerciseStepType.reps,
|
|
defaultTargetValue: 1,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-combo-explosive-start',
|
|
name: 'Départ explosif',
|
|
type: ExerciseStepType.reps,
|
|
defaultTargetValue: 1,
|
|
),
|
|
],
|
|
),
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-cone-slalom',
|
|
name: 'Slalom cônes',
|
|
description: 'Conduite de balle en vitesse sur parcours.',
|
|
category: ExerciseCategory.dribble,
|
|
hasRepsMeasure: true,
|
|
hasScoreMeasure: true,
|
|
scoreInputMode: ScoreInputMode.stopwatch,
|
|
scoreLabel: 'Temps parcours',
|
|
defaultTargetReps: 6,
|
|
defaultTargetScoreTimeMs: 12000,
|
|
),
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-mikan-drill',
|
|
name: 'Mikan drill',
|
|
description: 'Alternance de finitions près du cercle.',
|
|
category: ExerciseCategory.finishing,
|
|
hasRepsMeasure: true,
|
|
hasScoreMeasure: true,
|
|
scoreLabel: 'Réussites',
|
|
scoreUnit: 'paniers',
|
|
defaultTargetReps: 20,
|
|
defaultTargetScore: 16,
|
|
),
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-weak-hand-finishes',
|
|
name: 'Finitions main faible',
|
|
description: 'Layups et finitions contrôlées main faible.',
|
|
category: ExerciseCategory.finishing,
|
|
hasRepsMeasure: true,
|
|
hasScoreMeasure: true,
|
|
scoreLabel: 'Réussites',
|
|
scoreUnit: 'paniers',
|
|
defaultTargetReps: 20,
|
|
defaultTargetScore: 12,
|
|
),
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-alternating-layups',
|
|
name: 'Layups alternés droite/gauche',
|
|
description: 'Alterner les côtés avec course courte.',
|
|
category: ExerciseCategory.finishing,
|
|
hasRepsMeasure: true,
|
|
hasScoreMeasure: true,
|
|
scoreLabel: 'Réussites',
|
|
scoreUnit: 'paniers',
|
|
defaultTargetReps: 20,
|
|
defaultTargetScore: 16,
|
|
steps: [
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-alternating-layup-right',
|
|
name: 'Layup côté droit',
|
|
type: ExerciseStepType.reps,
|
|
defaultTargetValue: 1,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-alternating-layup-left',
|
|
name: 'Layup côté gauche',
|
|
type: ExerciseStepType.reps,
|
|
defaultTargetValue: 1,
|
|
),
|
|
],
|
|
),
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-contact-finishing',
|
|
name: 'Finition avec contact',
|
|
description: 'Absorber le contact puis finir près du cercle.',
|
|
category: ExerciseCategory.finishing,
|
|
hasRepsMeasure: true,
|
|
hasScoreMeasure: true,
|
|
scoreLabel: 'Réussites',
|
|
scoreUnit: 'paniers',
|
|
defaultTargetReps: 12,
|
|
defaultTargetScore: 8,
|
|
),
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-half-court-suicides',
|
|
name: 'Suicides demi-terrain',
|
|
description: 'Aller-retour progressif sur lignes du terrain.',
|
|
category: ExerciseCategory.conditioning,
|
|
hasRepsMeasure: true,
|
|
hasScoreMeasure: true,
|
|
scoreInputMode: ScoreInputMode.stopwatch,
|
|
scoreLabel: 'Temps total',
|
|
defaultTargetReps: 4,
|
|
defaultTargetScoreTimeMs: 45000,
|
|
),
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-line-hops',
|
|
name: 'Line hops',
|
|
description: 'Petits sauts rapides de part et d\'autre d\'une ligne.',
|
|
category: ExerciseCategory.conditioning,
|
|
hasTimeMeasure: true,
|
|
hasScoreMeasure: true,
|
|
scoreLabel: 'Contacts',
|
|
scoreUnit: 'touches',
|
|
defaultTargetTimeSeconds: 30,
|
|
defaultTargetScore: 50,
|
|
),
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-baseline-sprint',
|
|
name: 'Sprint ligne de fond',
|
|
description: 'Départs explosifs répétés.',
|
|
category: ExerciseCategory.conditioning,
|
|
hasRepsMeasure: true,
|
|
hasScoreMeasure: true,
|
|
scoreInputMode: ScoreInputMode.stopwatch,
|
|
scoreLabel: 'Meilleur sprint',
|
|
defaultTargetReps: 10,
|
|
defaultTargetScoreTimeMs: 5000,
|
|
),
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-defensive-slides',
|
|
name: 'Slides défensifs',
|
|
description: 'Déplacements latéraux bas et contrôlés.',
|
|
category: ExerciseCategory.defense,
|
|
hasTimeMeasure: true,
|
|
defaultTargetTimeSeconds: 45,
|
|
),
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-closeout-slide',
|
|
name: 'Closeout + slide',
|
|
description: 'Fermer l\'espace puis contenir latéralement.',
|
|
category: ExerciseCategory.defense,
|
|
hasRepsMeasure: true,
|
|
defaultTargetReps: 10,
|
|
steps: [
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-closeout-slide-closeout',
|
|
name: 'Closeout',
|
|
type: ExerciseStepType.reps,
|
|
defaultTargetValue: 1,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-closeout-slide-right',
|
|
name: 'Slide droite',
|
|
type: ExerciseStepType.reps,
|
|
defaultTargetValue: 1,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-closeout-slide-left',
|
|
name: 'Slide gauche',
|
|
type: ExerciseStepType.reps,
|
|
defaultTargetValue: 1,
|
|
),
|
|
],
|
|
),
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-rebound-outlet-pass',
|
|
name: 'Rebond + outlet pass',
|
|
description: 'Capturer le rebond puis ressortir proprement.',
|
|
category: ExerciseCategory.defense,
|
|
hasRepsMeasure: true,
|
|
hasScoreMeasure: true,
|
|
scoreLabel: 'Réussites',
|
|
scoreUnit: 'actions',
|
|
defaultTargetReps: 12,
|
|
defaultTargetScore: 10,
|
|
steps: [
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-rebound-outlet-rebound',
|
|
name: 'Rebond',
|
|
type: ExerciseStepType.reps,
|
|
defaultTargetValue: 1,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-rebound-outlet-pass',
|
|
name: 'Outlet pass',
|
|
type: ExerciseStepType.reps,
|
|
defaultTargetValue: 1,
|
|
),
|
|
],
|
|
),
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-basket-hip-mobility',
|
|
name: 'Mobilité hanches basket',
|
|
description: 'Préparer hanches, appuis et amplitude.',
|
|
category: ExerciseCategory.mobility,
|
|
hasTimeMeasure: true,
|
|
defaultTargetTimeSeconds: 300,
|
|
steps: [
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-hip-mobility-openers',
|
|
name: 'Ouverture hanches',
|
|
type: ExerciseStepType.time,
|
|
defaultTargetValue: 60,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-hip-mobility-lunges',
|
|
name: 'Fentes dynamiques',
|
|
type: ExerciseStepType.time,
|
|
defaultTargetValue: 60,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-hip-mobility-squat-hold',
|
|
name: 'Squat hold',
|
|
type: ExerciseStepType.time,
|
|
defaultTargetValue: 60,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-hip-mobility-adductors',
|
|
name: 'Adducteurs',
|
|
type: ExerciseStepType.time,
|
|
defaultTargetValue: 60,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-hip-mobility-breathing',
|
|
name: 'Respiration basse',
|
|
type: ExerciseStepType.time,
|
|
defaultTargetValue: 60,
|
|
),
|
|
],
|
|
),
|
|
StarterExerciseSeed(
|
|
id: 'starter-v1-exercise-ankles-calves',
|
|
name: 'Chevilles et mollets',
|
|
description: 'Préparer les appuis, réceptions et changements de direction.',
|
|
category: ExerciseCategory.mobility,
|
|
hasTimeMeasure: true,
|
|
defaultTargetTimeSeconds: 180,
|
|
steps: [
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-ankles-calves-right-ankle',
|
|
name: 'Mobilité cheville droite',
|
|
type: ExerciseStepType.time,
|
|
defaultTargetValue: 60,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-ankles-calves-left-ankle',
|
|
name: 'Mobilité cheville gauche',
|
|
type: ExerciseStepType.time,
|
|
defaultTargetValue: 60,
|
|
),
|
|
StarterExerciseStepSeed(
|
|
id: 'starter-v1-step-ankles-calves-dynamic-calves',
|
|
name: 'Mollets dynamiques',
|
|
type: ExerciseStepType.time,
|
|
defaultTargetValue: 60,
|
|
),
|
|
],
|
|
),
|
|
];
|
|
|
|
const basketStarterProgramSeedV1 = StarterProgramSeed(
|
|
id: 'starter-v1-program-basket-foundations-45-min',
|
|
name: 'Fondations basket - 45 min',
|
|
defaultRestSeconds: 45,
|
|
exercises: [
|
|
StarterProgramExerciseSeed(
|
|
id: 'starter-v1-program-exercise-hip-mobility',
|
|
exerciseId: 'starter-v1-exercise-basket-hip-mobility',
|
|
setsCount: 1,
|
|
enabledMeasures: {WorkoutMeasure.time},
|
|
targetTimeSeconds: 300,
|
|
restSecondsOverride: 30,
|
|
),
|
|
StarterProgramExerciseSeed(
|
|
id: 'starter-v1-program-exercise-stationary-dribble',
|
|
exerciseId: 'starter-v1-exercise-stationary-dribble-alternating',
|
|
setsCount: 2,
|
|
enabledMeasures: {WorkoutMeasure.time},
|
|
targetTimeSeconds: 60,
|
|
restSecondsOverride: 30,
|
|
),
|
|
StarterProgramExerciseSeed(
|
|
id: 'starter-v1-program-exercise-combo-change-of-hand',
|
|
exerciseId: 'starter-v1-exercise-combo-change-of-hand',
|
|
setsCount: 2,
|
|
enabledMeasures: {WorkoutMeasure.reps},
|
|
targetReps: 10,
|
|
restSecondsOverride: 45,
|
|
),
|
|
StarterProgramExerciseSeed(
|
|
id: 'starter-v1-program-exercise-form-shooting',
|
|
exerciseId: 'starter-v1-exercise-form-shooting',
|
|
setsCount: 3,
|
|
enabledMeasures: {WorkoutMeasure.reps, WorkoutMeasure.score},
|
|
targetReps: 25,
|
|
targetScore: 20,
|
|
restSecondsOverride: 45,
|
|
),
|
|
StarterProgramExerciseSeed(
|
|
id: 'starter-v1-program-exercise-spot-shooting',
|
|
exerciseId: 'starter-v1-exercise-spot-shooting-5-positions',
|
|
setsCount: 3,
|
|
enabledMeasures: {WorkoutMeasure.reps, WorkoutMeasure.score},
|
|
targetReps: 1,
|
|
targetScore: 15,
|
|
restSecondsOverride: 60,
|
|
),
|
|
StarterProgramExerciseSeed(
|
|
id: 'starter-v1-program-exercise-alternating-layups',
|
|
exerciseId: 'starter-v1-exercise-alternating-layups',
|
|
setsCount: 3,
|
|
enabledMeasures: {WorkoutMeasure.reps, WorkoutMeasure.score},
|
|
targetReps: 20,
|
|
targetScore: 16,
|
|
restSecondsOverride: 45,
|
|
),
|
|
StarterProgramExerciseSeed(
|
|
id: 'starter-v1-program-exercise-free-throw-routine',
|
|
exerciseId: 'starter-v1-exercise-free-throw-routine',
|
|
setsCount: 4,
|
|
enabledMeasures: {WorkoutMeasure.reps, WorkoutMeasure.score},
|
|
targetReps: 10,
|
|
targetScore: 8,
|
|
restSecondsOverride: 30,
|
|
),
|
|
StarterProgramExerciseSeed(
|
|
id: 'starter-v1-program-exercise-defensive-slides',
|
|
exerciseId: 'starter-v1-exercise-defensive-slides',
|
|
setsCount: 4,
|
|
enabledMeasures: {WorkoutMeasure.time},
|
|
targetTimeSeconds: 45,
|
|
),
|
|
],
|
|
);
|
|
|
|
const basketStarterWorkoutTemplateSeedV1 = StarterWorkoutTemplateSeed(
|
|
id: 'starter-v1-workout-template-basket-foundations-example',
|
|
name: 'Séance exemple - Fondations basket',
|
|
programSnapshotId: 'starter-v1-workout-template-program-basket-foundations',
|
|
);
|