Reseñas - bootcamp-uchile-2026/grupo-4-backend GitHub Wiki
Reseñas
Servicio encargado de gestionar las reseñas que los clientes realizan sobre los productos del ecommerce.
El servicio permite consultar, crear, modificar y eliminar reseñas.
Endpoints
GET /resenas- Obtener reseñas con filtros opcionalesGET /resenas/{id}- Obtener reseña por IDPOST /resenas- Crear reseñaPATCH /resenas/{id}- Modificar parcialmente una reseñaDELETE /resenas/{id}- Eliminar reseña
Modelo
Reseña
Representa una reseña realizada por un cliente sobre un producto.
| Campo | Tipo | Descripción |
|---|---|---|
| id | number | Identificador único de la reseña |
| clienteId | number | Identificador del cliente |
| productoId | number | Identificador del producto |
| titulo | string | Título de la reseña |
| detalle | string (opcional) | Descripción de la reseña |
| estrellas | number | Calificación del producto, de 1 a 5 estrellas |
DTOs
CreateResenaDto
DTO utilizado para crear una nueva reseña.
Campos y validaciones
| Campo | Tipo | Requerido | Validaciones |
|---|---|---|---|
| clienteId | number | Sí | Número entero mayor o igual a 1 |
| productoId | number | Sí | Número entero mayor o igual a 1 |
| titulo | string | Sí | Texto no vacío ni compuesto únicamente por espacios |
| detalle | string | No | Si se envía, debe ser texto y no contener únicamente espacios |
| estrellas | number | Sí | Número entero entre 1 y 5 |
Los identificadores numéricos y estrellas se transforman a número mediante class-transformer y se validan con class-validator.
Ejemplo de Request Body
{
"clienteId": 1,
"productoId": 2,
"titulo": "Producto mediocre",
"detalle": "El producto llegó en buenas condiciones, pero esperaba mejor sabor.",
"estrellas": 2
}
UpdateResenaDto
DTO utilizado para actualizar parcialmente una reseña existente.
Hereda los campos y validaciones de CreateResenaDto, pero todos son opcionales mediante PartialType.
Ejemplo de Request Body
{
"titulo": "Producto arriba del promedio",
"estrellas": 4
}
ResenaQueryDto
DTO utilizado para consultar reseñas con filtros opcionales.
| Campo | Tipo | Requerido | Validaciones |
|---|---|---|---|
| productoId | number | No | Número entero mayor o igual a 1 |
| clienteId | number | No | Número entero mayor o igual a 1 |
ResenaResponseDto
DTO utilizado para representar una reseña en las respuestas de la API. El campo detalle es opcional.
{
"id": 1,
"clienteId": 1,
"productoId": 2,
"titulo": "Producto arriba del promedio",
"detalle": "Buena calidad y presentación.",
"estrellas": 4
}
Endpoints detallados
GET /resenas
Obtiene una lista de reseñas con filtros opcionales por producto y cliente.
Query Parameters
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| productoId | number | No | Filtra por el identificador del producto (entero mayor o igual a 1) |
| clienteId | number | No | Filtra por el identificador del cliente (entero mayor o igual a 1) |
Ejemplo de solicitud
GET /resenas?productoId=1
Response — 200 OK
[
{
"id": 1,
"clienteId": 3,
"productoId": 1,
"titulo": "El mejor producto que he comprado",
"detalle": "Excelente sabor y presentación.",
"estrellas": 5
},
{
"id": 2,
"clienteId": 2,
"productoId": 1,
"titulo": "Producto en malas condiciones",
"detalle": "El empaque llegó dañado.",
"estrellas": 1
}
]
GET /resenas/{id}
Obtiene una reseña específica mediante su identificador.
Path Parameters
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| id | number | Sí | Identificador de la reseña; ParseIntPipe valida que sea un entero |
Ejemplo de solicitud
GET /resenas/1
Response — 200 OK
{
"id": 1,
"clienteId": 3,
"productoId": 1,
"titulo": "El mejor producto que he comprado",
"detalle": "Excelente sabor y presentación.",
"estrellas": 5
}
Response — 400 Bad Request
Se produce cuando el identificador tiene un formato inválido.
Response — 404 Not Found
Reseña no encontrada. Este código está definido en el contrato HTTP del endpoint.
POST /resenas
Crea una nueva reseña.
Request Body
Utiliza CreateResenaDto.
{
"clienteId": 1,
"productoId": 2,
"titulo": "Producto mediocre",
"detalle": "El producto llegó en buenas condiciones, pero esperaba mejor sabor.",
"estrellas": 2
}
Response — 201 Created
{
"id": 10,
"clienteId": 1,
"productoId": 2,
"titulo": "Producto mediocre",
"detalle": "El producto llegó en buenas condiciones, pero esperaba mejor sabor.",
"estrellas": 2
}
Response — 400 Bad Request
Los datos enviados no cumplen las validaciones del DTO.
Response — 409 Conflict
Conflicto por una reseña existente según las reglas de negocio definidas para el servicio. Este código está documentado en Swagger.
PATCH /resenas/{id}
Actualiza parcialmente los datos de una reseña existente.
Path Parameters
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| id | number | Sí | Identificador de la reseña; ParseIntPipe valida que sea un entero |
Request Body
Utiliza UpdateResenaDto. Todos los campos son opcionales. El ID se envía en la ruta, no en el cuerpo.
{
"titulo": "Buen producto, mal proveedor"
}
Response — 200 OK
{
"id": 10,
"clienteId": 1,
"productoId": 2,
"titulo": "Buen producto, mal proveedor",
"detalle": "El producto llegó en buenas condiciones, pero esperaba mejor sabor.",
"estrellas": 2
}
Response — 400 Bad Request
El identificador o los datos enviados no son válidos.
Response — 404 Not Found
Reseña no encontrada. Este código está definido en el contrato HTTP del endpoint.
Response — 409 Conflict
Conflicto según las reglas de negocio definidas para la modificación de reseñas. Este código está documentado en Swagger.
DELETE /resenas/{id}
Elimina una reseña mediante su identificador.
Path Parameters
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| id | number | Sí | Identificador de la reseña; ParseIntPipe valida que sea un entero |
Ejemplo de solicitud
DELETE /resenas/1
Response — 204 No Content
La operación devuelve HTTP 204 sin cuerpo de respuesta.
Response — 400 Bad Request
Se produce cuando el identificador tiene un formato inválido.
Response — 404 Not Found
Reseña no encontrada. Este código está definido en el contrato HTTP del endpoint.