Saltar al contenido principal

Servicios

Esta página cubre las integraciones con servicios externos del backend — los proveedores de terceros y workers en segundo plano que envuelve apps/backend/services/, entre los managers y el mundo exterior. Para las piezas de plataforma compartidas debajo de esto (Redis, límite de tasa, logging, variables de entorno), consulta Infraestructura.

Almacenamiento — AWS S3

Todos los archivos generados por los usuarios (imágenes, videos, audio, documentos) se almacenan en AWS S3 mediante services/s3.service.js (AWS SDK v3).

Convenciones de carpetas

{folder}/user-{userId}/{subfolder}/item_{random}.{ext}
CarpetaContenido
images/Imágenes de mensajes de chat
profiles/Fotos de perfil
posts/Imágenes de publicaciones
videos/Archivos de video
thumbnails/Miniaturas de video
articles/Imágenes de artículos

Operaciones clave

  • Carga por stream — directamente desde un escalar Upload de GraphQL
  • Carga por buffer — para imágenes ya procesadas
  • URLs firmadas — para acceso privado/temporal a archivos
  • Verificación de existencia de archivo
  • Eliminación

Establece DISABLE_S3=true para usar respuestas simuladas en el desarrollo local.


Correo — AWS SES

Los correos transaccionales se envían mediante services/email.service.js usando AWS SES.

Plantillas integradas

MétodoCuándo se envía
sendVerificationCodeVerificación de dirección de correo
sendPasswordResetEnlace de restablecimiento de contraseña
sendWelcomeEmailCuenta nueva creada

Plantillas personalizadas

Las plantillas Pug en email-templates/ se admiten mediante sendTemplateEmail. Todos los correos también pueden enviarse como HTML puro mediante sendEmail.

Variables de entorno: AWS_REGION, AWS_ACCESS_KEY, AWS_SECRET_KEY, AWS_EMAIL, AWS_EMAIL_NAME.


SMS — Multiproveedor

La autenticación por SMS y los códigos OTP se envían mediante services/sms/sms.service.js, que usa un patrón adaptador para que el proveedor pueda cambiarse sin modificar código.

Proveedores admitidos

ProveedorDescripción
Twilio (predeterminado)SMS estándar + Twilio Verify API para OTP
AWS SNSSMS transaccional mediante AWS
MessageBirdProveedor de SMS europeo

Cambia en tiempo de ejecución estableciendo SMS_PROVIDER=twilio|aws-sns|messagebird. Longitud del código: 6 dígitos, ventana de expiración: configurable mediante VERIFIED_SMS_TIME_WAIT (5 minutos por defecto).


Procesamiento de imágenes — Sharp

services/image-processing.service.js envuelve Sharp para la manipulación de imágenes en el servidor:

  • Redimensionar con opciones de fit y position
  • Convertir HEIC/HEIF → JPEG (fotos de iOS)
  • Comprimir con calidad configurable (90% por defecto)
  • Conversión de Stream a Buffer

Procesamiento de video — ffmpeg

services/video-processing.service.js gestiona las miniaturas de video:

  • Extrae la miniatura en un momento configurable (00:00:02 por defecto)
  • Tamaño de salida configurable (600x? por defecto — altura proporcional)
  • Carga automática de la miniatura a S3

Notificaciones push

FCM (Android / Web)

services/firebase.service.js envía notificaciones push mediante Firebase Cloud Messaging. El worker de notificaciones procesa los trabajos de la cola de BullMQ.

APNs (iOS)

services/apns.service.js envía Apple Push Notifications para las alertas estándar de iOS.

Push de VoIP (llamadas de iOS)

services/voip-push.service.js entrega notificaciones push de VoIP de alta prioridad mediante PushKit de Apple para que las llamadas entrantes despierten la app de iOS de inmediato.

Worker de notificaciones

workers/notification.worker.js se ejecuta como un worker de BullMQ que consume de la cola de Redis push-notifications:

  • Concurrencia: 10 trabajos en paralelo
  • Límite de tasa: 100 trabajos/segundo
  • Cola: respaldada por Redis, sobrevive a los reinicios
  • Los trabajos se procesan en segundo plano — los resolvers los encolan y responden al instante

Analítica

services/analytics/analytics.service.js usa un patrón adaptador para desacoplar el seguimiento de eventos del backend de almacenamiento.

Adaptadores

AdaptadorCaso de uso
PostgreSQLDesarrollo / tráfico bajo
BigQueryProducción / alta escala (particionado por fecha)

Cambia mediante ANALYTICS_DB_TYPE=postgres|bigquery.

Eventos rastreados

TablaEventos
user_eventsCualquier acción del usuario (publicación creada, comentario publicado, etc.)
post_eventsVistas, likes y compartidos de publicaciones
admin_actionsTodas las mutations de administración con IP y metadatos
content_reportsEnvíos de reportes
engagement_metricsContadores de interacción agregados

Retención de datos: configurable por tabla (cleanOldData(table, days)). Los fallos de analítica no son fatales — los errores se capturan y registran para que nunca interrumpan la solicitud principal.


Integración con LiveKit

Dos servicios gestionan la infraestructura de transmisión en vivo:

  • services/livekit.service.js — crea salas, genera tokens de acceso (JWT), gestiona participantes
  • services/livekit-monitor.service.js — monitorea la salud de las salas y el conteo de participantes activos

Indicadores de escritura

services/typing-indicator.service.js publica los cambios de estado de escritura a la suscripción de GraphQL typingIndicator. Los indicadores expiran automáticamente tras un breve tiempo de espera si el usuario deja de escribir sin enviar un evento setTypingStatus(false).


Política de contraseñas

services/password-policy.service.js aplica las reglas de contraseña de la plataforma:

  • Mínimo 8 caracteres
  • Debe contener mayúscula, minúscula, dígito y carácter especial
  • Prevención de reutilización (últimas N contraseñas)

Resumen de variables de entorno

VariableServicio
AWS_REGION / ACCESS_KEY / SECRET_KEYS3, SES, SNS
AWS_BUCKET_NAMES3
AWS_EMAIL / AWS_EMAIL_NAMESES
SMS_PROVIDERSMS (twilio / aws-sns / messagebird)
TWILIO_ACCOUNT_SID / AUTH_TOKEN / PHONE_NUMBERTwilio
ANALYTICS_DB_TYPEAdaptador de analítica
GCP_PROJECT_ID / BIGQUERY_DATASET_IDAnalítica de BigQuery
LIVEKIT_URL / API_KEY / API_SECRETLiveKit