feat(admin): vollständiges Admin-Panel in der Web-UI (Phase 1)
Ersetzt das rudimentäre Nutzer-Dropdown durch ein vollwertiges
Admin-Panel-Overlay mit 5 Tabs:
Nutzer: Anlegen (Token einmalig), Umbenennen, Token-Reset,
Löschen, Erinnerungen verwalten (anzeigen/add/delete)
Gespräche: Nutzer → Sessions → Transkript (Chat-Bubble-Ansicht)
Notfälle: Tabelle aller emergency_events mit Zeitstempel/Kategorie
Status: Gateway-Status, Provider-Config, Laufzeit-Metriken
Metriken: Nutzungsstatistik pro Nutzer + Gesamtsumme
Backend: 7 neue Admin-Endpunkte in admin.py, 5 neue Store-Methoden.
Design: Tailwind CSS, Tag/Nacht-Modus, responsiv.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
8e48ab6d66
commit
b38992cf28
4 changed files with 710 additions and 34 deletions
|
|
@ -101,3 +101,54 @@ async def list_users():
|
|||
}
|
||||
for u in get_store().list_users()
|
||||
]
|
||||
|
||||
|
||||
@router.get("/admin/users/{user_id}/memories", dependencies=[Depends(require_admin)])
|
||||
async def get_user_memories(user_id: str):
|
||||
"""Gibt alle Erinnerungen eines Nutzers zurueck."""
|
||||
store = get_store()
|
||||
if store.get_user(user_id) is None:
|
||||
raise HTTPException(status_code=404, detail=f"Nutzer {user_id!r} nicht gefunden.")
|
||||
return [
|
||||
{"id": m.id, "content": m.content, "created_at": m.created_at}
|
||||
for m in store.get_memories(user_id)
|
||||
]
|
||||
|
||||
|
||||
@router.delete("/admin/users/{user_id}/memories/{memory_id}", dependencies=[Depends(require_admin)])
|
||||
async def delete_user_memory(user_id: str, memory_id: int):
|
||||
"""Loescht eine einzelne Erinnerung eines Nutzers."""
|
||||
deleted = get_store().delete_memory(user_id, memory_id)
|
||||
if not deleted:
|
||||
raise HTTPException(status_code=404, detail="Erinnerung nicht gefunden.")
|
||||
return {"deleted": memory_id}
|
||||
|
||||
|
||||
@router.get("/admin/users/{user_id}/sessions", dependencies=[Depends(require_admin)])
|
||||
async def list_user_sessions(user_id: str):
|
||||
"""Listet alle Sessions eines Nutzers (neueste zuerst)."""
|
||||
return get_store().list_sessions_for_user(user_id)
|
||||
|
||||
|
||||
@router.get("/admin/sessions/{session_id}/messages", dependencies=[Depends(require_admin)])
|
||||
async def get_session_messages(session_id: str, limit: int = 200):
|
||||
"""Gibt alle Nachrichten einer Session zurueck (Gespraechs-Browser)."""
|
||||
return get_store().get_messages_for_session(session_id, limit)
|
||||
|
||||
|
||||
@router.get("/admin/emergency-events", dependencies=[Depends(require_admin)])
|
||||
async def list_emergency_events(limit: int = 50):
|
||||
"""Listet alle protokollierten Notfall-Ereignisse (neueste zuerst)."""
|
||||
return get_store().list_emergency_events(limit)
|
||||
|
||||
|
||||
@router.get("/admin/users/{user_id}/usage", dependencies=[Depends(require_admin)])
|
||||
async def get_user_usage(user_id: str):
|
||||
"""Nutzungsstatistik eines Nutzers (letzte 30 Tage)."""
|
||||
return get_store().get_usage_for_user(user_id)
|
||||
|
||||
|
||||
@router.get("/admin/usage", dependencies=[Depends(require_admin)])
|
||||
async def get_all_usage():
|
||||
"""Aggregierte Nutzungsstatistik aller Nutzer."""
|
||||
return get_store().get_all_usage()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue