from fastapi import APIRouter, Depends, HTTPException from sqlalchemy import delete, select from sqlalchemy.orm import Session from app.api import deps from app.core.security import get_password_hash from app.models import User from app.schemas.requests import UserCreateRequest, UserUpdatePasswordRequest from app.schemas.responses import UserResponse router = APIRouter() @router.get("", response_model=list[UserResponse]) async def list_users( current_user: User = Depends(deps.get_current_user), session: Session = Depends(deps.get_session), ): """Returns the list of users from the application""" return session.execute(select(User)).scalars().all() @router.get("/me", response_model=UserResponse) async def read_current_user( current_user: User = Depends(deps.get_current_user), ): """Get current user""" return current_user @router.delete("/me", status_code=204) async def delete_current_user( current_user: User = Depends(deps.get_current_user), session: Session = Depends(deps.get_session), ): """Delete current user""" session.execute(delete(User).where(User.id == current_user.id)) session.commit() @router.post("/update-password", response_model=UserResponse) async def reset_current_user_password( user_update_password: UserUpdatePasswordRequest, session: Session = Depends(deps.get_session), current_user: User = Depends(deps.get_current_user), ): """Update current user password""" current_user.hashed_password = get_password_hash(user_update_password.password) session.add(current_user) session.commit() return current_user @router.post("/register", response_model=UserResponse) async def register_new_user( new_user: UserCreateRequest, session: Session = Depends(deps.get_session), ): """Create new user""" result = session.execute(select(User).where(User.email == new_user.email)) if result.scalars().first() is not None: raise HTTPException(status_code=400, detail="Cannot use this email address") user = User( email=new_user.email, hashed_password=get_password_hash(new_user.password), ) session.add(user) session.commit() return user