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))