from fastapi import APIRouter, HTTPException, status from infrastructure.api.users.schemas import UserCreateRequest, UserUpdateRequest, UserResponse from application.services.user_services import ( CreateUser, GetUserById, GetUserByEmail, ListAllUsers, UpdateUser, DeleteUser ) from infrastructure.adapters.persistence.user_repository_sql import UserRepositorySQL router = APIRouter() user_repo = UserRepositorySQL() @router.post("/", response_model=UserResponse, status_code=status.HTTP_201_CREATED) async def create_user(user_data: UserCreateRequest): """Crea un nuevo usuario""" try: create_use_case = CreateUser(user_repo) user = create_use_case.execute( nombre=user_data.nombre, apellido=user_data.apellido, email=user_data.email, fecha_nacimiento=user_data.fecha_nacimiento, url_foto_perfil=user_data.url_foto_perfil, biografia=user_data.biografia ) return user except Exception as e: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail=f"Error al crear usuario: {str(e)}" ) @router.get("/{user_id}", response_model=UserResponse) async def get_user(user_id: int): """Obtiene un usuario por ID""" get_use_case = GetUserById(user_repo) user = get_use_case.execute(user_id) if not user: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=f"Usuario con ID {user_id} no encontrado" ) return user @router.get("/email/{email}", response_model=UserResponse) async def get_user_by_email(email: str): """Obtiene un usuario por email""" get_use_case = GetUserByEmail(user_repo) user = get_use_case.execute(email) if not user: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=f"Usuario con email {email} no encontrado" ) return user @router.get("/", response_model=list[UserResponse]) async def list_users(): """Obtiene todos los usuarios""" list_use_case = ListAllUsers(user_repo) return list_use_case.execute() @router.put("/{user_id}", response_model=UserResponse) async def update_user(user_id: int, user_data: UserUpdateRequest): """Actualiza un usuario""" update_use_case = UpdateUser(user_repo) user = update_use_case.execute( user_id=user_id, nombre=user_data.nombre, apellido=user_data.apellido, url_foto_perfil=user_data.url_foto_perfil, biografia=user_data.biografia ) if not user: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=f"Usuario con ID {user_id} no encontrado" ) return user @router.delete("/{user_id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_user(user_id: int): """Elimina un usuario""" delete_use_case = DeleteUser(user_repo) success = delete_use_case.execute(user_id) if not success: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=f"Usuario con ID {user_id} no encontrado" ) return None