import logging from pathlib import Path from pydantic import BaseModel, PostgresDsn from pydantic_settings import BaseSettings, SettingsConfigDict BASE_DIR = Path(__file__).parent.parent TEMPLATES_DIR = BASE_DIR / "templates" STATIC_DIR = TEMPLATES_DIR / "static" class RunConfig(BaseModel): host: str = "0.0.0.0" port: int = 8080 reload: bool = True class DatabaseConfig(BaseModel): drivername: str = "postgresql+asyncpg" username: str = "username" password: str = "password" host: str = "localhost" port: int = 5432 database: str = "dbname" url: PostgresDsn = f"{drivername}://{username}:{password}@{host}:{port}/{database}" echo: bool = False echo_pool: bool = False pool_size: int = 50 max_overflow: int = 10 naming_convention: dict[str, str] = { "ix": "ix_%(column_0_label)s", "uq": "uq_%(table_name)s_%(column_0_name)s", "ck": "ck_%(table_name)s_%(constraint_name)s", "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", "pk": "pk_%(table_name)s", } class PrefixConfig(BaseModel): api: str = "/api" ip: str = "/api/ip" swagger: str = "/docs" class SwaggerConfig(BaseModel): openapi_url: str = "/openapi.json" title: str = "Blocked IP API" oauth2_redirect_url: str = "/docs/oauth2-redirect" swagger_js_url: str = "/static/swagger/swagger-ui-bundle.js" swagger_css_url: str = "/static/swagger/swagger-ui.css" swagger_favicon_url: str = "/static/swagger/favicon.png" class LogConfig(BaseModel): date_format: str = "%Y-%m-%d %H:%M:%S" log_format: str = ( "[%(asctime)s.%(msecs)03d] %(module)-15s:%(lineno)4d | %(funcName)-20s| %(levelname)-8s | %(message)s" ) log_level: str = "INFO" class Settings(BaseSettings): model_config = SettingsConfigDict( env_file=(BASE_DIR / ".env-template", BASE_DIR / ".env"), case_sensitive=False, env_nested_delimiter="__", env_prefix="BLOCKING_IP__", ) run: RunConfig = RunConfig() prefix: PrefixConfig = PrefixConfig() log: LogConfig = LogConfig() swagger: SwaggerConfig = SwaggerConfig() db: DatabaseConfig settings = Settings() settings.db.url = ( f"{settings.db.drivername}://" f"{settings.db.username}:" f"{settings.db.password}@" f"{settings.db.host}:" f"{settings.db.port}/" f"{settings.db.database}" ) def config_logging(level: str) -> None: logging.basicConfig( level=settings.log.log_level, datefmt=settings.log.date_format, format=settings.log.log_format, ) config_logging(level=settings.log.log_level) log = logging.getLogger() log.info("Logging initialized")