from typing import Any, List from fastapi import APIRouter, Body, Depends, HTTPException from fastapi.encoders import jsonable_encoder from sqlalchemy.orm import Session from backend.app.core import security from backend.app.core.database import get_db from backend.app.models import sql_models from backend.app.schemas import schemas from backend.app.api import deps 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: sql_models.User = Depends(deps.get_current_active_superuser), ) -> Any: """ Retrieve users. """ users = db.query(sql_models.User).offset(skip).limit(limit).all() return users @router.post("", response_model=schemas.User) def create_user( *, db: Session = Depends(get_db), user_in: schemas.UserCreate, current_user: sql_models.User = Depends(deps.get_current_active_superuser), ) -> Any: """ Create new user. """ user = db.query(sql_models.User).filter(sql_models.User.username == user_in.username).first() if user: raise HTTPException( status_code=400, detail="The user with this username already exists in the system.", ) hashed_password = security.get_password_hash(user_in.password) db_user = sql_models.User( username=user_in.username, hashed_password=hashed_password, is_active=user_in.is_active, is_superuser=user_in.is_superuser, ) db.add(db_user) db.commit() db.refresh(db_user) return db_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: sql_models.User = Depends(deps.get_current_active_superuser), ) -> Any: """ Update a user. """ user = db.query(sql_models.User).filter(sql_models.User.id == user_id).first() if not user: raise HTTPException( status_code=404, detail="The user with this id does not exist in the system", ) # Check if username collision if logic allowed changing username (but UserUpdate doesn't have username) # So we just update fields if user_in.password: user.hashed_password = security.get_password_hash(user_in.password) if user_in.is_active is not None: user.is_active = user_in.is_active if user_in.is_superuser is not None: user.is_superuser = user_in.is_superuser db.add(user) db.commit() db.refresh(user) return user @router.delete("/{user_id}", response_model=schemas.User) def delete_user( *, db: Session = Depends(get_db), user_id: int, current_user: sql_models.User = Depends(deps.get_current_active_superuser), ) -> Any: """ Delete a user. """ user = db.query(sql_models.User).filter(sql_models.User.id == user_id).first() if not user: raise HTTPException( status_code=404, detail="The user with this id does not exist in the system", ) if user.id == current_user.id: raise HTTPException( status_code=400, detail="Users cannot delete themselves", ) db.delete(user) db.commit() return user