Backend: integraciones y operacion
Integraciones externas
| Integracion | Uso principal |
|---|---|
| Firebase Admin | Auth, Firestore, FCM y operaciones de usuario |
| Firestore | Persistencia principal |
| Google Cloud Tasks | Automatizaciones diferidas |
| Infobip WhatsApp API | Mensajeria al cliente |
| Firebase Cloud Messaging | Push web al equipo |
| Firebase Storage | Archivos e imagenes de negocios, sedes y usuarios |
Firebase Admin
Se usa para:
- validar tokens
- crear o eliminar usuarios de Auth
- interactuar con Firestore
- enviar push via FCM
- borrar archivos de Storage en ciertos flujos de limpieza
- apoyar ciertos flujos de limpieza
Dependencia critica:
FIREBASE_CREDENTIALS_PATHFIREBASE_STORAGE_BUCKET
Firestore
FirestoreService centraliza:
- CRUD basico
- consultas paginadas
- subcolecciones
- conversion de timestamps
- logging de queries lentas
Google Cloud Tasks
Cloud Tasks soporta automatizaciones alrededor de appointments.
Hoy se documentan dos tasks por cita:
appointment-status-in-progressappointment-status-finished
El objetivo es mover automaticamente una cita cuando llega su hora.
Tambien se usa para disparar procesos diferidos del outbox, por ejemplo cascadas o limpieza de recursos que no deberian depender de que un request HTTP permanezca vivo.
Infobip WhatsApp
Se usa para plantillas de mensajeria como:
- confirmacion de cita
- modificacion o cancelacion
- cierre o finalizacion
Validaciones conocidas:
- el telefono se normaliza a formato internacional
- rechazos del proveedor se reportan como error controlado
- las plantillas cambian por ambiente: en produccion usan sufijo
_prdy en desarrollo conservan los nombres base
Outbox
El backend tiene un outbox persistido en OutboxEvents para efectos diferidos o reintentables.
Estados conocidos:
PENDINGPROCESSINGDONEERRORPAUSED
Tipos conocidos incluyen eventos de bookings, sincronizacion de metricas, WhatsApp, push, tasks de appointments, borrado en cascada de negocio, limpieza de Storage y sincronizacion/eliminacion de usuarios en Auth.
Endpoints internos:
GET /outboxGET /outbox/:idPOST /outbox/processPOST /outbox/:id/requeue
Todos requieren x-internal-task-token, aunque esten exentos de Firebase Auth para que Cloud Tasks o Scheduler puedan llamarlos.
Push web
El backend maneja suscripciones de dispositivos y puede enviar notificaciones al equipo.
Comportamientos documentados:
- un
deviceIdno debe quedar asociado a multiples usuarios a la vez - tokens invalidos se limpian automaticamente
- el link de destino se construye con
FRONTEND_APP_BASE_URL
Variables de entorno
Base
PORTFIREBASE_CREDENTIALS_PATHFIREBASE_STORAGE_BUCKETENV
WhatsApp / Infobip
INFOBIP_BASE_URLINFOBIP_API_KEYINFOBIP_WHATSAPP_SENDERINFOBIP_TIMEOUT_MS
Cloud Tasks
CLOUD_TASKS_PROJECT_IDCLOUD_TASKS_LOCATIONCLOUD_TASKS_QUEUECLOUD_TASKS_MAX_ATTEMPTSCLOUD_TASKS_TARGET_BASE_URLCLOUD_TASKS_INTERNAL_TOKEN
Frontend y push
FRONTEND_APP_BASE_URLPUSH_NOTIFICATIONS_ENABLED
Flujos operativos importantes
Alta de booking
- validar negocio, cliente, sede, servicio y horario
- consumir cupo de booking
- crear booking y appointments
- recalcular metricas economicas
- programar tasks
- intentar WhatsApp y push
Finalizacion de cita
- actualizar estado
- sincronizar booking si aplica
- actualizar metricas
- limpiar tasks pendientes
- si el booking termina, intentar WhatsApp de finalizacion
Reconciliacion de usage
El endpoint interno POST /business/usage/reconcile-today sirve para:
- activar o desactivar periodos de uso
- corregir cupos restantes
- recalcular
subscriptionStatus
Comandos de operacion
Segun package.json del backend:
npm run dev
npm run typecheck
npm run build
npm run start
npm run seed:prod:base:dry-run
npm run seed:prod:base
npm run deploy:prod:indexes
npm run deploy:dev
npm run deploy:prod
Los despliegues actuales separan ambiente de desarrollo y produccion. Produccion apunta a cutlyy-prd, cutlyy-api-prod, api.cutlyy.com y app.cutlyy.com; desarrollo conserva barber-app-dev-c7f59 y dominios *.dev.cutlyy.com.
Healthcheck
GET /health responde un JSON liviano con:
statusservicetimestamp
Sirve para ver que el proceso HTTP esta vivo. No reemplaza una prueba profunda de dependencias como Firestore, Infobip o Cloud Tasks.
Riesgos operativos actuales
- no hay suite automatizada de regresion
- el healthcheck actual no valida dependencias externas
- el rate limit no es distribuido
- varias automatizaciones dependen de que el token interno y la base URL de Cloud Tasks esten correctos