from typing import Optional from urllib.parse import quote from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): # Base app settings model_config = SettingsConfigDict(env_file=".env", extra="ignore") app_name: str = "F1tness Parser API" version: str = "0.0.1" debug: bool = False # Auth: JWT_SECRET signs access tokens, it must be long and random (see .env.example) JWT_SECRET: str = "" ACCESS_TOKEN_TTL_MINUTES: int = 15 REFRESH_TOKEN_TTL_DAYS: int = 30 # The refresh cookie of the web client is sent only over HTTPS when this is on COOKIE_SECURE: bool = False # Postgres database settings POSTGRES_DATABASE_URL: Optional[str] = None POSTGRES_DATABASE_HOST: str = "localhost" POSTGRES_DATABASE_PORT: int = 5432 POSTGRES_DATABASE_DB: str = "f1tness_db" POSTGRES_DATABASE_USER: str = "postgres" POSTGRES_DATABASE_PASSWORD: str = "password" def get_postgres_database_url(self) -> str: """SQLAlchemy async URL. POSTGRES_DATABASE_URL, if set, takes precedence.""" if self.POSTGRES_DATABASE_URL: return self.POSTGRES_DATABASE_URL return ( f"postgresql+asyncpg://{quote(self.POSTGRES_DATABASE_USER)}" f":{quote(self.POSTGRES_DATABASE_PASSWORD)}" f"@{self.POSTGRES_DATABASE_HOST}" f":{self.POSTGRES_DATABASE_PORT}/{self.POSTGRES_DATABASE_DB}" ) settings = Settings()