from typing import Any from fastapi import APIRouter, Body, Depends, HTTPException, status from pydantic import EmailStr from sqlalchemy.orm import Session from app import crud, models, schemas from app.api import deps router = APIRouter() @router.post("/", response_model=schemas.User) def create_user( *, db: Session = Depends(deps.get_db), user_in: schemas.UserCreate, ) -> Any: """ Create new user with either email or username """ # Check if user exists with provided email if user_in.email: user = crud.user.get_by_email(db, email=user_in.email) if user: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Email already registered", ) # Check if user exists with provided username if user_in.username: user = crud.user.get_by_username(db, username=user_in.username) if user: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Username already registered", ) # Create new user user = crud.user.create(db, obj_in=user_in) return user @router.get("/me", response_model=schemas.User) def read_user_me( current_user: models.User = Depends(deps.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(deps.get_db), current_user: models.User = Depends(deps.get_current_active_user), email: EmailStr = Body(None), username: str = Body(None), password: str = Body(None), ) -> Any: """ Update current user """ user_in = schemas.UserUpdate( email=email, username=username, password=password ) # If updating email, check it's not already taken if email and email != current_user.email: user = crud.user.get_by_email(db, email=email) if user: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Email already registered", ) # If updating username, check it's not already taken if username and username != current_user.username: user = crud.user.get_by_username(db, username=username) if user: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Username already registered", ) user = crud.user.update(db, db_obj=current_user, obj_in=user_in) return user