"""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