"""Load configuration from environment. No secrets in repo.""" import os from pathlib import Path from dotenv import load_dotenv load_dotenv() def _env(key: str, default: str | None = None) -> str: val = os.environ.get(key) if val is not None: return val.strip() if default is not None: return default raise ValueError(f"Missing required env: {key}") def get_api_keys() -> list[str]: """Comma-separated API keys. At least one required.""" raw = _env("API_KEYS", "") if not raw: raise ValueError("API_KEYS must be set (comma-separated list)") return [k.strip() for k in raw.split(",") if k.strip()] def get_storage_path() -> Path: """Directory for document files.""" p = Path(_env("STORAGE_PATH", "./data/files")) return p.resolve() def get_database_path() -> Path: """SQLite database path for metadata.""" p = Path(_env("DATABASE_PATH", "./data/local_office.db")) return p.resolve() def get_max_upload_bytes() -> int: """Max upload size in bytes.""" return int(_env("MAX_UPLOAD_BYTES", "20971520")) def get_rate_limit_per_minute() -> int: """Rate limit per API key per minute.""" return int(_env("RATE_LIMIT_PER_MINUTE", "60"))