Docs

API Overview

Documentación técnica del backend NestJS que expone la API REST de Nvito, incluyendo módulos, endpoints, configuración global y patrones.

PublicadoMarzo 2026Equipo de desarrollo, arquitectos, stakeholders

1. Estructura de Modulos

La API está compuestá por 39 módulos de dominio organizados en 9 dominios funcionales, más 6 módulos de infraestructura (45 módulos totales).

1.1 Dominios y Modulos

DominioModulosDescripción
Coreauth, organizations, users, roles, admin, packages, healthAutenticación, multitenancy, RBAC y administración del sistema
Eventosevents, event-types, event-services, contracts, clientsCiclo de vida de eventos, catálogo de tipos, servicios habilitados, contratos de venta y gestión de clientes
Invitacionesinvitations, sections, templates, html-generationCreación, edicion visual, plantillas artesanales y compilacion HTML
Invitadosguests, guest-groups, rsvp, tablesGestión de invitados, grupos familiares, confirmaciones y asignación de mesas
Featureslocations, itinerary, qr-passes, gift-registry, accommodation, background-music, musicFuncionalidades opcionales habilitables por evento
Mediamedia, storage, custom-domainSubida de archivos a R2, galería, audio guestbook y dominios personalizados
IAai-generationGeneración y modificación de invitaciones con IA (OpenAI/Anthropic)
Comunicacionesnotifications, notification-channels, communications, queue, schedulerEnvio de emails/WhatsApp/push, colas Bull y tareas programadas
PagospaymentsIntegración con Stripe: links de pago, webhooks, historial
Movilmobile, mobile-authEndpoints dedicados para app movil, auth independiente de Clerk
AnaliticaanalyticsTracking de vistas, RSVP analytics y metricas por evento

1.2 Modulos de Infraestructura

ModuloFunción
PrismaModuleConexión a PostgreSQL con soporte multi-tenant
CommonModuleServicios compartidos: EncryptionService, CacheService, OrganizationResolverService, RedisThrottlerStorage
ActivityLogModuleSistema de auditoria global (tabla audit_log)
PermissionsModuleSistema RBAC con permisos granulares
MetricsModuleMetricas de rendimiento y uso del sistema
ConfigModuleConfiguración centralizada con validación Zod
WinstonModuleLogging con rotación diaria de archivos
ThrottlerModuleRate limiting respaldado por Redis

1.3 Diagrama de Modulos


2. Tabla de Endpoints

Todos los endpoints tienen el prefijo global /v1. Las rutas marcadas con "Public" no requieren autenticación.

Health

Health

/v1
Public

Auth

Auth — Webhooks

/v1
Public

Auth — Validación de Invitaciones

/v1
Public

Organizations

Organizations — Admin Panel

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Organizations — Tenant

/v1
Clerk
Clerk
Clerk

Users

Users

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Roles

Roles — Asignación y Gestión

/v1
Clerk
Clerk
Clerk
Clerk

Roles — Colaboradores de Evento

/v1
Clerk
Clerk
Clerk

Roles — Invitaciones de Colaborador

/v1
Clerk
Clerk
Clerk
Clerk

Admin

Admin — System Health

/v1
Clerk
Clerk
Clerk

Admin — Usuarios

/v1
Clerk
Clerk
Clerk
Clerk

Admin — Invitaciones (Pre-registros)

/v1
Clerk
Clerk
Clerk
Clerk
Clerk

Admin — Roles y Estadisticas

/v1
Clerk
Clerk
Clerk

Packages

Packages — Paquetes de Servicios

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Eventos

Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Public
Public
Clerk
Clerk

Tipos de Evento

Clerk
Clerk
Clerk

Servicios de Evento

Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Public
Public

Contratos

Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Metricas de Ventas

Clerk
Clerk
Clerk
Clerk

Clientes

Clerk
Clerk
Clerk
Clerk
Clerk

Invitaciones

Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Public
Public
Public
Public
Public

Public
Public
Public

Clerk
Public
Clerk
Clerk
Clerk
Clerk

Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Clerk
Clerk
Clerk
Clerk

Clerk
Clerk
Clerk

Clerk
Clerk
Clerk
Clerk

Templates

Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Guests

Guests

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Guest Groups

Guest Groups

/v1
Clerk
Clerk
Clerk
Clerk
Clerk

RSVP

RSVP

/v1
Public
Clerk
Clerk

Tables

Tables

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Locations

Locations

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Itinerary

Itinerary

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

QR Passes

QR Passes

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Gift Registry

Gift Registry

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Accommodation

Accommodation

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Background Music

Background Music

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Music

Music

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Media

Media

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Custom Domain

Custom Domain

/v1
Clerk
Clerk
Clerk
Clerk
Clerk

AI Generation

AI Generation

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Notificaciones

Notificaciones

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Comunicaciones

Comunicaciones

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Comunicaciones - Webhooks

/v1
Public
Public

Plantillas de Comunicación

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Workflows de Comunicación

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Gestión de Colas

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Pagos

Pagos - Admin

/v1
Clerk
Clerk
Clerk
Clerk
Clerk

Pagos - Mobile (Cash Fund)

/v1
Public
Public

Pagos - Publico

/v1
Public
Public
Public

Pagos - Webhooks

/v1
Public

Autenticación Movil

Autenticación Movil

/v1
Public
Public
Public
Mobile JWT
Mobile JWT
Mobile JWT

Códigos de Acceso de Eventos

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Mobile

Mobile - Eventos

/v1
Mobile JWT
Mobile JWT
Mobile JWT
Mobile JWT
Mobile JWT
Mobile JWT
Mobile JWT
Mobile JWT

Mobile - Check-in

/v1
Mobile JWT
Mobile JWT
Mobile JWT
Mobile JWT

Mobile - Invitados

/v1
Mobile JWT
Mobile JWT
Mobile JWT
Mobile JWT
Mobile JWT

Mobile - Media

/v1
Mobile JWT
Mobile JWT
Mobile JWT
Mobile JWT
Mobile JWT
Mobile JWT
Mobile JWT
Mobile JWT
Mobile JWT
Mobile JWT
Mobile JWT

Mobile - Sharing

/v1
Mobile JWT
Mobile JWT
Mobile JWT

Mobile - Mesas

/v1
Mobile JWT
Mobile JWT

Analiticas

Analiticas

/v1
Public
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

3. Configuración Global

3.1 ValidationPipe

Configurado globalmente en main.ts para validar todos los DTOs entrantes:

app.useGlobalPipes(
  new ValidationPipe({
    whitelist: true,              // Elimina propiedades no declaradas en el DTO
    forbidNonWhitelisted: true,   // Rechaza requests con propiedades no declaradas
    transform: true,              // Transforma payloads al tipo del DTO
    transformOptions: {
      enableImplicitConversión: true,  // Convierte tipos automáticamente
    },
  }),
);

3.2 GlobalExceptionFilter

Filtro de excepciones que sanitiza errores en producción para evitar exponer detalles internos del sistema al cliente.

3.3 AuditInterceptor

Interceptor global que registra automáticamente acciones criticas de modificación:

  • Metodos auditados: POST, PATCH, PUT, DELETE (no GET)
  • Paths criticos: /users, /events, /guests, /invitations, /organizations, /templates, /rsvp, /locations, /itinerary, /tables
  • Solo audita: Requests autenticados (con usuario)
  • No bloquea: La auditoria es asincrona, no afecta el tiempo de respuesta
  • Registra: userId, organizationId, action (create/update/delete), resource, resourceId, IP, userAgent, metadata (path, method, body sanitizado)
  • Para Super Admin: Resuelve organizationId desde el recurso o evento padre via consulta a BD

3.4 Prefijo de API

Prefijo global: /v1
Ejemplo: http://localhost:3000/v1/events

3.5 Swagger

Disponible solo en entornos no-producción:

URL: /api/docs

Incluye documentación interactiva con esquemas de request/response, autenticación Bearer y tags por modulo.

3.6 Seguridad adicional en main.ts

MiddlewareFunción
HelmetHeaders de seguridad (CSP, HSTS, X-Frame-Options, noSniff)
CORSOrigen validado contra whitelist; wildcard prohibido en producción
Compresion gzipComprime responses > 1KB (reduce bandwidth 70-90%)
Body limitsMáximo 20MB para JSON y URL-encoded (para uploads)
Headers adicionalesX-Permitted-Cross-Domain-Policies, Referrer-Policy, Permissions-Policy

3.7 Global Guards (orden de ejecución)

  1. ClerkAuthGuard - Autenticación JWT (valida token de Clerk, resuelve usuario en BD)
  2. UserThrottlerGuard - Rate limiting (100 req/min por usuario o IP)
  3. RoleGuard - Autorización basada en roles RBAC

4. Patron de un Modulo

Todos los módulos siguen el mismo patrón estandar de NestJS:

4.1 Estructura de archivos

src/modules/events/
  events.module.ts          # Registra controller, services e imports
  events.controller.ts      # Recibe HTTP, valida DTO, delega al service
  events.service.ts         # Lógica de negocio principal (facade)
  services/                 # Sub-servicios con responsabilidad única (SRP)
    event-query.service.ts      # Consultas de lectura
    event-mutation.service.ts   # Operaciones de escritura
    event-capacity.service.ts   # Calculo de capacidad
    event-admin-query.service.ts # Consultas admin
  dto/
    create-event.dto.ts     # Validación de entrada con class-validator
    update-event.dto.ts     # DTO parcial (PartialType)
    query-events.dto.ts     # Parametros de páginación y filtros

4.1.1 Patron Sub-Services (SRP)

Los módulos complejos extraen lógica en sub-servicios dentro de un directorio services/. El servicio principal actua como facade, delegando a sub-servicios especializados:

ModuloSub-serviciosResponsabilidad
eventsevent-query, event-mutation, event-capacity, event-admin-querySeparacion lectura/escritura/admin
organizationsorganization-adminMetodos Super Admin separados del tenant
analyticsevent-analytics, invitation-analytics, report-data, pdf-builderAnaliticas por dominio y generación de reportes
invitationsinvitation-lifecycle, invitation-section, versión-manager, approval-workflow, preview-token, png-exportCiclo de vida, secciones, versiones, aprobacion
ai-generationprompt-builder, schema-section-builder, vision-provider, design-extraction, ai-modification, generation-cost, enrich-prompt, ai-provider-orchestrator, invitation-schema-builderPipeline de generación IA
communicationscampaign-query, invitation-dispatcher, message-dispatcher, recipient-filter, reminder-message-dispatcher, recipient-estimator, spam-prevention, smart-routing, message-preview, communication-templateEnvio por tipo, filtrado, templates, preview, spam prevention y routing
paymentspayment-link, stripe-webhookLinks de pago y webhooks Stripe
tablestable-assignment, table-statsAsignación y estadisticas
mobilemobile-events, mobile-guests, mobile-check-in, mobile-media, mobile-sharing, card-generatorEndpoints movil por dominio
adminadmin-statistics, admin-user, admin-invitationPanel de administración
html-generationtemplate-compiler, schema-compiler, template-builder, html-optimizer, artisan-template-registryPipeline de compilacion HTML
qr-passesqr-generation, qr-check-inGeneración y validación QR
guestsguest-statsEstadisticas de invitados
contractscontract-analyticsAnaliticas de contratos
mediamedia-analyticsAnaliticas de media
event-servicesevent-service-toggleToggle de servicios

Total: 61 sub-servicios distribuidos en 17 módulos, lo que mantiene cada archivo enfocado en una sola responsabilidad.

4.2 Module

@Module({
  imports: [PrismaModule, CommonModule],
  controllers: [EventsController],
  providers: [EventsService],
  exports: [EventsService],  // Exporta el service para uso en otros módulos
})
export class EventsModule {}

4.3 Controller

@ApiTags('events')
@ApiBearerAuth()
@Controller('events')
@UseGuards(ClerkAuthGuard)
export class EventsController {
  constructor(private readonly eventsService: EventsService) {}

  @Post()
  @UseGuards(PermissionsGuard)
  @RequirePermission(PERMISSIONS.EVENTS_CREATE_ORG)
  async create(
    @CurrentUser() user: AuthenticatedUser,
    @Body() createEventDto: CreateEventDto,
  ) {
    return this.eventsService.create(organizationId, user.userId, createEventDto);
  }
}

4.4 Service

@Injectable()
export class EventsService {
  constructor(private readonly prisma: PrismaService) {}

  async create(orgId: string, userId: string, dto: CreateEventDto) {
    return this.prisma.event.create({
      data: {
        ...dto,
        organizationId: orgId,
        createdBy: userId,
      },
    });
  }
}

4.5 DTO

export class CreateEventDto {
  @IsString()
  @IsNotEmpty()
  @MaxLength(200)
  name: string;

  @IsUUID()
  eventTypeId: string;

  @IsDateString()
  date: string;

  @IsOptional()
  @IsString()
  @MaxLength(2000)
  description?: string;
}

5. Rate Limiting

5.1 Configuración

ThrottlerModule.forRootAsync({
  imports: [CommonModule],
  useFactory: (redisStorage: RedisThrottlerStorage) => ({
    throttlers: [{ ttl: 60000, limit: 100 }],  // 100 requests por minuto
    storage: redisStorage,                       // Respaldado por Redis
  }),
  inject: [RedisThrottlerStorage],
}),

5.2 UserThrottlerGuard

  • Limite global: 100 peticiones por minuto
  • Tracking: Por usuario autenticado (userId) o por IP (para endpoints públicos)
  • Storage: Redis (compatible con múltiples instancias del servidor)
  • Excepciones: El endpoint /health usa @SkipThrottle() para bypasear el limite
  • Override por endpoint: El webhook de Clerk tiene limite personalizado de 50 req/min via @Throttle({ default: { limit: 50, ttl: 60000 } })

6. Validación y Serializacion

6.1 class-validator (Validación de entrada)

Todos los DTOs utilizan decoradores de class-validator para validar datos de entrada:

  • @IsString(), @IsNumber(), @IsUUID(), @IsEmail() - Validación de tipos
  • @IsNotEmpty(), @IsOptional() - Campos requeridos vs opcionales
  • @MaxLength(), @MinLength(), @Min(), @Max() - Limites de longitud/valor
  • @IsDateString(), @IsEnum() - Formatos específicos
  • @ValidateNested() con @Type() - Objetos anidados

6.2 class-transformer (Serializacion)

Se usa class-transformer para transformar payloads entrantes:

  • enableImplicitConversión: true convierte strings a números, booleanos, etc.
  • @Type(() => Number) para transformar tipos en objetos anidados
  • @Exclude() para omitir campos sensibles en respuestas

6.3 Zod (Validación de entorno)

Las variables de entorno se validan al arranque con un schema Zod en config/env.validation.ts:

const envSchema = z.object({
  DATABASE_URL: z.string().min(1, 'DATABASE_URL es requerida'),
  NODE_ENV: z.enum(['development', 'staging', 'production', 'test']).default('development'),
  PORT: z.coerce.number().int().positive().default(3000),
  CLERK_SECRET_KEY: z.string().min(1),
  CLERK_PUBLISHABLE_KEY: z.string().min(1),
  REDIS_URL: z.string().default('redis://localhost:6379'),
  // ... más variables
});

Si alguna variable requerida falta o es invalida, la aplicación no arranca y muestra un mensaje claro del error.

6.4 Convenciones de nomenclatura de DTOs

PatronUsoEjemplo
Create{Entity}DtoCreación de recursoCreateEventDto
Update{Entity}DtoActualización parcial (PartialType)UpdateEventDto
Query{Entity}DtoParametros de lista/búsqueda/páginaciónQueryEventsDto
{Action}{Entity}DtoAcciones específicasAssignGuestDto, ToggleServiceDto
{Entity}ResponseDtoFormato de respuestaGenerationResultDto

Metricas del Proyecto

MetricaCantidad
Modulos totales45 (39 de dominio + 6 de infraestructura)
Controladores49
Servicios136 (75 principales + 61 sub-servicios)
Endpoints HTTP369
DTOs100
Guards11
Interceptors3
Processors (Bull)3 (email, whatsapp, push)
Filtros1 (GlobalExceptionFilter)
Modelos Prisma51
Enums Prisma36
Tests207 suites / 3311+ tests (100% green)
Cobertura servicios116/116 (100%)
Cobertura controllers48/48 (100%) -- excluye 2 controllers públicos sin lógica testeable
Cobertura guards11/11 (100%)

Metricas de nvito-admin (Frontend)

Para referencia cruzada, las metricas del panel de administración:

MetricaCantidad
Test suites133
Tests individuales1,347 (100% green)
Framework de testsVitest 4.x + Testing Library
Server Actions16 archivos (todos con Zod validation)
API Services33 archivos con tests
React Query Hooks35+ archivos con tests
Esquemas Zod15 (todos con tests)
Componentes UI (shadcn)41+
React CompilerHabilitado
CSP HeadersConfigurados
Accesibilidadaria-sort, aria-label, keyboard nav

Archivos clave referenciados

ArchivoRuta
App Modulenvito-api/src/app.module.ts
Bootstrapnvito-api/src/main.ts
Audit Interceptornvito-api/src/common/interceptors/audit.interceptor.ts
Env Validationnvito-api/src/config/env.validation.ts
Throttler Guardnvito-api/src/common/throttler/user-throttler.guard.ts
Redis Storagenvito-api/src/common/throttler/redis-throttler.storage.ts
Global Exception Filternvito-api/src/common/filters/global-exception.filter.ts
Esta pagina fue util?