2024-08-10 14:52:46 +00:00
|
|
|
import logging
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
from pydantic import BaseModel, PostgresDsn
|
|
|
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
|
|
|
|
|
|
BASE_DIR = Path(__file__).parent.parent
|
2024-08-11 17:18:32 +00:00
|
|
|
TEMPLATES_DIR = BASE_DIR / "templates"
|
|
|
|
STATIC_DIR = TEMPLATES_DIR / "static"
|
2024-08-10 14:52:46 +00:00
|
|
|
|
|
|
|
|
|
|
|
class RunConfig(BaseModel):
|
|
|
|
host: str = "0.0.0.0"
|
|
|
|
port: int = 8080
|
|
|
|
reload: bool = True
|
|
|
|
|
|
|
|
|
|
|
|
class DatabaseConfig(BaseModel):
|
2024-08-11 17:18:32 +00:00
|
|
|
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}"
|
2024-08-10 14:52:46 +00:00
|
|
|
echo: bool = False
|
|
|
|
echo_pool: bool = False
|
|
|
|
pool_size: int = 50
|
|
|
|
max_overflow: int = 10
|
2024-08-11 17:18:32 +00:00
|
|
|
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",
|
|
|
|
}
|
2024-08-10 14:52:46 +00:00
|
|
|
|
|
|
|
|
2024-08-11 17:18:32 +00:00
|
|
|
class PrefixConfig(BaseModel):
|
|
|
|
api: str = "/api"
|
2024-08-11 11:22:42 +00:00
|
|
|
ip: str = "/api/ip"
|
2024-08-11 17:18:32 +00:00
|
|
|
swagger: str = "/docs"
|
2024-08-10 14:52:46 +00:00
|
|
|
|
|
|
|
|
2024-08-11 17:18:32 +00:00
|
|
|
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"
|
2024-08-10 14:52:46 +00:00
|
|
|
|
|
|
|
|
|
|
|
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()
|
2024-08-11 17:18:32 +00:00
|
|
|
prefix: PrefixConfig = PrefixConfig()
|
2024-08-10 14:52:46 +00:00
|
|
|
log: LogConfig = LogConfig()
|
2024-08-11 17:18:32 +00:00
|
|
|
swagger: SwaggerConfig = SwaggerConfig()
|
2024-08-10 14:52:46 +00:00
|
|
|
db: DatabaseConfig
|
|
|
|
|
|
|
|
|
2024-08-11 11:22:42 +00:00
|
|
|
settings = Settings()
|
2024-08-11 17:18:32 +00:00
|
|
|
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}"
|
|
|
|
)
|
2024-08-11 11:22:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
def config_logging(level: str) -> None:
|
2024-08-10 14:52:46 +00:00
|
|
|
logging.basicConfig(
|
2024-08-11 11:22:42 +00:00
|
|
|
level=settings.log.log_level,
|
|
|
|
datefmt=settings.log.date_format,
|
|
|
|
format=settings.log.log_format,
|
2024-08-10 14:52:46 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
config_logging(level=settings.log.log_level)
|
|
|
|
log = logging.getLogger()
|
|
|
|
log.info("Logging initialized")
|