60 lines
1.6 KiB
Python
60 lines
1.6 KiB
Python
"""FastAPI application factory for SneakySwole.
|
|
|
|
Creates and configures the FastAPI app with routes, templates,
|
|
static files, and structured logging.
|
|
"""
|
|
|
|
from pathlib import Path
|
|
|
|
import structlog
|
|
from fastapi import FastAPI
|
|
from fastapi.staticfiles import StaticFiles
|
|
from fastapi.templating import Jinja2Templates
|
|
|
|
from app.config import get_settings
|
|
from app.logging_config import setup_logging
|
|
from app.routes.health import router as health_router
|
|
from app.routes.pages import router as pages_router
|
|
|
|
logger = structlog.get_logger(__name__)
|
|
|
|
# Template and static file directories
|
|
_BASE_DIR = Path(__file__).resolve().parent
|
|
TEMPLATES_DIR = _BASE_DIR / "templates"
|
|
STATIC_DIR = _BASE_DIR / "static"
|
|
|
|
|
|
def create_app() -> FastAPI:
|
|
"""Create and configure the FastAPI application.
|
|
|
|
Returns:
|
|
A fully configured FastAPI application instance.
|
|
"""
|
|
settings = get_settings()
|
|
setup_logging(log_level=settings.app_log_level)
|
|
|
|
app = FastAPI(
|
|
title="SneakySwole",
|
|
description="Open-source workout tracking and programming",
|
|
version="0.1.0",
|
|
)
|
|
|
|
# Mount static files
|
|
app.mount("/static", StaticFiles(directory=str(STATIC_DIR)), name="static")
|
|
|
|
# Jinja2 templates (available to routes via request.state or dependency)
|
|
templates = Jinja2Templates(directory=str(TEMPLATES_DIR))
|
|
app.state.templates = templates
|
|
|
|
# Register route modules
|
|
app.include_router(health_router)
|
|
app.include_router(pages_router)
|
|
|
|
logger.info("app_started", environment=settings.app_env)
|
|
|
|
return app
|
|
|
|
|
|
# Uvicorn entry point
|
|
app = create_app()
|