2026-04-06 12:41:49 +01:00
|
|
|
"""
|
2026-05-28 14:59:27 +01:00
|
|
|
Global configurations
|
2026-04-06 12:41:49 +01:00
|
|
|
|
2026-05-28 14:59:27 +01:00
|
|
|
Exports:
|
2026-04-06 12:41:49 +01:00
|
|
|
- CustomBaseSettings - Base class to be used by all modules for loading configs
|
2026-05-28 14:59:27 +01:00
|
|
|
- settings: Global configurations object
|
|
|
|
|
- app_configs: Dict generated from configs, used in app initialisation
|
2026-04-06 12:41:49 +01:00
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
from typing import Any
|
|
|
|
|
from urllib import parse
|
|
|
|
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
|
|
|
from pydantic import SecretStr
|
|
|
|
|
|
|
|
|
|
from src.constants import Environment
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CustomBaseSettings(BaseSettings):
|
2026-06-08 15:31:37 +01:00
|
|
|
model_config = SettingsConfigDict(
|
|
|
|
|
env_file=".env", env_file_encoding="utf-8", extra="ignore"
|
|
|
|
|
)
|
2026-04-06 12:41:49 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class Config(CustomBaseSettings):
|
2026-06-08 15:31:37 +01:00
|
|
|
APP_VERSION: str = "0.1"
|
|
|
|
|
ENVIRONMENT: Environment = Environment.PRODUCTION
|
|
|
|
|
SECRET_KEY: SecretStr = ""
|
|
|
|
|
DISABLE_AUTH: bool = False
|
2026-04-06 12:41:49 +01:00
|
|
|
|
2026-06-08 15:31:37 +01:00
|
|
|
CORS_ORIGINS: list[str] = ["*"]
|
|
|
|
|
CORS_ORIGINS_REGEX: str | None = None
|
|
|
|
|
CORS_HEADERS: list[str] = ["*"]
|
|
|
|
|
|
|
|
|
|
DATABASE_NAME: str = "fastapi-exp"
|
|
|
|
|
DATABASE_PORT: str = "5432"
|
|
|
|
|
DATABASE_HOSTNAME: str = "localhost"
|
|
|
|
|
DATABASE_CREDENTIALS: SecretStr = ":"
|
2026-04-06 12:41:49 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
settings = Config()
|
|
|
|
|
|
|
|
|
|
DATABASE_NAME = settings.DATABASE_NAME
|
|
|
|
|
DATABASE_PORT = settings.DATABASE_PORT
|
|
|
|
|
DATABASE_HOSTNAME = settings.DATABASE_HOSTNAME
|
|
|
|
|
DATABASE_CREDENTIALS = settings.DATABASE_CREDENTIALS.get_secret_value()
|
|
|
|
|
# this will support special chars for credentials
|
2026-06-08 15:31:37 +01:00
|
|
|
_DATABASE_CREDENTIAL_USER, _DATABASE_CREDENTIAL_PASSWORD = str(
|
|
|
|
|
DATABASE_CREDENTIALS
|
|
|
|
|
).split(":")
|
2026-04-06 12:41:49 +01:00
|
|
|
_QUOTED_DATABASE_PASSWORD = parse.quote_plus(str(_DATABASE_CREDENTIAL_PASSWORD))
|
|
|
|
|
|
2026-06-08 15:31:37 +01:00
|
|
|
SQLALCHEMY_DATABASE_URI = SecretStr(
|
|
|
|
|
f"postgresql+psycopg://{_DATABASE_CREDENTIAL_USER}:{_QUOTED_DATABASE_PASSWORD}@{DATABASE_HOSTNAME}:{DATABASE_PORT}/{DATABASE_NAME}"
|
|
|
|
|
)
|
2026-04-06 12:41:49 +01:00
|
|
|
|
2026-05-29 11:00:01 +01:00
|
|
|
if settings.ENVIRONMENT == Environment.TESTING:
|
2026-06-08 15:31:37 +01:00
|
|
|
SQLALCHEMY_DATABASE_URI = SecretStr("sqlite:///:memory:")
|
2026-05-29 11:00:01 +01:00
|
|
|
|
2026-04-06 12:41:49 +01:00
|
|
|
app_configs: dict[str, Any] = {"title": "App API"}
|
|
|
|
|
if settings.ENVIRONMENT.is_deployed:
|
2026-06-08 15:31:37 +01:00
|
|
|
app_configs["root_path"] = f"/v{settings.APP_VERSION}"
|
2026-04-06 12:41:49 +01:00
|
|
|
|
|
|
|
|
if not settings.ENVIRONMENT.is_debug:
|
2026-06-08 15:31:37 +01:00
|
|
|
app_configs["openapi_url"] = None # hide docs
|