Los tres canales
Cada notificación puede salir por hasta tres canales:
- Inbox in-app: la lista que ve el usuario en la app (
GET /api/notifications). Siempre funciona, sin configuración adicional.
- Web Push (
WEB_PUSH): notificación push del navegador, vía suscripción VAPID.
- Email (
EMAIL): correo enviado a través de Resend.
Registro público
POST /api/register y POST /api/register/camello (los dos endpoints de alta, sin sesión) notifican a todos los usuarios ADMIN por los tres canales: inbox, Web Push y email.
Eventos de Jobs
Los eventos JOB_* se disparan al crear un Job, al asignarlo (POST /api/admin/jobs/:id/assign) y en cada cambio de estado (aceptar, rechazar, completar, cancelar).
Preferencias por canal
GET /api/me/notification-preferences devuelve { items: [{ channel, enabled }] } para los canales WEB_PUSH y EMAIL (el inbox in-app no es configurable, siempre está activo). Se cambian con PATCH /api/me/notification-preferences.
Si el usuario no tiene fila de preferencia para un canal, ese canal cuenta como habilitado. La ausencia de preferencia no es “deshabilitado por defecto” — es “habilitado hasta que se diga lo contrario”. Es fácil asumir lo opuesto y la consecuencia es real: sin fila, ese usuario sigue recibiendo ese canal.
GET /api/admin/notifications
Este endpoint (solo ADMIN) lista deliveries — es decir, qué se envió por cada canal — no notificaciones. La distinción importa: una misma notificación lógica puede generar varias filas de delivery (una por canal), y esta lista es sobre esos envíos individuales, con su propio channel y status. Acepta limit, cursor, y filtros por channel, status, type y q.
Degradación sin configurar
Web Push y email dependen de variables de entorno; si faltan, ese canal se marca SKIPPED en el delivery correspondiente en lugar de fallar:
- Sin las variables
VAPID_*, el canal push queda SKIPPED.
- Sin las variables
RESEND_*, el canal email queda SKIPPED.
- El inbox in-app no depende de ninguna de las dos y sigue funcionando en ambos casos.
El detalle de qué hace cada variable y qué se degrada exactamente sin ella está en Variables de entorno.