Spaces:
Sleeping
Sleeping
| """API layer — FastAPI dependencies and shared state. | |
| This module provides dependency injection for the DB, FileStore, and | |
| JobService, scoped to the application lifespan. | |
| """ | |
| from __future__ import annotations | |
| from typing import TYPE_CHECKING | |
| from src.app.jobs.service import JobService | |
| from src.app.persistence.db import Database | |
| from src.app.persistence.file_store import FileStore | |
| if TYPE_CHECKING: | |
| from src.app.settings import Settings | |
| # Module-level singletons, initialized during lifespan startup. | |
| _db: Database | None = None | |
| _file_store: FileStore | None = None | |
| _job_service: JobService | None = None | |
| def init_services(settings: Settings) -> None: | |
| """Initialize singletons. Called once during app startup.""" | |
| global _db, _file_store, _job_service | |
| _db = Database(settings.db_path) | |
| _db.connect() | |
| _file_store = FileStore(settings.storage_root) | |
| _file_store.ensure_dirs() | |
| _job_service = JobService(_db, _file_store) | |
| def shutdown_services() -> None: | |
| """Clean up. Called during app shutdown.""" | |
| global _db | |
| if _db: | |
| _db.close() | |
| _db = None | |
| def get_db() -> Database: | |
| assert _db is not None, "Database not initialized — call init_services first" | |
| return _db | |
| def get_file_store() -> FileStore: | |
| assert _file_store is not None, "FileStore not initialized" | |
| return _file_store | |
| def get_job_service() -> JobService: | |
| assert _job_service is not None, "JobService not initialized" | |
| return _job_service | |