from fastapi import APIRouter, Depends, HTTPException, status from typing import List from ..models import UserRecord from ..security import is_admin from ..firebase_config import get_db, auth router = APIRouter() @router.get("/", response_model=List[UserRecord], dependencies=[Depends(is_admin)]) async def read_users(): """ Retrieves a list of all user documents from the 'users' collection in Firestore. """ db = get_db() users_ref = db.collection('users').stream() return [UserRecord(**doc.to_dict()) for doc in users_ref] @router.patch("/{user_id}/role", response_model=UserRecord, dependencies=[Depends(is_admin)]) async def update_user_role(user_id: str, role: str): """ Updates a user's role in their Firestore document. """ if role not in ["member", "user", "admin"]: raise HTTPException(status_code=400, detail="Invalid role specified") db = get_db() user_ref = db.collection('users').document(user_id) if user_ref.get().exists: user_ref.update({"role": role}) updated_user = user_ref.get() return UserRecord(**updated_user.to_dict()) raise HTTPException(status_code=404, detail="User not found") @router.delete("/{user_id}", status_code=status.HTTP_204_NO_CONTENT, dependencies=[Depends(is_admin)]) async def delete_user(user_id: str): """ Deletes a user from Firebase Auth and their corresponding document from Firestore. """ try: auth.delete_user(user_id) db = get_db() user_ref = db.collection('users').document(user_id) if user_ref.get().exists: user_ref.delete() return except auth.UserNotFoundError: raise HTTPException(status_code=404, detail="User not found in Firebase Authentication")