Documentación de API - santig005/Distributed-Systems-gRPC GitHub Wiki
Documentación de la API REST (API Gateway)
Esta página detalla los endpoints REST expuestos por el API Gateway.
URL Base: http://<GATEWAY_HOST>:<GATEWAY_PORT>
(Ej: http://localhost:8080
)
Usuarios
Obtener Usuario por ID
- Endpoint:
GET /api/users/{userId}
- Descripción: Recupera los detalles de un usuario específico.
- Parámetros de Ruta:
userId
(string): El ID del usuario a buscar.
- Respuesta Exitosa (200 OK):
{ "status": "success", "users": [ { "userId": "1", "name": "Alice", "email": "[email protected]", "balance": 99551.5 // Ejemplo de saldo actualizado } ] }
- Respuestas de Error:
404 Not Found
: Si el usuario no existe.
{ "status": 404, "error": "Not Found", "message": "Usuario con ID 1 no encontrado." }
503 Service Unavailable
: Si el User Service no está disponible (y no se pudo encolar/no aplica).
{ "status": 503, "error": "Service Unavailable", "message": "El servicio subyacente no está disponible." }
Productos
Obtener Producto por ID
- Endpoint:
GET /api/products/{productId}
- Descripción: Recupera los detalles de un producto específico.
- Parámetros de Ruta:
productId
(string): El ID del producto a buscar.
- Respuesta Exitosa (200 OK):
{ "id": "1", "name": "Laptop Gamer", "price": 199.0, "description": "Una laptop potente." }
- Respuestas de Error:
404 Not Found
: Si el producto no existe.503 Service Unavailable
: Si el Product Service no está disponible.
Órdenes
Crear una Orden
- Endpoint:
POST /api/orders
- Descripción: Crea una nueva orden para un usuario con productos específicos. Orquesta llamadas a los servicios de Usuario y Producto, y actualiza el saldo del usuario. Utiliza MOM para failover.
- Cuerpo de la Solicitud (Request Body):
application/json
{ "userId": "1", "productIds": ["1", "2"] }
- Respuesta Exitosa (201 Created):
{ "id": "1745194637551", // ID generado por el servicio "userId": "1", // o user_id según el proto/implementación "productIds": ["1", "2"], // o product_ids "status": "CREATED", "total": 448.50 // El total calculado }
- Respuesta Aceptada (202 Accepted):
- Indica que la solicitud fue recibida pero un servicio subyacente (User, Product, o el propio Order Service temporalmente) no estaba disponible y la solicitud se encoló en RabbitMQ para procesamiento posterior.
{ "status": "accepted", "message": "La solicitud ha sido aceptada y será procesada. Puede que el servicio subyacente no esté disponible temporalmente." }
- Respuestas de Error Directas:
400 Bad Request
: Si faltauserId
oproductIds
, o si tienen formato incorrecto.
{ "status": 400, "error": "Bad Request", "message": "Se requiere 'userId' (string) y 'productIds' (array no vacío)." }
404 Not Found
: Si eluserId
o alguno de losproductIds
no existen y el error no es considerado retryable por el Gateway.
{ "status": 404, "error": "Not Found", "message": "Usuario 999 no encontrado" } // o { "status": 404, "error": "Not Found", "message": "Producto 999 inválido" }
412 Precondition Failed
(o400 Bad Request
según mapeo): Si el usuario no tiene saldo suficiente.
{ "status": 412, "error": "Precondition Failed", "message": "Saldo insuficiente (10.0 < 50.0)" }
503 Service Unavailable
: Si un servicio requerido falla de forma no retryable o si RabbitMQ falla al encolar.
Obtener Orden por ID
- Endpoint:
GET /api/orders/{orderId}
- Descripción: Recupera los detalles de una orden específica por su ID.
- Parámetros de Ruta:
orderId
(string): El ID de la orden a buscar.
- Respuesta Exitosa (200 OK):
{ "id": "1745194637551", "userId": "1", // o user_id "productIds": ["1", "2", "3"], // o product_ids "status": "CREATED", "total": 488.40 }
- Respuestas de Error:
404 Not Found
: Si la orden no existe.
Obtener Órdenes por ID de Usuario
- Endpoint:
GET /api/orders-user/{userId}
- Descripción: Recupera todas las órdenes asociadas a un usuario específico.
- Parámetros de Ruta:
userId
(string): El ID del usuario cuyas órdenes se buscan.
- Respuesta Exitosa (200 OK):
{ "orders": [ { "id": "1744906771993", "userId": "1", // o user_id "productIds": ["1"], // o product_ids "status": "CREATED", "total": 199.0 }, { "id": "1745194637551", "userId": "1", // o user_id "productIds": ["1", "2", "3"], // o product_ids "status": "CREATED", "total": 488.40 } // ... más órdenes si existen ] }
- Si el usuario no tiene órdenes, la respuesta será
200 OK
con"orders": []
.
- Si el usuario no tiene órdenes, la respuesta será
- Respuestas de Error:
500 Internal Server Error
/503 Service Unavailable
: Si hay problemas al contactar el Order Service.