2025-05-26 19:04:54 +00:00

110 lines
2.7 KiB
Python

from typing import Any, List
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
from app.db.session import get_db
from app.schemas.user import UserCreate, User as UserSchema, UserUpdate
from app.schemas.response import DataResponse
from app.services.user import (
create_user,
get_user,
get_user_by_email,
get_users,
update_user,
delete_user,
)
router = APIRouter()
@router.post(
"/", response_model=DataResponse[UserSchema], status_code=status.HTTP_201_CREATED
)
def create_new_user(
*,
user_in: UserCreate,
db: Session = Depends(get_db),
) -> Any:
"""
Create new user.
"""
user = get_user_by_email(db, email=user_in.email)
if user:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="The user with this email already exists.",
)
user = create_user(db, obj_in=user_in)
return DataResponse(data=user, message="User created successfully")
@router.get("/", response_model=DataResponse[List[UserSchema]])
def read_users(
skip: int = 0,
limit: int = 100,
db: Session = Depends(get_db),
) -> Any:
"""
Retrieve users.
"""
users = get_users(db, skip=skip, limit=limit)
return DataResponse(data=users, message="Users retrieved successfully")
@router.get("/{user_id}", response_model=DataResponse[UserSchema])
def read_user(
user_id: int,
db: Session = Depends(get_db),
) -> Any:
"""
Get user by ID.
"""
user = get_user(db, id=user_id)
if not user:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="User not found",
)
return DataResponse(data=user, message="User retrieved successfully")
@router.put("/{user_id}", response_model=DataResponse[UserSchema])
def update_user_info(
*,
user_id: int,
user_in: UserUpdate,
db: Session = Depends(get_db),
) -> Any:
"""
Update user.
"""
user = get_user(db, id=user_id)
if not user:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="User not found",
)
user = update_user(db, db_obj=user, obj_in=user_in)
return DataResponse(data=user, message="User updated successfully")
@router.delete(
"/{user_id}", status_code=status.HTTP_204_NO_CONTENT, response_model=None
)
def delete_user_by_id(
user_id: int,
db: Session = Depends(get_db),
) -> None:
"""
Delete user.
"""
user = get_user(db, id=user_id)
if not user:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="User not found",
)
delete_user(db, id=user_id)
return None