Files
GameTime/lib/infrastructure/local/app_database.dart
Blomios abfbb64de2 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>
2026-07-18 00:19:02 +02:00

146 lines
4.2 KiB
Dart

import 'package:drift/drift.dart';
import 'package:drift_flutter/drift_flutter.dart';
import 'tables.dart';
part 'app_database.g.dart';
@DriftDatabase(
tables: [
ActiveRestStates,
ActiveSetResults,
ActiveWorkoutSessions,
ChangeLogEntries,
Exercises,
MediaAssets,
ProgramExercises,
Programs,
WorkoutHistories,
WorkoutHistorySetResults,
WorkoutTemplateExerciseOverrides,
WorkoutTemplatePrograms,
WorkoutTemplates,
],
)
final class AppDatabase extends _$AppDatabase {
AppDatabase(super.executor);
factory AppDatabase.open() {
return AppDatabase(
driftDatabase(
name: 'gametime',
native: const DriftNativeOptions(shareAcrossIsolates: true),
),
);
}
@override
int get schemaVersion => 2;
@override
MigrationStrategy get migration {
return MigrationStrategy(
onCreate: (migrator) async {
await migrator.createAll();
await _createIndexes();
},
onUpgrade: (migrator, from, to) async {
if (from < 2) {
await customStatement(
'ALTER TABLE active_set_results ADD COLUMN status TEXT NOT NULL '
"DEFAULT 'completed' CHECK (status IN ('completed', 'skipped'))",
);
await customStatement(
'ALTER TABLE workout_history_set_results ADD COLUMN status TEXT '
"NOT NULL DEFAULT 'completed' CHECK (status IN ('completed', "
"'skipped'))",
);
}
},
beforeOpen: (details) async {
await customStatement('PRAGMA foreign_keys = ON');
},
);
}
Future<void> _createIndexes() async {
for (final tableName in _syncableTableNames) {
await customStatement(
'CREATE INDEX IF NOT EXISTS idx_${tableName}_deleted_at '
'ON $tableName (deleted_at)',
);
await customStatement(
'CREATE INDEX IF NOT EXISTS idx_${tableName}_updated_at '
'ON $tableName (updated_at)',
);
await customStatement(
'CREATE INDEX IF NOT EXISTS idx_${tableName}_sync_state '
'ON $tableName (sync_state)',
);
await customStatement(
'CREATE INDEX IF NOT EXISTS idx_${tableName}_local_revision '
'ON $tableName (local_revision)',
);
}
await customStatement(
'CREATE INDEX IF NOT EXISTS idx_program_exercises_program_id '
'ON program_exercises (program_id)',
);
await customStatement(
'CREATE INDEX IF NOT EXISTS idx_workout_template_programs_template_id '
'ON workout_template_programs (workout_template_id)',
);
await customStatement(
'CREATE INDEX IF NOT EXISTS idx_active_set_results_session_id '
'ON active_set_results (active_workout_session_id)',
);
await customStatement(
'CREATE INDEX IF NOT EXISTS idx_active_rest_states_session_id '
'ON active_rest_states (active_workout_session_id)',
);
await customStatement(
'CREATE UNIQUE INDEX IF NOT EXISTS '
'idx_active_workout_sessions_single_open '
'ON active_workout_sessions ((1)) '
'WHERE deleted_at IS NULL '
"AND status IN ('running', 'paused', 'savedExit')",
);
await customStatement(
'CREATE INDEX IF NOT EXISTS idx_workout_history_started_at '
'ON workout_history (started_at)',
);
await customStatement(
'CREATE INDEX IF NOT EXISTS idx_workout_history_set_results_history_id '
'ON workout_history_set_results (workout_history_id)',
);
await customStatement(
'CREATE INDEX IF NOT EXISTS idx_change_log_entity '
'ON change_log (entity_type, entity_id)',
);
await customStatement(
'CREATE INDEX IF NOT EXISTS idx_change_log_local_revision '
'ON change_log (local_revision)',
);
await customStatement(
'CREATE INDEX IF NOT EXISTS idx_change_log_synced_at '
'ON change_log (synced_at)',
);
}
}
const _syncableTableNames = [
'active_rest_states',
'active_set_results',
'active_workout_sessions',
'exercises',
'media_assets',
'program_exercises',
'programs',
'workout_history',
'workout_history_set_results',
'workout_template_exercise_overrides',
'workout_template_programs',
'workout_templates',
];