FluxIP/app/container.py

78 lines
3.0 KiB
Python

from __future__ import annotations
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
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.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_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)
async def shutdown(self) -> None:
await self.scheduler_loop.stop()
await self.rotation_service.shutdown()