feat: bootstrap FastAPI configuration

This commit is contained in:
Bastian Wagner
2026-08-15 09:14:33 +02:00
parent c7e834bf14
commit 91728cba86
6 changed files with 119 additions and 0 deletions

0
app/__init__.py Normal file
View File

36
app/config.py Normal file
View File

@@ -0,0 +1,36 @@
from functools import lru_cache
from pathlib import Path
from pydantic import Field, PositiveInt, model_validator
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_file=".env", extra="ignore", case_sensitive=False)
admin_password: str = Field(alias="ADMIN_PASSWORD", min_length=1)
secret_key: str = Field(alias="SECRET_KEY", min_length=16)
credential_encryption_key: str = Field(alias="CREDENTIAL_ENCRYPTION_KEY", min_length=1)
data_dir: Path = Field(default=Path("/data"), alias="DATA_DIR")
database_url: str | None = Field(default=None, alias="DATABASE_URL")
sync_interval_minutes: PositiveInt = Field(default=5, alias="SYNC_INTERVAL_MINUTES")
@model_validator(mode="after")
def derive_paths(self) -> "Settings":
self.data_dir = self.data_dir.expanduser().resolve()
if self.database_url is None:
self.database_url = f"sqlite:///{self.data_dir / 'app.db'}"
return self
@property
def tokens_dir(self) -> Path:
return self.data_dir / "tokens"
@property
def activities_dir(self) -> Path:
return self.data_dir / "activities"
@lru_cache
def get_settings() -> Settings:
return Settings()

22
app/main.py Normal file
View File

@@ -0,0 +1,22 @@
from fastapi import FastAPI
from app.config import Settings, get_settings
def create_app(settings: Settings | None = None) -> FastAPI:
resolved = settings or get_settings()
resolved.data_dir.mkdir(parents=True, exist_ok=True)
resolved.tokens_dir.mkdir(parents=True, exist_ok=True)
resolved.activities_dir.mkdir(parents=True, exist_ok=True)
app = FastAPI(title="MyWhoosh Garmin Sync")
app.state.settings = resolved
@app.get("/healthz")
def healthz() -> dict[str, str]:
return {"status": "ok"}
return app
app = create_app()