import '../infrastructure/local/local.dart'; import 'application.dart'; abstract interface class AppDependencies { ExerciseUseCases get exerciseUseCases; MediaUseCases get mediaUseCases; ProgramUseCases get programUseCases; WorkoutTemplateUseCases get workoutTemplateUseCases; ActiveWorkoutSessionUseCases get activeWorkoutSessionUseCases; CloseWorkoutSessionUseCase get closeWorkoutSessionUseCase; WorkoutHistoryUseCases get workoutHistoryUseCases; } final class AppBootstrap implements AppDependencies { AppBootstrap._({ required this.database, required this.exerciseUseCases, required this.mediaUseCases, required this.programUseCases, required this.workoutTemplateUseCases, required this.activeWorkoutSessionUseCases, required this.closeWorkoutSessionUseCase, required this.workoutHistoryUseCases, required this.syncGateway, }); final AppDatabase database; @override final ExerciseUseCases exerciseUseCases; @override final MediaUseCases mediaUseCases; @override final ProgramUseCases programUseCases; @override final WorkoutTemplateUseCases workoutTemplateUseCases; @override final ActiveWorkoutSessionUseCases activeWorkoutSessionUseCases; @override final CloseWorkoutSessionUseCase closeWorkoutSessionUseCase; @override final WorkoutHistoryUseCases workoutHistoryUseCases; final SyncGateway syncGateway; static Future create() async { final database = AppDatabase.open(); await database.customSelect('SELECT 1').get(); final exerciseRepository = DriftExerciseRepository(database); final mediaRepository = DriftMediaAssetRepository(database); final programRepository = DriftProgramRepository(database); final templateRepository = DriftWorkoutTemplateRepository(database); final activeSessionRepository = DriftActiveSessionRepository(database); final historyRepository = DriftWorkoutHistoryRepository(database); final ids = LocalIdGenerator(); const clock = SystemClock(); const originDeviceId = 'local-device'; 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, ), programUseCases: ProgramUseCases( programRepository: programRepository, exerciseRepository: exerciseRepository, clock: clock, ids: ids, originDeviceId: originDeviceId, ), workoutTemplateUseCases: WorkoutTemplateUseCases( templateRepository: templateRepository, programRepository: programRepository, clock: clock, ids: ids, originDeviceId: originDeviceId, ), activeWorkoutSessionUseCases: ActiveWorkoutSessionUseCases( sessionRepository: activeSessionRepository, templateRepository: templateRepository, clock: clock, ids: ids, originDeviceId: originDeviceId, ), closeWorkoutSessionUseCase: CloseWorkoutSessionUseCase( sessionRepository: activeSessionRepository, historyRepository: historyRepository, clock: clock, ids: ids, originDeviceId: originDeviceId, ), workoutHistoryUseCases: WorkoutHistoryUseCases( repository: historyRepository, clock: clock, ), syncGateway: const NoOpSyncGateway(), ); } Future dispose() => database.close(); }