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 fechaCreacion para 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:

Novedades o Nuevos Productos

La definición general del endpoint se encuentra centralizada en:

Endpoints

La estructura completa del DTO se encuentra documentada en:

DTOs


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:

OpenAPI y Swagger


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: