""" Plattform-Admin: Übersicht aller Nutzer inkl. Vereinsmitgliedschaften (ohne Passwort-Hashes). """ from typing import Any, Dict, List from fastapi import APIRouter, Depends, HTTPException from auth import require_auth from club_tenancy import is_platform_admin, memberships_with_roles from db import get_db, get_cursor, r2d router = APIRouter(prefix="/api/admin", tags=["admin_users"]) _SAFE_PROFILE_COLS = """ id, name, email, role, tier, email_verified, active_club_id, created_at, updated_at, auth_type """ @router.get("/users") def list_platform_users(session: dict = Depends(require_auth)): """Alle Profile mit Vereinen/Rollen — nur Portal-Admin (admin oder superadmin).""" role = (session.get("role") or "").lower() if not is_platform_admin(role): raise HTTPException(status_code=403, detail="Nur Portal-Administratoren") with get_db() as conn: cur = get_cursor(conn) cur.execute( f""" SELECT {_SAFE_PROFILE_COLS.strip()} FROM profiles ORDER BY COALESCE(lower(trim(email)), ''), id """ ) rows: List[Dict[str, Any]] = [] for r in cur.fetchall(): d = r2d(r) d["clubs"] = memberships_with_roles(cur, int(d["id"]), active_only=False) rows.append(d) return rows