from __future__ import annotations from pathlib import Path from app.auth.repository import AuthRepository from app.auth.service import AuthService from app.core.config import AppSettings from app.core.security import SecretCipher from app.dashboard.service import DashboardService from app.database.database import Database from app.fleet.repository import FleetRepository from app.fleet.service import FleetService from app.integrations.repository import IntegrationRepository from app.integrations.service import IntegrationService from app.rotation.repository import RotationRepository from app.rotation.schedule_service import SchedulerLoop from app.rotation.service import RotationService class AppContainer: def __init__(self, settings: AppSettings) -> None: self.settings = settings self.database = Database(settings.database_path, Path(__file__).parents[1] / "migrations") self.cipher = SecretCipher.load( configured_key=settings.master_key, key_file=settings.master_key_file, database_path=settings.database_path, ) self.database.migrate() self.auth_repository = AuthRepository(self.database) self.integration_repository = IntegrationRepository(self.database, self.cipher) self.fleet_repository = FleetRepository(self.database) self.rotation_repository = RotationRepository(self.database) bootstrap_token = ( settings.bootstrap_token.get_secret_value() if settings.bootstrap_token else None ) self.auth_service = AuthService( self.auth_repository, settings.session_days, bootstrap_token, ) self.integration_service = IntegrationService(self.integration_repository) self.rotation_service = RotationService( self.rotation_repository, self.integration_service, ) self.fleet_service = FleetService( self.fleet_repository, self.integration_service, self.rotation_repository, ) self.scheduler_loop = SchedulerLoop( self.rotation_repository, self.rotation_service, ) self.dashboard_service = DashboardService( self.fleet_repository, self.rotation_repository, ) async def startup(self) -> None: self.rotation_service.recover() if self.settings.scheduler_enabled: self.scheduler_loop.start(self.settings.scheduler_tick_seconds) async def shutdown(self) -> None: await self.scheduler_loop.stop() await self.rotation_service.shutdown()