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ónsend_message– Enviar mensajetyping_start/typing_stop– Indicadores de escrituramark_as_read– Marcar mensajes como leídos
Servidor → Cliente:
new_message– Nuevo mensaje recibidouser_typing– Otro usuario está escribiendomessage_delivered– Confirmación de entregauser_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 participantestype– 'direct' (1-a-1) o 'group' (grupal)name– Nombre del grupo (si aplica)lastMessage– Referencia al último mensajelastActivity– Timestamp de última actividadunreadCount– Contador por participantearchived– Estado de archivado por usuariomuted– Usuarios que silenciaron el thread
ChatMessage Schema
Mensajes individuales:
threadId– Thread al que pertenecesenderId– Usuario que envió el mensajecontent– Contenido del mensajetype– 'text', 'image', 'file', 'system'timestamp– Momento de envíoedited– Si fue editado y cuándodeleted– Soft delete flagdeliveredTo– Array de userIds que recibieronreadBy– 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 destinocontent– Contenido del mensajetype– Tipo de mensaje
UserTypingDto
Indicador de escritura:
threadId– Thread donde está escribiendoisTyping– Boolean de estado
NotificationDto
Notificaciones del sistema:
userId– Usuario destinatariotype– Tipo de notificacióndata– 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