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}
| Carpeta | Contenido |
|---|---|
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
Uploadde 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étodo | Cuándo se envía |
|---|---|
sendVerificationCode | Verificación de dirección de correo |
sendPasswordReset | Enlace de restablecimiento de contraseña |
sendWelcomeEmail | Cuenta 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
| Proveedor | Descripción |
|---|---|
| Twilio (predeterminado) | SMS estándar + Twilio Verify API para OTP |
| AWS SNS | SMS transaccional mediante AWS |
| MessageBird | Proveedor 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
fityposition - 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:02por 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
| Adaptador | Caso de uso |
|---|---|
| PostgreSQL | Desarrollo / tráfico bajo |
| BigQuery | Producción / alta escala (particionado por fecha) |
Cambia mediante ANALYTICS_DB_TYPE=postgres|bigquery.
Eventos rastreados
| Tabla | Eventos |
|---|---|
user_events | Cualquier acción del usuario (publicación creada, comentario publicado, etc.) |
post_events | Vistas, likes y compartidos de publicaciones |
admin_actions | Todas las mutations de administración con IP y metadatos |
content_reports | Envíos de reportes |
engagement_metrics | Contadores 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 participantesservices/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
| Variable | Servicio |
|---|---|
AWS_REGION / ACCESS_KEY / SECRET_KEY | S3, SES, SNS |
AWS_BUCKET_NAME | S3 |
AWS_EMAIL / AWS_EMAIL_NAME | SES |
SMS_PROVIDER | SMS (twilio / aws-sns / messagebird) |
TWILIO_ACCOUNT_SID / AUTH_TOKEN / PHONE_NUMBER | Twilio |
ANALYTICS_DB_TYPE | Adaptador de analítica |
GCP_PROJECT_ID / BIGQUERY_DATASET_ID | Analítica de BigQuery |
LIVEKIT_URL / API_KEY / API_SECRET | LiveKit |