"""Application settings."""
from functools import lru_cache
from typing import Literal
from pydantic import Field
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
"""Runtime configuration loaded from environment variables."""
model_config = SettingsConfigDict(
env_file=".env",
env_prefix="GNEXUS_CREDS_",
extra="ignore",
)
env: Literal["development", "test", "production"] = "development"
app_name: str = "gnexus-creds"
database_url: str = "postgresql+psycopg://gnexus_creds:gnexus_creds@localhost:5432/gnexus_creds"
master_key: str = Field(default="change-me-to-a-32-byte-url-safe-key", min_length=16)
session_secret: str = Field(default="change-me", min_length=8)
session_cookie_name: str = "gnexus_creds_session"
session_ttl_seconds: int = 60 * 60 * 24 * 14
auth_base_url: str = Field(default="http://gnexus-auth.local", alias="GNEXUS_AUTH_BASE_URL")
auth_client_id: str = Field(default="gnexus-creds", alias="GNEXUS_AUTH_CLIENT_ID")
auth_client_secret: str = Field(default="change-me", alias="GNEXUS_AUTH_CLIENT_SECRET")
auth_redirect_uri: str = Field(
default="http://localhost:8000/auth/callback",
alias="GNEXUS_AUTH_REDIRECT_URI",
)
auth_webhook_secret: str = Field(default="change-me", alias="GNEXUS_AUTH_WEBHOOK_SECRET")
rate_limit_window_seconds: int = 60
rate_limit_max_sensitive_requests: int = 120
@property
def is_production(self) -> bool:
return self.env == "production"
@lru_cache
def get_settings() -> Settings:
return Settings()