2025-06-05 10:07:49 +00:00

91 lines
2.5 KiB
Python

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