mitai-jinkendo/backend/routers/tandoor.py

79 lines
2.5 KiB
Python
Raw Normal View History

"""Per-user Tandoor connection. No recipe import yet."""
from __future__ import annotations
from typing import Optional
from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel, Field
from starlette.requests import Request
from slowapi import Limiter
from slowapi.util import get_remote_address
from auth import require_auth
from data_layer.tandoor_client import TandoorError, normalize_base_url, probe_connection
from data_layer.tandoor_settings import (
get_public_settings,
get_settings,
record_probe,
upsert_settings,
)
from db import get_cursor, get_db
router = APIRouter(prefix="/api/tandoor", tags=["tandoor"])
limiter = Limiter(key_func=get_remote_address)
class TandoorSettingsIn(BaseModel):
base_url: str = ""
token: Optional[str] = None
clear_token: bool = False
class TandoorProbeIn(BaseModel):
base_url: Optional[str] = None
token: Optional[str] = Field(default=None, description="Nur zum Testen; leer = gespeichertes Token")
@router.get("/settings")
def read_settings(session: dict = Depends(require_auth)):
pid = session["profile_id"]
with get_db() as conn:
return get_public_settings(get_cursor(conn), pid)
@router.put("/settings")
def write_settings(body: TandoorSettingsIn, session: dict = Depends(require_auth)):
pid = session["profile_id"]
try:
if body.clear_token:
url = ""
else:
url = normalize_base_url(body.base_url)
with get_db() as conn:
return upsert_settings(
get_cursor(conn), pid, url, body.token, clear_token=body.clear_token
)
except (TandoorError, ValueError) as e:
raise HTTPException(400, str(e)) from e
@router.post("/test")
@limiter.limit("10/minute")
def test_connection(request: Request, body: TandoorProbeIn | None = None, session: dict = Depends(require_auth)):
pid = session["profile_id"]
body = body or TandoorProbeIn()
with get_db() as conn:
cur = get_cursor(conn)
stored = get_settings(cur, pid)
url = (body.base_url or "").strip() or ((stored or {}).get("base_url") or "")
token = (body.token or "").strip() or ((stored or {}).get("api_token") or "")
try:
result = probe_connection(url, token)
if stored:
record_probe(cur, pid, True)
return result
except TandoorError as e:
if stored:
record_probe(cur, pid, False, str(e))
raise HTTPException(400, str(e)) from e