Estructura del backend
Esta página describe cómo está organizado el backend de Apolo, basado en NestJS y estructurado en múltiples aplicaciones API dentro del monorepo Nx.
APIs disponibles
En la carpeta apps/ encontrar ás los siguientes servicios backend:
apps/
├── bff-api/ # Backend for Frontend (agregación y orquestación)
├── auth-api/ # Autenticación, usuarios y flujos de login
├── applications-api/ # Gestión de aplicaciones / módulos
├── core-api/ # Dominio core de seguridad/auditoría
├── reports-api/ # Reportes y exportaciones
└── tenants-api/ # Gestión multi-tenant
Cada API es una aplicación NestJS independiente, pero comparten contratos, DTOs y lógica de dominio a través de librerías en libs/.
Estructura típica de una API
La estructura de referencia dentro de una API (apps/<service>/src/) sigue el estilo estándar de NestJS adaptado a un enfoque modular:
apps/bff-api/src/
├── main.ts # Punto de entrada de NestJS
├── app.module.ts # Módulo raíz
├── config/ # Configuración (secrets, env, providers)
├── app/
│ ├── auth/ # Módulo de autenticación
│ ├── applications/ # Módulo de aplicaciones
│ ├── reports/ # Módulo de reportes
│ ├── tenants/ # Módulo de tenants
│ └── ... # Otros módulos específicos
└── shared/ # Helpers, interceptors, guards, etc. (si aplica)
⚠️ La estructura exacta puede variar ligeramente por servicio, pero la idea general es:
- Módulos por dominio funcional
- Reutilización de contratos y lógica desde
libs/ - Configuración desacoplada en
config/
Organización por dominio
Cada módulo suele incluir:
- Controller(s): definen los endpoints HTTP (con Swagger).
- Service(s): encapsulan la lógica de negocio y orquestación.
- DTOs / Schemas: importados desde
@apolo-app-platcom-platform/libs(Zod, tipos compartidos, etc.). - Guards / Pipes / Interceptors: para autenticación, validación, logging, etc.
Ejemplo (simplificado) de importación de contratos compartidos:
import { UserCreateDto, EmailPasswordLoginDto, UsersGetDto } from '@apolo-app-platcom-platform/libs';
BFF (Backend for Frontend)
El servicio bff-api actúa como una capa de orquestación:
- Expone una API unificada para el
portal-web. - Agrega datos desde los distintos microservicios (
auth-api,core-api,reports-api, etc.). - Centraliza:
- Autenticación/autorización del frontend.
- Validaciones transversales.
- Enrutamiento hacia servicios internos.
- Exposición del Swagger unificado con todos los endpoints.
Para detalles sobre cómo consumir las APIs y el Swagger, consulta:
Convenciones recomendadas
- Un bounded context por API (auth, applications, tenants, etc.).
- Controladores delgados, delegando lógica a servicios.
- Contracts first: DTOs/schemas definidos en
libsy consumidos por las APIs. - Configuración centralizada a través de Seki y
config/.secretsrc.json. - Uso consistente de Swagger para documentación de endpoints.