""" Settings Frontend Views """ from datetime import datetime from pathlib import Path from fastapi import APIRouter, Request, HTTPException from fastapi.responses import HTMLResponse from fastapi.templating import Jinja2Templates from pydantic import BaseModel from app.core.config import settings from app.core.database import get_db_connection, release_db_connection router = APIRouter() templates = Jinja2Templates(directory="app") @router.get("/settings", response_class=HTMLResponse, tags=["Frontend"]) async def settings_page(request: Request): """Render settings page""" return templates.TemplateResponse("settings/frontend/settings.html", { "request": request, "title": "Indstillinger" }) @router.get("/settings/migrations", response_class=HTMLResponse, tags=["Frontend"]) async def migrations_page(request: Request): """Render database migrations page""" migrations_dir = Path(__file__).resolve().parents[3] / "migrations" migrations = [] if migrations_dir.exists(): for migration_file in sorted(migrations_dir.glob("*.sql")): stat = migration_file.stat() migrations.append({ "name": migration_file.name, "size_kb": round(stat.st_size / 1024, 1), "modified": datetime.fromtimestamp(stat.st_mtime).strftime("%Y-%m-%d %H:%M") }) return templates.TemplateResponse("settings/frontend/migrations.html", { "request": request, "title": "Database Migrationer", "migrations": migrations, "db_user": settings.POSTGRES_USER, "db_name": settings.POSTGRES_DB, "db_container": "bmc-hub-postgres" }) class MigrationExecution(BaseModel): file_name: str @router.post("/settings/migrations/execute", tags=["Frontend"]) def execute_migration(payload: MigrationExecution): """Execute a migration SQL file""" migrations_dir = Path(__file__).resolve().parents[3] / "migrations" migration_file = migrations_dir / payload.file_name if not migration_file.exists(): raise HTTPException(status_code=404, detail="Migration file not found") # Determine the container runtime (Podman or Docker) migration_sql = migration_file.read_text() conn = get_db_connection() try: with conn.cursor() as cursor: cursor.execute(migration_sql) conn.commit() except Exception as exc: conn.rollback() raise HTTPException(status_code=500, detail=f"Migration failed: {exc}") finally: release_db_connection(conn) return {"message": "Migration executed successfully"}