Perfil de Emprendedor - bootcamp-uchile-2026/grupo-2-backend GitHub Wiki
Perfil de Emprendedor
La funcionalidad Perfil de Emprendedor permite que los usuarios de BuenOrigen consulten la información pública de un emprendedor registrado en la plataforma.
Desde la perspectiva Backend, esta funcionalidad consiste en recibir el identificador de un emprendedor, verificar que exista y devolver la información necesaria para construir su perfil público.
La presentación visual del perfil, distribución de contenidos y navegación corresponden a Frontend y Mobile.
Objetivo
Proporcionar a Frontend y Mobile la información pública necesaria para mostrar el perfil de un emprendedor determinado.
Estado
Implementado
La funcionalidad se encuentra implementada mediante:
EmprendedoresModule
|
v
EmprendedoresController
|
v
EmprendedoresService
|
v
EmprendedorDetalleDto
Responsabilidad Backend
Actualmente el Backend debe:
- Recibir el identificador del emprendedor solicitado.
- Transformar el parámetro de ruta a un número.
- Verificar que el emprendedor exista.
- Consultar la información pública asociada.
- Seleccionar únicamente los datos necesarios para construir el perfil público.
- Transformar la información a
EmprendedorDetalleDto. - Informar mediante
404 Not Foundcuando el emprendedor no exista.
Contrato de API
Endpoint
GET /emprendedores/:emprendedorId
Ejemplo:
GET /emprendedores/2
Parámetro de Ruta
emprendedorId
Tipo esperado:
number
DTO de salida
EmprendedorDetalleDto
Página relacionada:
La definición general del endpoint se encuentra centralizada en:
La estructura completa del DTO se encuentra documentada en:
Parámetro emprendedorId
El endpoint recibe el identificador mediante:
@Param('emprendedorId', ParseIntPipe) emprendedorId: number
Aunque el valor recibido desde HTTP corresponde inicialmente a texto, ParseIntPipe intenta transformarlo a un número entero.
Conceptualmente:
HTTP
"2"
|
v
ParseIntPipe
|
v
2
|
v
EmprendedoresController
Validación mediante ParseIntPipe
Si se realiza:
GET /emprendedores/2
el valor:
"2"
se transforma correctamente en:
2
Sin embargo, una solicitud como:
GET /emprendedores/abc
no contiene un identificador entero válido.
En ese caso, ParseIntPipe genera automáticamente:
400 Bad Request
antes de ejecutar la lógica del Service.
Conceptualmente:
emprendedorId
|
v
ParseIntPipe
|
+----+----+
| |
válido inválido
| |
v v
number 400
| Bad Request
v
Service
Búsqueda del Emprendedor
Una vez recibido el identificador válido, EmprendedoresService busca al emprendedor dentro de la información disponible.
Conceptualmente:
const emprendedorEncontrado = this.emprendedores.find(
(emprendedor) => emprendedor.id === emprendedorId,
);
El método:
find()
puede devolver:
Emprendedor
o:
undefined
Por esta razón, el Service debe verificar el resultado.
Emprendedor Existente
Si el emprendedor existe:
find()
|
v
Emprendedor
|
v
Construir DTO
|
v
EmprendedorDetalleDto
El Backend responde:
200 OK
Emprendedor Inexistente
Si:
find()
no encuentra coincidencias, devuelve:
undefined
El Service verifica esta situación mediante:
if (!emprendedorEncontrado) {
throw new NotFoundException('Emprendedor no encontrado');
}
Por lo tanto, el Backend responde:
404 Not Found
Información Pública del Perfil
Actualmente el perfil público se encuentra definido mediante:
EmprendedorDetalleDto
y contiene:
| Campo | Tipo | Descripción |
|---|---|---|
id |
number | Identificador único del emprendedor |
nombre |
string | Nombre público del emprendimiento |
descripcion |
string | Descripción general del emprendimiento |
imagenUrl |
string | Imagen principal o representativa |
historia |
string | Historia o presentación detallada del emprendimiento |
EmprendedorDetalleDto
La estructura actual corresponde a:
export class EmprendedorDetalleDto {
id: number;
nombre: string;
descripcion: string;
imagenUrl: string;
historia: string;
}
Por lo tanto, los campos principales del perfil público ya se encuentran definidos.
Modelo vs DTO
El Service no devuelve directamente el objeto interno Emprendedor.
En cambio, construye:
EmprendedorDetalleDto
Conceptualmente:
Emprendedor
|
| seleccionar datos públicos
v
EmprendedorDetalleDto
|
v
API
Esto permite controlar qué información se expone públicamente.
Transformación al DTO
La lógica utilizada puede representarse como:
const emprendedorDto: EmprendedorDetalleDto = {
id: emprendedorEncontrado.id,
nombre: emprendedorEncontrado.nombre,
descripcion: emprendedorEncontrado.descripcion,
imagenUrl: emprendedorEncontrado.imagenUrl,
historia: emprendedorEncontrado.historia,
};
Posteriormente:
return emprendedorDto;
Flujo de la Operación
GET /emprendedores/2
|
v
ParseIntPipe
|
v
emprendedorId: number
|
v
EmprendedoresController
|
v
EmprendedoresService
|
| find()
v
¿Existe emprendedor?
|
+----+----+
| |
Sí No
| |
v v
Construir NotFoundException
DTO |
| v
v 404 Not Found
EmprendedorDetalleDto
|
v
200 OK
Ejemplo de Solicitud
GET /emprendedores/2
Ejemplo de Respuesta Exitosa
{
"id": 2,
"nombre": "Verde Hogar",
"descripcion": "Emprendimiento enfocado en productos ecológicos para el hogar.",
"imagenUrl": "https://ejemplo.cl/imagenes/emprendedores/verde-hogar.jpg",
"historia": "Verde Hogar surge como una iniciativa familiar orientada a reducir el uso de productos desechables."
}
Respuesta HTTP:
200 OK
Manejo de Errores
Identificador con formato incorrecto
Ejemplo:
GET /emprendedores/abc
Respuesta:
400 Bad Request
Este error es gestionado por:
ParseIntPipe
Emprendedor no existente
Ejemplo:
GET /emprendedores/999
Si no existe un emprendedor con ese identificador:
404 Not Found
Ejemplo conceptual de respuesta:
{
"statusCode": 404,
"message": "Emprendedor no encontrado",
"error": "Not Found"
}
Relación con Productos
Un emprendedor puede tener múltiples productos asociados.
Conceptualmente:
Emprendedor
|
| 1
|
| N
v
Producto
La relación se establece mediante:
emprendedorId: number;
dentro del modelo Producto.
Por ejemplo:
Producto
|
v
emprendedorId = 2
|
v
Emprendedor 2
Productos del Emprendedor
Los productos asociados no forman parte directamente de:
EmprendedorDetalleDto
La consulta se realiza mediante una funcionalidad independiente:
GET /emprendedores/:emprendedorId/productos
Por ejemplo:
GET /emprendedores/2/productos
La respuesta corresponde a:
ProductoResumenDto[]
Ver:
Separación de Responsabilidades
La información pública del emprendedor y sus productos se obtienen mediante endpoints diferentes.
GET /emprendedores/2
|
v
EmprendedorDetalleDto
|
v
Información del emprendimiento
mientras que:
GET /emprendedores/2/productos
|
v
ProductoResumenDto[]
|
v
Productos del emprendimiento
Esto permite mantener contratos independientes y reutilizables.
Relación con el Directorio de Emprendedores
Desde Nuestros Emprendedores, Frontend puede mostrar una lista resumida utilizando:
EmprendedorResumenDto[]
Cuando el usuario selecciona un emprendedor, puede solicitar su perfil completo mediante:
GET /emprendedores/:emprendedorId
Conceptualmente:
Nuestros Emprendedores
|
v
EmprendedorResumenDto[]
|
v
Seleccionar Emprendedor
|
v
GET /emprendedores/:emprendedorId
|
v
EmprendedorDetalleDto
|
v
Perfil de Emprendedor
Perfil Público vs Cuenta del Emprendedor
Esta funcionalidad corresponde exclusivamente al:
Perfil de Emprendedor
es decir:
información pública
No debe confundirse con:
Perfil del Emprendedor
que corresponde a la administración privada de la cuenta.
Conceptualmente:
Perfil de Emprendedor
|
v
Público
Perfil del Emprendedor
|
v
Privado
Consideraciones de Seguridad
El endpoint es utilizado para obtener información pública del emprendimiento.
Por lo tanto, no deberá devolver información como:
contraseña
credenciales
tokens
datos de autenticación
datos bancarios
métodos de pago
información de facturación privada
información administrativa interna
datos privados del propietario
El DTO de salida actúa como parte del contrato que controla la información expuesta.
Documentación Swagger
El endpoint se encuentra documentado mediante decoradores como:
@ApiOperation()
@ApiParam()
@ApiOkResponse()
@ApiNotFoundResponse()
El parámetro se documenta mediante:
@ApiParam({
name: 'emprendedorId',
type: Number,
example: 1,
description: 'Identificador único del emprendedor',
})
La respuesta exitosa utiliza:
EmprendedorDetalleDto
mientras que la inexistencia del recurso se documenta mediante:
404 Not Found
Para mayor información consultar:
Reglas de Negocio Actuales
Actualmente las reglas pueden resumirse como:
1. emprendedorId debe poder convertirse a entero.
2. El emprendedor debe existir.
3. Si no existe:
404 Not Found.
4. Si existe:
transformar a EmprendedorDetalleDto.
5. Entregar únicamente información pública.
Posibles Mejoras Futuras
Los campos principales del perfil ya se encuentran definidos.
Posteriormente podrán evaluarse nuevas propiedades públicas como:
- Ubicación general.
- Región.
- Sitio web.
- Redes sociales.
- Logo.
- Fecha de incorporación.
- Categorías de productos.
- Información de contacto público.
También podrá evaluarse incorporar reglas como:
estadoPublicacion
aprobado
activo
para determinar si un emprendedor puede ser consultado públicamente.
Estas funcionalidades no forman parte de la implementación actual y deberán incorporarse únicamente cuando sean requeridas por las reglas de negocio de BuenOrigen.
Relación con la Arquitectura
La funcionalidad utiliza:
EmprendedoresModule
|
v
EmprendedoresController
|
v
EmprendedoresService
|
v
EmprendedorDetalleDto
Páginas relacionadas: