This changed a bunch of code but no Reviewed-on: #17 Co-authored-by: ahtlon <git@ahtlon.de> Co-committed-by: ahtlon <git@ahtlon.de>
96 lines
2.8 KiB
Python
96 lines
2.8 KiB
Python
import logging
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from sqlmodel import Session, select
|
|
|
|
from app.model.models import UserCreate, UserDB, UserResponse, UserUpdate
|
|
from app.services.auth import auth_is_admin, get_password_hash
|
|
from app.services.auth import get_current_user as auth_user
|
|
from app.services.database import add_and_refresh, get_session
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
user_router = APIRouter(tags=["Users"], prefix="/api/v1/users")
|
|
|
|
|
|
@user_router.post("/", response_model=UserResponse)
|
|
def create_user(
|
|
*,
|
|
db: Session = Depends(get_session),
|
|
user: UserCreate,
|
|
admin: bool = Depends(auth_is_admin),
|
|
):
|
|
hashed_password = {"passwordhash": get_password_hash(user.password)}
|
|
try:
|
|
assert (
|
|
db.exec(select(UserDB).where(UserDB.name == user.name)).one_or_none()
|
|
is None
|
|
)
|
|
except AssertionError:
|
|
raise HTTPException(status.HTTP_409_CONFLICT, detail="Name already used!")
|
|
db_user = UserDB.model_validate(user, update=hashed_password)
|
|
return add_and_refresh(db, db_user)
|
|
|
|
|
|
@user_router.get("/", response_model=list[UserResponse])
|
|
def read_users(
|
|
*, db: Session = Depends(get_session), admin: bool = Depends(auth_is_admin)
|
|
):
|
|
users = db.exec(select(UserDB)).all()
|
|
return users
|
|
|
|
|
|
@user_router.get("/current", response_model=UserResponse)
|
|
def get_current_user(
|
|
db: Session = Depends(get_session), user: UserDB = Depends(auth_user)
|
|
):
|
|
return user
|
|
|
|
|
|
@user_router.get("/{user_id}", response_model=UserResponse)
|
|
def read_user(
|
|
*,
|
|
db: Session = Depends(get_session),
|
|
user_id: int,
|
|
admin: bool = Depends(auth_is_admin),
|
|
):
|
|
db_user = db.get(UserDB, user_id)
|
|
if db_user is None:
|
|
raise HTTPException(status_code=404, detail="User not found")
|
|
return db_user
|
|
|
|
|
|
@user_router.patch("/{user_id}", response_model=UserResponse)
|
|
def update_user(
|
|
*,
|
|
db: Session = Depends(get_session),
|
|
user_id: int,
|
|
user: UserUpdate,
|
|
admin: bool = Depends(auth_is_admin),
|
|
):
|
|
db_user = db.get(UserDB, user_id)
|
|
if db_user is None:
|
|
raise HTTPException(status_code=404, detail="User not found")
|
|
user_data = user.model_dump(exclude_unset=True)
|
|
hashed_password = {}
|
|
if "password" in user_data:
|
|
password = user_data["password"]
|
|
hashed_password = {"passwordhash": get_password_hash(password)}
|
|
db_user.sqlmodel_update(user_data, update=hashed_password)
|
|
return add_and_refresh(db, db_user)
|
|
|
|
|
|
@user_router.delete("/{user_id}")
|
|
def delete_user(
|
|
*,
|
|
db: Session = Depends(get_session),
|
|
user_id: int,
|
|
admin: bool = Depends(auth_is_admin),
|
|
):
|
|
db_user = db.get(UserDB, user_id)
|
|
if db_user is None:
|
|
raise HTTPException(status_code=404, detail="User not found")
|
|
db.delete(db_user)
|
|
db.commit()
|
|
return {"message": "User deleted successfully"}
|