84 lines
3.2 KiB
Python
84 lines
3.2 KiB
Python
from __future__ import annotations
|
|
|
|
import logging
|
|
from pathlib import Path
|
|
|
|
from app.accounts.repository import AccountRepository
|
|
from app.accounts.service import AccountService
|
|
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
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
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.account_repository = AccountRepository(self.database, self.cipher)
|
|
self.integration_repository = IntegrationRepository(self.database, self.cipher)
|
|
self.fleet_repository = FleetRepository(self.database, self.cipher)
|
|
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.account_service = AccountService(self.account_repository)
|
|
self.integration_service = IntegrationService(self.integration_repository)
|
|
self.account_service.import_legacy_accounts(self.integration_repository)
|
|
self.rotation_service = RotationService(
|
|
self.rotation_repository,
|
|
self.integration_service,
|
|
self.account_service,
|
|
self.fleet_repository,
|
|
)
|
|
self.fleet_service = FleetService(
|
|
self.fleet_repository,
|
|
self.integration_service,
|
|
self.rotation_repository,
|
|
self.account_service,
|
|
)
|
|
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)
|
|
else:
|
|
logger.warning("scheduler_disabled")
|
|
|
|
async def shutdown(self) -> None:
|
|
await self.scheduler_loop.stop()
|
|
await self.rotation_service.shutdown()
|