Files
home-automation/app/main.py
T

79 lines
2.3 KiB
Python
Raw Normal View History

2026-04-19 20:19:58 +02:00
from contextlib import asynccontextmanager
from pathlib import Path
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
from app import models # noqa: F401
2026-04-19 20:19:58 +02:00
from app.api.routes import pages, status
2026-04-20 10:42:35 +02:00
from app.api.routes.homeassistant import router as homeassistant_router
from app.api.routes.location import router as location_router
from app.api.routes.poo import router as poo_router
2026-04-19 20:19:58 +02:00
from app.config import get_settings
2026-04-19 23:02:43 +02:00
from scripts.location_db_adopt import LocationDatabaseAdoptionError, validate_location_runtime_db
from scripts.poo_db_adopt import PooDatabaseAdoptionError, validate_poo_runtime_db
2026-04-19 23:02:43 +02:00
def ensure_location_db_ready() -> None:
settings = get_settings()
if settings.location_sqlite_path is None:
return
try:
validate_location_runtime_db(settings.location_database_url)
except LocationDatabaseAdoptionError as exc:
raise RuntimeError(str(exc)) from exc
2026-04-19 20:19:58 +02:00
def ensure_poo_db_ready() -> None:
settings = get_settings()
if settings.poo_sqlite_path is None:
return
try:
validate_poo_runtime_db(settings.poo_database_url)
except PooDatabaseAdoptionError as exc:
raise RuntimeError(str(exc)) from exc
2026-04-19 20:19:58 +02:00
def ensure_runtime_dirs() -> None:
settings = get_settings()
for path in (settings.location_sqlite_path, settings.poo_sqlite_path):
if path is not None:
path.parent.mkdir(parents=True, exist_ok=True)
2026-04-19 20:19:58 +02:00
@asynccontextmanager
async def lifespan(_: FastAPI):
ensure_runtime_dirs()
2026-04-19 23:02:43 +02:00
ensure_location_db_ready()
ensure_poo_db_ready()
2026-04-19 20:19:58 +02:00
yield
def create_app() -> FastAPI:
settings = get_settings()
app = FastAPI(
title=settings.app_name,
debug=settings.app_debug,
version="0.1.0",
lifespan=lifespan,
description=(
"Python rewrite skeleton for the home automation backend. "
"This stage provides only the foundation for future module migration."
),
)
static_dir = Path(__file__).parent / "static"
app.mount("/static", StaticFiles(directory=static_dir), name="static")
app.include_router(status.router)
app.include_router(pages.router)
2026-04-20 10:42:35 +02:00
app.include_router(homeassistant_router)
app.include_router(location_router)
app.include_router(poo_router)
2026-04-19 20:19:58 +02:00
return app
app = create_app()