2025-05-30 20:35:55 +00:00

131 lines
3.7 KiB
Python

"""
User management endpoints
"""
from typing import Any, List
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
from app import models, schemas, services
from app.core.deps import get_current_active_superuser, get_current_active_user
from app.db.session import get_db
router = APIRouter()
@router.get("/", response_model=List[schemas.User])
def read_users(
db: Session = Depends(get_db),
skip: int = 0,
limit: int = 100,
current_user: models.User = Depends(get_current_active_superuser),
) -> Any:
"""
Retrieve users. Only superusers can access this endpoint.
"""
users = services.user.get_multi(db, skip=skip, limit=limit)
return users
@router.get("/me", response_model=schemas.User)
def read_user_me(
current_user: models.User = Depends(get_current_active_user),
) -> Any:
"""
Get current user.
"""
return current_user
@router.put("/me", response_model=schemas.User)
def update_user_me(
*,
db: Session = Depends(get_db),
user_in: schemas.UserUpdate,
current_user: models.User = Depends(get_current_active_user),
) -> Any:
"""
Update own user.
"""
if user_in.username and user_in.username != current_user.username:
user = services.user.get_by_username(db, username=user_in.username)
if user:
raise HTTPException(
status_code=400,
detail="Username already registered",
)
if user_in.email and user_in.email != current_user.email:
user = services.user.get_by_email(db, email=user_in.email)
if user:
raise HTTPException(
status_code=400,
detail="Email already registered",
)
user = services.user.update(db, db_obj=current_user, obj_in=user_in)
return user
@router.get("/{user_id}", response_model=schemas.User)
def read_user(
user_id: int,
current_user: models.User = Depends(get_current_active_user),
db: Session = Depends(get_db),
) -> Any:
"""
Get a specific user by id.
"""
user = services.user.get(db, user_id=user_id)
if user == current_user:
return user
if not services.user.is_superuser(current_user):
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="The user doesn't have enough privileges",
)
if not user:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="User not found",
)
return user
@router.put("/{user_id}", response_model=schemas.User)
def update_user(
*,
db: Session = Depends(get_db),
user_id: int,
user_in: schemas.UserUpdate,
current_user: models.User = Depends(get_current_active_superuser),
) -> Any:
"""
Update a user. Only superusers can access this endpoint.
"""
user = services.user.get(db, user_id=user_id)
if not user:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="User not found",
)
# Check if username or email already exists
if user_in.username and user_in.username != user.username:
existing_user = services.user.get_by_username(db, username=user_in.username)
if existing_user:
raise HTTPException(
status_code=400,
detail="Username already registered",
)
if user_in.email and user_in.email != user.email:
existing_user = services.user.get_by_email(db, email=user_in.email)
if existing_user:
raise HTTPException(
status_code=400,
detail="Email already registered",
)
user = services.user.update(db, db_obj=user, obj_in=user_in)
return user