- Added role and tier fields to the ProfileUpdate model, allowing for better user role management. - Implemented new API endpoint for listing admin users, accessible only to portal admins. - Updated profile retrieval and update logic to handle role and tier changes, enforcing permissions for modifications. - Enhanced frontend navigation and routing to include the new admin users page, improving admin interface usability. - Bumped application version to 0.8.19 and updated changelog to reflect these changes.
42 lines
1.3 KiB
Python
42 lines
1.3 KiB
Python
"""
|
|
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
|