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 Found cuando 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:

Perfil de Emprendedor

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

Endpoints

La estructura completa del DTO se encuentra documentada en:

DTOs


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:

Productos del Emprendedor


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:

OpenAPI y Swagger


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: