Skip to main content

Notificaciones y push

Un mismo evento del negocio —una hoja de ruta que se creó, una tarea que falló— genera dos cosas: una notificación in-app para la consola web y un push a los celulares de los transportistas.

Backend

Módulo src/modules/notifications/, con dos entidades:

EntidadTablaQué guarda
NotificationsNOTIFICATIONS (BD configuration)In-app, por usuario: title, description, priority, metadata (JSON con el contexto: paciente, remito…) y readAt
MobileNotificationsMOBILENOTIFICATIONSUn token de Expo por dispositivo. Un usuario puede tener varios (celular + tablet). isActive + disabledAt para el soft-delete

Constantes

NotificationPriority: LOW 0 · MEDIUM 1 · HIGH 2 · CRITICAL 3.

NotificationType cubre todo el ciclo de la hoja de ruta:

DISPATCH_CREATED · DISPATCH_UPDATED · DISPATCH_CANCELLED · DISPATCH_COMPLETED
DISPATCH_FAILED · DISPATCH_PAUSED · DISPATCH_RESUMED · DISPATCH_RESTARTED
DISPATCH_DETAIL_CANCELED · DISPATCH_DETAIL_FINISHED · DISPATCH_DETAIL_FAILED

Endpoints

/v1/notifications: GET /me · GET /unread-count · POST /change-notifications-status · POST /push/register · POST /test.

Push por Expo

services/MobileNotificationsSevice.ts (sí, le falta la r al nombre del archivo):

MétodoQué hace
queueExpoPush(messages)Publica a la cola en batches de hasta 100 — el límite de la Expo Push API
queueExpoPushToUsers(...) / queueExpoPushToTransportists(...)Resuelven los tokens activos del destinatario
sendExpoPush(messages)El fetch real. Manda Authorization: Bearer solo si hay EXPO_ACCESS_TOKEN, y desactiva automáticamente los tokens que Expo reporta como muertos

El envío pasa por cola, no es síncrono al request.

Ese consumo fue causa confirmada de un memory leak

El consumidor de notificaciones móviles combinado con logging masivo hizo crecer la memoria del proceso hasta reiniciarlo. Si tocás el batching o el logging de ahí, medí.

Consola web

  • components/notifications/notification-bell (campana + contador), notification-item, notification-detail, y notification-priority.util.ts (color e ícono por prioridad).
  • pages/notifications/ — el centro de notificaciones, con vista tipo mail (lista + preview) y preview del PDF del remito.
El contador se poletea cada 30 s

services/notification.service.ts usa interval(30000) + switchMap. Ese polling es el mecanismo real: el WebSocket de la consola web no está activo (ver Estructura del front).

Mobile

El token se registra al montar la app contra POST /v1/notifications/push/register; la recepción es con expo-notifications, envuelta en hooks/shared/useNotifications.ts.