from typing import Any from fastapi import APIRouter, Depends, HTTPException from sqlmodel import Session, select from app.api import deps from app.core import security from app.models.user import User from app.schemas.user import UserCreate, UserRead, UserUpdate router = APIRouter() @router.post("/", response_model=UserRead) def create_user( *, session: Session = Depends(deps.get_session), user_in: UserCreate, ) -> Any: """ Create new user. """ user = session.exec(select(User).where(User.email == user_in.email)).first() if user: raise HTTPException( status_code=400, detail="The user with this email already exists in the system", ) user = User( email=user_in.email, username=user_in.username, password_hash=security.get_password_hash(user_in.password), ) session.add(user) session.commit() session.refresh(user) return user @router.get("/me", response_model=UserRead) def read_user_me( current_user: deps.CurrentUser, ) -> Any: """ Get current user. """ return current_user @router.put("/me", response_model=UserRead) def update_user_me( *, session: Session = Depends(deps.get_session), user_in: UserUpdate, current_user: deps.CurrentUser, ) -> Any: """ Update own user. """ user_data = user_in.model_dump(exclude_unset=True) current_user.sqlmodel_update(user_data) session.add(current_user) session.commit() session.refresh(current_user) return current_user