from __future__ import annotations import os from dataclasses import dataclass from functools import lru_cache from pathlib import Path from typing import List def _split_csv(value: str | None, *, fallback: List[str]) -> List[str]: if not value: return fallback return [item.strip() for item in value.split(",") if item.strip()] @dataclass(frozen=True) class Settings: app_name: str api_prefix: str cors_origins: List[str] storage_dir: Path max_upload_mb: int frontend_base_url: str pdf_timeout_ms: int @lru_cache def get_settings() -> Settings: return Settings( app_name=os.getenv("APP_NAME", "Starter API"), api_prefix=os.getenv("API_PREFIX", "/api"), cors_origins=_split_csv( os.getenv("CORS_ORIGINS"), fallback=["http://localhost:5173"] ), storage_dir=Path(os.getenv("STORAGE_DIR", "data")).resolve(), max_upload_mb=int(os.getenv("MAX_UPLOAD_MB", "50")), frontend_base_url=os.getenv("FRONTEND_BASE_URL", "http://localhost:5173"), pdf_timeout_ms=int(os.getenv("PDF_TIMEOUT_MS", "90000")), )