mitai-jinkendo/backend/routers/tandoor.py

77 lines
2.5 KiB
Python
Raw Normal View History

"""Per-user Tandoor connection. No recipe import yet."""
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: Optional[TandoorProbeIn] = 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