2025-10-18 05:50:43 +00:00
|
|
|
"""
|
|
|
|
|
Centralized runtime settings for the Doof backend.
|
|
|
|
|
|
|
|
|
|
No external dependencies; reads from environment only so it can be imported
|
|
|
|
|
anywhere (including tests) without side effects.
|
|
|
|
|
"""
|
2025-10-19 13:12:16 +00:00
|
|
|
|
2025-10-18 05:50:43 +00:00
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
import os
|
2025-10-19 09:24:23 +00:00
|
|
|
from dataclasses import dataclass
|
2025-11-01 03:14:58 +00:00
|
|
|
from typing import Optional
|
2025-10-18 05:50:43 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
|
|
|
class Settings:
|
|
|
|
|
# Database
|
|
|
|
|
database_path: str = os.environ.get("DOOF_DB", "./data/doof.sqlite")
|
|
|
|
|
|
|
|
|
|
# Environment flags
|
|
|
|
|
prod: bool = os.environ.get("DOOF_PROD", "false").lower() in {"1", "true", "yes"}
|
|
|
|
|
|
|
|
|
|
# Frontend dev server for reverse proxy in non-prod
|
|
|
|
|
frontend_dev_url: str = os.environ.get("FRONTEND_DEV_URL", "http://localhost:8080/")
|
|
|
|
|
|
2025-11-01 03:14:58 +00:00
|
|
|
# JWT settings
|
|
|
|
|
jwt_issuer: str = os.environ.get("DOOF_JWT_ISSUER", "doof-backend")
|
|
|
|
|
jwt_audience: str = os.environ.get("DOOF_JWT_AUDIENCE", "doof-web")
|
|
|
|
|
access_ttl_seconds: int = int(os.environ.get("DOOF_JWT_ACCESS_TTL", "900")) # 15 minutes
|
|
|
|
|
refresh_ttl_seconds: int = int(os.environ.get("DOOF_JWT_REFRESH_TTL", "2592000")) # 30 days
|
|
|
|
|
access_secret_b64: Optional[str] = os.environ.get("DOOF_JWT_ACCESS_SECRET_B64")
|
|
|
|
|
refresh_secret_b64: Optional[str] = os.environ.get("DOOF_JWT_REFRESH_SECRET_B64")
|
|
|
|
|
|
2025-10-18 05:50:43 +00:00
|
|
|
|
|
|
|
|
# A module-level singleton for convenience imports
|
|
|
|
|
settings = Settings()
|