Novedades o Nuevos Productos - bootcamp-uchile-2026/grupo-2-backend GitHub Wiki
Novedades o Nuevos Productos
La funcionalidad Novedades o Nuevos Productos permite mostrar en la página de inicio productos incorporados recientemente al catálogo de BuenOrigen.
Desde la perspectiva Backend, esta funcionalidad consiste en ordenar los productos disponibles según su fecha de creación y devolver primero aquellos que fueron incorporados más recientemente.
Objetivo
Proporcionar a Frontend y Mobile información sobre los productos incorporados recientemente al catálogo de BuenOrigen.
Estado
Implementado
La funcionalidad se encuentra implementada mediante:
ProductosModule
|
v
ProductosController
|
v
ProductosService
|
v
ProductoResumenNuevosDto[]
Responsabilidad Backend
Actualmente el Backend debe:
- Consultar los productos disponibles en el catálogo.
- Utilizar la propiedad
fechaCreacionpara determinar su antigüedad. - Ordenar los productos desde el más reciente al más antiguo.
- Transformar cada producto al DTO correspondiente.
- Entregar la información necesaria para representar cada producto.
- Retornar una lista vacía cuando no existan productos.
Contrato de API
Endpoint
GET /productos/nuevos
Datos de entrada
Actualmente la operación no requiere:
Body
Parámetros de ruta
Query Parameters
DTO de salida
ProductoResumenNuevosDto[]
Página relacionada:
La definición general del endpoint se encuentra centralizada en:
La estructura completa del DTO se encuentra documentada en:
Criterio Actual para Determinar los Productos Nuevos
Actualmente cada producto posee:
fechaCreacion: Date;
Esta propiedad representa la fecha en que el producto fue incorporado al catálogo.
La funcionalidad utiliza este dato para ordenar los productos.
Conceptualmente:
Producto
|
v
fechaCreacion
|
v
Ordenar de más reciente
a más antiguo
Ordenamiento
Los productos se ordenan de manera descendente según:
fechaCreacion
Por ejemplo:
Producto A → 10-08-2026
Producto B → 25-08-2026
Producto C → 18-08-2026
Después del ordenamiento:
1. Producto B → 25-08-2026
2. Producto C → 18-08-2026
3. Producto A → 10-08-2026
Por lo tanto, los productos creados más recientemente aparecen primero.
Significado de "Nuevo" en la Implementación Actual
Actualmente no existe un período máximo durante el cual un producto sea considerado nuevo.
Por ejemplo, todavía no existe una regla como:
Producto creado durante los últimos 30 días
Tampoco existe actualmente una propiedad como:
esNuevo: boolean;
El comportamiento actual consiste simplemente en:
Todos los productos
|
v
Ordenar por fechaCreacion DESC
|
v
Productos más recientes primero
Por lo tanto, el endpoint representa principalmente un listado de productos ordenados por novedad.
Flujo de la Operación
Conceptualmente:
GET /productos/nuevos
|
v
ProductosController
|
v
ProductosService
|
| sort()
v
Ordenar por fechaCreacion
|
| DESC
v
Más recientes primero
|
| map()
v
ProductoResumenNuevosDto[]
|
v
200 OK
Procesamiento en ProductosService
La lógica principal consiste conceptualmente en:
this.productos
|
| ordenar
v
productosOrdenados
|
| transformar
v
ProductoResumenNuevosDto[]
La comparación entre fechas permite colocar primero aquellos productos cuya fechaCreacion sea más reciente.
DTO de Salida
La operación utiliza:
ProductoResumenNuevosDto
con la siguiente estructura:
export class ProductoResumenNuevosDto {
id: number;
nombre: string;
precio: number;
precioOferta: number | null;
imagenUrl: string;
}
El endpoint devuelve una lista:
ProductoResumenNuevosDto[]
Precio de Oferta
El DTO incluye:
precioOferta: number | null;
Esto permite que un producto nuevo pueda encontrarse:
sin oferta
o:
con oferta
Por ejemplo:
{
"id": 103,
"nombre": "Bolsa Reutilizable de Algodón",
"precio": 5990,
"precioOferta": null,
"imagenUrl": "https://ejemplo.cl/imagenes/bolsa-algodon.jpg"
}
También puede existir:
{
"id": 104,
"nombre": "Botella Reutilizable",
"precio": 8990,
"precioOferta": 6990,
"imagenUrl": "https://ejemplo.cl/imagenes/botella.jpg"
}
Por lo tanto:
ser nuevo
y:
estar en oferta
son características independientes.
Modelo vs DTO
El modelo Producto posee información adicional como:
id
subcategoriaId
emprendedorId
marca
nombre
descripcion
precio
precioOferta
imagenUrl
imagenes
stock
puntuacion
ventasUltimoMes
fechaCreacion
colores
tallas
Sin embargo, esta funcionalidad solo necesita devolver:
id
nombre
precio
precioOferta
imagenUrl
Conceptualmente:
Producto
|
| seleccionar información
v
ProductoResumenNuevosDto
|
v
Frontend / Mobile
La propiedad:
fechaCreacion
se utiliza internamente para determinar el orden, pero no necesita formar parte del DTO de respuesta.
Ejemplo de Solicitud
GET /productos/nuevos
Ejemplo de Respuesta
[
{
"id": 103,
"nombre": "Bolsa Reutilizable de Algodón",
"precio": 5990,
"precioOferta": null,
"imagenUrl": "https://ejemplo.cl/imagenes/bolsa-algodon.jpg"
},
{
"id": 102,
"nombre": "Shampoo Sólido Natural",
"precio": 7990,
"precioOferta": 6490,
"imagenUrl": "https://ejemplo.cl/imagenes/shampoo-solido.jpg"
}
]
Respuesta HTTP:
200 OK
Resultado sin Productos
Si el catálogo no contiene productos, el Backend devuelve:
[]
con:
200 OK
Esto corresponde a una respuesta válida y no a un error.
Respuestas HTTP
| Código | Situación |
|---|---|
200 OK |
Los productos fueron obtenidos correctamente |
200 OK con [] |
No existen productos en el catálogo |
Regla de Negocio Actual
La regla actual puede resumirse como:
Productos
|
v
Ordenar por fechaCreacion DESC
|
v
ProductoResumenNuevosDto[]
Por lo tanto:
Más nuevo = mayor fechaCreacion
Diferencia entre Criterio y DTO
La propiedad utilizada para determinar la novedad:
fechaCreacion
no necesariamente debe aparecer en la respuesta.
Esto ocurre porque cumple una función interna:
fechaCreacion
|
v
Criterio de ordenamiento
mientras que:
ProductoResumenNuevosDto
define únicamente los datos que necesita Frontend o Mobile.
Posibles Mejoras Futuras
Posteriormente podrá definirse una regla más específica para determinar cuándo un producto debe considerarse nuevo.
Por ejemplo:
Producto creado durante los últimos 30 días
o:
Mostrar únicamente los últimos 10 productos agregados
También podrían incorporarse:
- Query Parameter
cantidad. - Límite máximo de resultados.
- Paginación.
- Estado de publicación.
- Filtro por stock disponible.
- Filtro por categoría.
- Filtro por subcategoría.
Estas reglas deberán incorporarse únicamente cuando sean requeridas por las necesidades funcionales de BuenOrigen.
Documentación Swagger
El endpoint se encuentra documentado mediante decoradores de @nestjs/swagger.
La respuesta exitosa corresponde a:
ProductoResumenNuevosDto[]
Conceptualmente:
@ApiOperation()
|
v
Descripción del endpoint
@ApiOkResponse()
|
v
200 OK
|
v
ProductoResumenNuevosDto[]
Para mayor información consultar:
Relación con la Página de Inicio
Página de Inicio
|
v
Novedades o Nuevos Productos
|
v
GET /productos/nuevos
|
v
ProductosController
|
v
ProductosService
|
v
ProductoResumenNuevosDto[]
|
v
Frontend / Mobile
Relación con la Arquitectura
La funcionalidad pertenece al dominio:
Productos
y utiliza:
ProductosModule
|
v
ProductosController
|
v
ProductosService
|
v
ProductoResumenNuevosDto[]
Páginas relacionadas: