Files
onion-arch/app/presentation/api/v1/users.py
2026-01-30 16:34:56 +03:00

45 lines
1.5 KiB
Python

from __future__ import annotations
from uuid import UUID
from fastapi import APIRouter, Depends, HTTPException, status
from app.application.users.use_cases.create_user import (
CreateUserCommand,
CreateUserUseCase,
)
from app.application.users.use_cases.get_user import GetUserQuery, GetUserUseCase
from app.domain.users.exceptions import InvalidEmail, UserAlreadyExists, UserNotFound
from app.presentation.dependencies.users import get_create_user_uc, get_get_user_uc
from app.presentation.schemas.users import CreateUserRequest, UserResponse
router = APIRouter(prefix="/users", tags=["users"])
@router.post("", response_model=UserResponse, status_code=status.HTTP_201_CREATED)
async def create_user(
req: CreateUserRequest,
uc: CreateUserUseCase = Depends(get_create_user_uc),
) -> UserResponse:
try:
dto = await uc.execute(
CreateUserCommand(email=str(req.email), full_name=req.full_name)
)
return UserResponse(**dto.__dict__)
except InvalidEmail as e:
raise HTTPException(status_code=400, detail=str(e))
except UserAlreadyExists as e:
raise HTTPException(status_code=409, detail=str(e))
@router.get("/{user_id}", response_model=UserResponse)
async def get_user(
user_id: UUID,
uc: GetUserUseCase = Depends(get_get_user_uc),
) -> UserResponse:
try:
dto = await uc.execute(GetUserQuery(user_id=user_id))
return UserResponse(**dto.__dict__)
except UserNotFound as e:
raise HTTPException(status_code=404, detail=str(e))