Nuestros Emprendedores - bootcamp-uchile-2026/grupo-2-backend GitHub Wiki
Nuestros Emprendedores
La funcionalidad Nuestros Emprendedores permite presentar información pública y resumida de los emprendedores disponibles en BuenOrigen.
Esta funcionalidad puede utilizarse tanto para representar una selección de emprendedores en la página de inicio como para obtener el listado general de emprendimientos.
Desde la perspectiva Backend, consiste en consultar los emprendedores disponibles, seleccionar únicamente la información pública necesaria y devolverla mediante EmprendedorResumenDto.
La construcción visual de tarjetas, carruseles o listados corresponde a Frontend y Mobile.
Objetivo
Proporcionar a Frontend y Mobile información pública resumida de los emprendedores disponibles en BuenOrigen.
La operación permite:
- Obtener todos los emprendedores disponibles.
- Limitar opcionalmente la cantidad de resultados.
- Entregar únicamente información pública.
- Utilizar los resultados tanto en la página de inicio como en un directorio de emprendedores.
Estado
Implementado
La funcionalidad se encuentra implementada mediante:
EmprendedoresModule
|
v
EmprendedoresController
|
v
EmprendedoresService
|
v
EmprendedorResumenDto[]
Responsabilidad Backend
Actualmente el Backend debe:
- Consultar los emprendedores disponibles.
- Recibir opcionalmente el Query Parameter
cantidad. - Limitar los resultados cuando
cantidadsea enviado. - Mantener el orden actual de los emprendedores.
- Seleccionar únicamente los campos públicos necesarios.
- Transformar los resultados a
EmprendedorResumenDto. - Devolver una lista de emprendedores.
Contrato de API
Endpoint
GET /emprendedores
Query Parameter
cantidad
El parámetro es:
opcional
Por ejemplo:
GET /emprendedores
devuelve todos los emprendedores disponibles.
Mientras que:
GET /emprendedores?cantidad=4
limita la respuesta a los primeros cuatro emprendedores disponibles.
DTO de salida
EmprendedorResumenDto[]
Página relacionada:
La definición general del endpoint se encuentra centralizada en:
La estructura del DTO se encuentra documentada en:
Funcionamiento sin cantidad
Cuando el cliente realiza:
GET /emprendedores
sin enviar el Query Parameter cantidad, el Backend utiliza todos los emprendedores disponibles.
Conceptualmente:
GET /emprendedores
|
v
¿Existe cantidad?
|
No
|
v
Todos los emprendedores
|
v
EmprendedorResumenDto[]
Funcionamiento con cantidad
Cuando Frontend o Mobile envían:
GET /emprendedores?cantidad=2
el Backend limita la colección utilizando:
slice(0, cantidadNumero)
Conceptualmente:
Emprendedores
|
| cantidad = 2
v
slice(0, 2)
|
v
Primeros 2 emprendedores
Conversión del Query Parameter
Los Query Parameters recibidos mediante HTTP llegan originalmente como texto.
Por ejemplo:
GET /emprendedores?cantidad=4
el valor recibido inicialmente corresponde conceptualmente a:
"4"
Actualmente el Service realiza la conversión mediante:
Number(cantidad)
Conceptualmente:
HTTP
"4"
|
v
Number()
|
v
4
|
v
slice(0, 4)
Implementación Actual de cantidad
La lógica utilizada actualmente corresponde conceptualmente a:
let emprendedoresSeleccionados = this.emprendedores;
if (cantidad !== undefined) {
const cantidadNumero = Number(cantidad);
emprendedoresSeleccionados =
this.emprendedores.slice(0, cantidadNumero);
}
Por lo tanto:
cantidad no enviada
|
v
Todos los emprendedores
cantidad enviada
|
v
Number(cantidad)
|
v
slice(0, cantidadNumero)
Validación Actual de cantidad
Actualmente cantidad se convierte mediante:
Number()
pero no existe todavía una validación específica que compruebe que:
cantidad sea un número entero
cantidad sea mayor que 0
cantidad tenga un máximo permitido
Por ejemplo, actualmente no se utiliza:
ParseIntPipe
en este endpoint.
Esta validación podrá mejorarse posteriormente para mantener un comportamiento más controlado ante valores incorrectos.
Una posible evolución sería:
Query Parameter
|
v
ParseIntPipe
|
v
Validar valor positivo
|
v
Service
Criterio de Selección Actual
Actualmente no existe una regla de negocio adicional para seleccionar emprendedores destacados.
No se utilizan todavía propiedades como:
destacado
habilitado
actividadReciente
cantidadVentas
puntuacion
El comportamiento actual consiste simplemente en utilizar los emprendedores disponibles en la colección.
Conceptualmente:
Emprendedores disponibles
|
v
Limitar por cantidad
si fue solicitada
|
v
EmprendedorResumenDto[]
Orden de los Emprendedores
Actualmente no existe un:
sort()
para esta funcionalidad.
Por lo tanto, los emprendedores mantienen el orden en el que están almacenados actualmente.
Por ejemplo:
1. EcoRaíz
2. Verde Hogar
3. Naturaleza Viva
Si se solicita:
GET /emprendedores?cantidad=2
la respuesta corresponderá a:
1. EcoRaíz
2. Verde Hogar
Información Pública
El modelo Emprendedor contiene actualmente:
id: number;
nombre: string;
descripcion: string;
imagenUrl: string;
historia: string;
Sin embargo, para el listado resumido no es necesario entregar todos estos datos.
La operación utiliza:
EmprendedorResumenDto
que contiene:
export class EmprendedorResumenDto {
id: number;
nombre: string;
descripcion: string;
imagenUrl: string;
}
La propiedad:
historia
no se incluye en esta respuesta resumida.
Modelo vs DTO
Conceptualmente:
Emprendedor
|
| id
| nombre
| descripcion
| imagenUrl
| historia
|
v
Seleccionar información pública resumida
|
v
EmprendedorResumenDto
|
| id
| nombre
| descripcion
| imagenUrl
|
v
Frontend / Mobile
La información detallada del emprendedor se obtiene mediante otra funcionalidad:
Flujo de la Operación
GET /emprendedores?cantidad=4
|
v
EmprendedoresController
|
v
EmprendedoresService
|
v
¿Se recibió cantidad?
|
+---+---+
| |
Sí No
| |
v v
Number() Todos
|
v
slice()
|
+-------+
|
v
map()
|
v
EmprendedorResumenDto[]
|
v
200 OK
Transformación al DTO
Después de seleccionar los emprendedores, el Service transforma cada elemento mediante map().
Conceptualmente:
Emprendedor[]
|
| map()
v
EmprendedorResumenDto[]
Para cada emprendedor se seleccionan:
id
nombre
descripcion
imagenUrl
y se omite:
historia
porque corresponde a información utilizada en el perfil detallado.
Ejemplo de Solicitud sin Límite
GET /emprendedores
Ejemplo de Respuesta
[
{
"id": 1,
"nombre": "EcoRaíz",
"descripcion": "Emprendimiento dedicado a la elaboración de productos sustentables.",
"imagenUrl": "https://ejemplo.cl/imagenes/emprendedores/ecoraiz.jpg"
},
{
"id": 2,
"nombre": "Verde Hogar",
"descripcion": "Emprendimiento enfocado en productos ecológicos para el hogar.",
"imagenUrl": "https://ejemplo.cl/imagenes/emprendedores/verde-hogar.jpg"
},
{
"id": 3,
"nombre": "Naturaleza Viva",
"descripcion": "Emprendimiento dedicado al bienestar y cuidado personal sustentable.",
"imagenUrl": "https://ejemplo.cl/imagenes/emprendedores/naturaleza-viva.jpg"
}
]
Respuesta HTTP:
200 OK
Ejemplo Utilizado por la Página de Inicio
La página de inicio podría solicitar:
GET /emprendedores?cantidad=2
y recibir:
[
{
"id": 1,
"nombre": "EcoRaíz",
"descripcion": "Emprendimiento dedicado a la elaboración de productos sustentables.",
"imagenUrl": "https://ejemplo.cl/imagenes/emprendedores/ecoraiz.jpg"
},
{
"id": 2,
"nombre": "Verde Hogar",
"descripcion": "Emprendimiento enfocado en productos ecológicos para el hogar.",
"imagenUrl": "https://ejemplo.cl/imagenes/emprendedores/verde-hogar.jpg"
}
]
Resultado sin Emprendedores
Si no existen emprendedores disponibles, el Backend devuelve:
[]
con:
200 OK
Esto corresponde a una respuesta válida y no a un error.
Diferencia entre Listado y Perfil
Existen dos operaciones distintas dentro del dominio Emprendedores.
Listado
GET /emprendedores
devuelve:
EmprendedorResumenDto[]
y está pensado para representar múltiples emprendedores.
Perfil
GET /emprendedores/:emprendedorId
devuelve:
EmprendedorDetalleDto
y proporciona información pública más detallada de un emprendedor específico.
Conceptualmente:
GET /emprendedores
|
v
Listado
|
v
EmprendedorResumenDto[]
GET /emprendedores/1
|
v
Perfil público
|
v
EmprendedorDetalleDto
Uso en Distintas Secciones
El mismo endpoint puede ser reutilizado en distintas partes de la aplicación.
Por ejemplo:
Página de Inicio
|
| cantidad limitada
v
GET /emprendedores?cantidad=4
Mientras que un directorio completo podría utilizar:
Directorio de Emprendedores
|
v
GET /emprendedores
Esto evita crear endpoints distintos únicamente porque Frontend presenta los mismos datos en componentes diferentes.
Documentación Swagger
La operación se encuentra documentada mediante decoradores de @nestjs/swagger.
Entre ellos:
@ApiTags()
@ApiOperation()
@ApiQuery()
@ApiOkResponse()
El parámetro:
cantidad
se documenta como opcional.
La respuesta exitosa corresponde a:
EmprendedorResumenDto[]
Para mayor información consultar:
Reglas de Negocio Actuales
Actualmente pueden resumirse como:
1. Obtener emprendedores disponibles.
2. Si existe cantidad:
convertir mediante Number()
limitar mediante slice().
3. Si no existe cantidad:
utilizar todos.
4. Transformar los resultados a
EmprendedorResumenDto[].
Actualmente no se aplican:
filtros por estado
ordenamiento especial
selección de destacados
priorización por ventas
selección aleatoria
Posibles Mejoras Futuras
Posteriormente podrán evaluarse reglas como:
- Validar
cantidadmediante un Pipe. - Exigir que
cantidadsea mayor que cero. - Definir una cantidad máxima.
- Incorporar emprendedores destacados.
- Incorporar estado público o habilitado.
- Ordenar según ventas.
- Ordenar según puntuación.
- Incorporar selección manual.
- Incorporar paginación.
- Incorporar filtros o búsqueda.
Estas mejoras deberán implementarse únicamente cuando sean requeridas por las reglas de negocio de BuenOrigen.
Relación con la Página de Inicio
Página de Inicio
|
v
Nuestros Emprendedores
|
v
GET /emprendedores?cantidad=...
|
v
EmprendedoresController
|
v
EmprendedoresService
|
v
EmprendedorResumenDto[]
|
v
Frontend / Mobile
Relación con la Arquitectura
La funcionalidad pertenece al dominio:
Emprendedores
y utiliza:
EmprendedoresModule
|
v
EmprendedoresController
|
v
EmprendedoresService
|
v
EmprendedorResumenDto[]
Páginas relacionadas: