47 lines
1.8 KiB
Python
47 lines
1.8 KiB
Python
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") |