Saltar al contenido principal

Chat y WebSocket

Sistema completo de comunicación en tiempo real que permite chat entre usuarios con persistencia, autenticación WebSocket y herramientas administrativas de moderación.


Componentes del Sistema

Chat Gateway

Gateway WebSocket principal usando Socket.io:

Funcionalidades

  • Autenticación JWT en tiempo real – Valida tokens en cada conexión
  • Rooms dinámicas – Conversaciones 1-a-1 y grupales
  • Eventos de presencia – Online, offline, typing indicators
  • Entrega garantizada – Confirmaciones de recepción y lectura
  • Reconexión automática – Manejo de desconexiones temporales

Eventos Soportados

Cliente → Servidor:

  • join_room – Unirse a conversación
  • send_message – Enviar mensaje
  • typing_start / typing_stop – Indicadores de escritura
  • mark_as_read – Marcar mensajes como leídos

Servidor → Cliente:

  • new_message – Nuevo mensaje recibido
  • user_typing – Otro usuario está escribiendo
  • message_delivered – Confirmación de entrega
  • user_joined / user_left – Cambios en presencia

Chat Service

Servicio de lógica de negocio del chat:

Gestión de Mensajes

  • Persistencia – Almacena todos los mensajes en MongoDB
  • Historial – Recupera conversaciones con paginación
  • Búsqueda – Busca en mensajes por texto o fecha
  • Edición – Permite editar mensajes enviados
  • Eliminación – Soft delete con registro de auditoría

Gestión de Threads

  • Creación automática – Al iniciar nueva conversación
  • Metadata – Participantes, último mensaje, contador de no leídos
  • Archivado – Marca threads como archivados
  • Mute – Silencia notificaciones de thread específico

Chat Redis Service

Servicio de cache para chat en tiempo real:

Cache de Datos

  • Mensajes recientes – Últimos N mensajes de cada thread en Redis
  • Estado de presencia – Usuarios online/offline
  • Typing indicators – Estado de escritura temporal
  • Sesiones WebSocket – Mapeo de socketId a userId

Optimizaciones

  • TTL automático para datos temporales
  • Invalidación inteligente de cache
  • Pub/Sub para mensajes entre instancias
  • Reducción de queries a MongoDB

Schemas de Chat

ChatThread Schema

Representa una conversación:

  • participants – Array de userIds participantes
  • type – 'direct' (1-a-1) o 'group' (grupal)
  • name – Nombre del grupo (si aplica)
  • lastMessage – Referencia al último mensaje
  • lastActivity – Timestamp de última actividad
  • unreadCount – Contador por participante
  • archived – Estado de archivado por usuario
  • muted – Usuarios que silenciaron el thread

ChatMessage Schema

Mensajes individuales:

  • threadId – Thread al que pertenece
  • senderId – Usuario que envió el mensaje
  • content – Contenido del mensaje
  • type – 'text', 'image', 'file', 'system'
  • timestamp – Momento de envío
  • edited – Si fue editado y cuándo
  • deleted – Soft delete flag
  • deliveredTo – Array de userIds que recibieron
  • readBy – Array de userIds que leyeron

Guards de Chat

JWT WebSocket Guard

Validación de autenticación en WebSocket:

  • Extrae token JWT del handshake
  • Valida firma y expiración
  • Carga información del usuario en socket
  • Rechaza conexiones no autenticadas

Chat Guards

Guards específicos para operaciones de chat:

  • ParticipantGuard – Verifica que usuario sea participante del thread
  • AdminGuard – Valida permisos de moderación
  • RateLimitGuard – Limita mensajes por minuto

Admin Chat Client

Cliente Administrativo

Herramientas de moderación y gestión:

Funcionalidades de Moderación

Monitoreo:

  • Ver todas las conversaciones activas
  • Buscar mensajes por contenido o usuario
  • Estadísticas de uso del chat
  • Alertas de contenido inapropiado

Acciones:

  • Silenciar usuario temporalmente
  • Eliminar mensajes reportados
  • Cerrar threads problemáticos
  • Banear usuarios del chat

Reportes:

  • Ver mensajes reportados por usuarios
  • Historial de acciones de moderación
  • Estadísticas de uso por usuario
  • Patrones de comportamiento sospechoso

DTOs de Chat

ChatDto

Envío de mensajes:

  • threadId – Thread destino
  • content – Contenido del mensaje
  • type – Tipo de mensaje

UserTypingDto

Indicador de escritura:

  • threadId – Thread donde está escribiendo
  • isTyping – Boolean de estado

NotificationDto

Notificaciones del sistema:

  • userId – Usuario destinatario
  • type – Tipo de notificación
  • data – Datos adicionales

Escalabilidad WebSocket

El sistema está preparado para escalar horizontalmente usando Redis Pub/Sub:

  • Múltiples instancias del gateway pueden funcionar simultáneamente
  • Los mensajes se sincronizan entre instancias via Redis
  • Los usuarios pueden conectarse a cualquier instancia
  • Load balancer con sticky sessions para eficiencia