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:
| Entidad | Tabla | Qué guarda |
|---|---|---|
Notifications | NOTIFICATIONS (BD configuration) | In-app, por usuario: title, description, priority, metadata (JSON con el contexto: paciente, remito…) y readAt |
MobileNotifications | MOBILENOTIFICATIONS | Un 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étodo | Qué 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.
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, ynotification-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.
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.