Kansho/backend/routers/admin.py

57 lines
2.1 KiB
Python

from fastapi import APIRouter, Depends, HTTPException
from auth import require_admin_dep
from db import get_db
from dialogue_store import StoreError, get_conversation, inventory, list_conversations, list_derived_for_conversation, list_messages
from version import APP_VERSION, BUILD_DATE, MODULE_VERSIONS
router = APIRouter(prefix="/api/admin", tags=["admin"])
@router.get("/health")
def admin_health(session: dict = Depends(require_admin_dep)):
with get_db() as conn:
users = conn.execute("SELECT COUNT(*) AS n FROM profiles").fetchone()["n"]
prompts = conn.execute("SELECT COUNT(*) AS n FROM ai_prompts").fetchone()["n"]
features = conn.execute("SELECT COUNT(*) AS n FROM features").fetchone()["n"]
dialogue = inventory()
return {
"ok": True,
"service": "kansho",
"version": APP_VERSION,
"build_date": BUILD_DATE,
"modules": MODULE_VERSIONS,
"inventory": {
"users": users,
"prompts": prompts,
"features": features,
"dialogue": dialogue,
},
"session": {
"profile_id": session["profile_id"],
"role": session["role"],
},
}
@router.get("/dialogue")
def admin_dialogue(session: dict = Depends(require_admin_dep)):
return {
"instance": inventory(),
"own_conversations": list_conversations(session["profile_id"]),
"note": "Fremde Lived Experience ist kein Alltagspfad. Detailansicht nur für das eigene Profil.",
}
@router.get("/dialogue/conversations/{conversation_id}")
def admin_conversation(conversation_id: str, session: dict = Depends(require_admin_dep)):
try:
conv = get_conversation(session["profile_id"], conversation_id)
return {
"conversation": conv,
"original_messages": list_messages(session["profile_id"], conversation_id),
"derived_records": list_derived_for_conversation(session["profile_id"], conversation_id),
}
except StoreError as exc:
raise HTTPException(status_code=exc.status_code, detail={"code": exc.code, "message": exc.message}) from exc