Docs

API Overview (nvito-api)

Documentacion tecnica del backend NestJS que expone la API REST de Nvito. Framework: NestJS 11 | ORM: Prisma | Auth: Clerk | Queue: Bull/Redis | Payments: Stripe


1. Estructura de Modulos

La API esta compuesta por 39 modulos de dominio organizados en 9 dominios funcionales, mas 6 modulos de infraestructura (45 modulos totales).

1.1 Dominios y Modulos

DominioModulosDescripcion
Coreauth, organizations, users, roles, admin, packages, healthAutenticacion, multitenancy, RBAC y administracion del sistema
Eventosevents, event-types, event-services, contracts, clientsCiclo de vida de eventos, catalogo de tipos, servicios habilitados, contratos de venta y gestion de clientes
Invitacionesinvitations, sections, templates, html-generationCreacion, edicion visual, plantillas artesanales y compilacion HTML
Invitadosguests, guest-groups, rsvp, tablesGestion de invitados, grupos familiares, confirmaciones y asignacion de mesas
Featureslocations, itinerary, qr-passes, gift-registry, accommodation, background-music, musicFuncionalidades opcionales habilitables por evento
Mediamedia, storage, custom-domainSubida de archivos a R2, galeria, audio guestbook y dominios personalizados
IAai-generationGeneracion y modificacion de invitaciones con IA (OpenAI/Anthropic)
Comunicacionesnotifications, notification-channels, communications, queue, schedulerEnvio de emails/WhatsApp/push, colas Bull y tareas programadas
PagospaymentsIntegracion 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

ModuloFuncion
PrismaModuleConexion 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
ConfigModuleConfiguracion centralizada con validacion Zod
WinstonModuleLogging con rotacion 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 autenticacion.

Health

Health

/v1
Public

Auth

Auth — Webhooks

/v1
Public

Auth — Validacion 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 — Asignacion y Gestion

/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
Clerk

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
Clerk

Guests

Guests

/v1
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 Comunicacion

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Workflows de Comunicacion

/v1
Clerk
Clerk
Clerk
Clerk
Clerk
Clerk

Gestion 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

Autenticacion Movil

Autenticacion Movil

/v1
Public
Public
Public
Mobile JWT
Mobile JWT
Mobile JWT

Codigos 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. Configuracion 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: {
      enableImplicitConversion: true,  // Convierte tipos automaticamente
    },
  }),
);

3.2 GlobalExceptionFilter

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

3.3 AuditInterceptor

Interceptor global que registra automaticamente acciones criticas de modificacion:

  • 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-produccion:

URL: /api/docs

Incluye documentacion interactiva con esquemas de request/response, autenticacion Bearer y tags por modulo.

3.6 Seguridad adicional en main.ts

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

3.7 Global Guards (orden de ejecucion)

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

4. Patron de un Modulo

Todos los modulos siguen el mismo patron 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         # Logica de negocio principal (facade)
  services/                 # Sub-servicios con responsabilidad unica (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     # Validacion de entrada con class-validator
    update-event.dto.ts     # DTO parcial (PartialType)
    query-events.dto.ts     # Parametros de paginacion y filtros

4.1.1 Patron Sub-Services (SRP)

Los modulos complejos extraen logica 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 generacion de reportes
invitationsinvitation-lifecycle, invitation-section, version-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 generacion 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-statsAsignacion 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 administracion
html-generationtemplate-compiler, schema-compiler, template-builder, html-optimizer, artisan-template-registryPipeline de compilacion HTML
qr-passesqr-generation, qr-check-inGeneracion y validacion 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 modulos, 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 modulos
})
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 Configuracion

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 publicos)
  • Storage: Redis (compatible con multiples 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. Validacion y Serializacion

6.1 class-validator (Validacion de entrada)

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

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

6.2 class-transformer (Serializacion)

Se usa class-transformer para transformar payloads entrantes:

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

6.3 Zod (Validacion 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'),
  // ... mas variables
});

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

6.4 Convenciones de nomenclatura de DTOs

PatronUsoEjemplo
Create{Entity}DtoCreacion de recursoCreateEventDto
Update{Entity}DtoActualizacion parcial (PartialType)UpdateEventDto
Query{Entity}DtoParametros de lista/busqueda/paginacionQueryEventsDto
{Action}{Entity}DtoAcciones especificasAssignGuestDto, 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 publicos sin logica testeable
Cobertura guards11/11 (100%)

Metricas de nvito-admin (Frontend)

Para referencia cruzada, las metricas del panel de administracion:

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?