Sincronización de recursos

Arquitectura de sincronización

Los recursos reservables viven en múltiples fuentes y se sincronizan hacia app_reservas (el motor centralizado). Las fuentes son:

  • iwage_strapi: experiencias, paquetes, propiedades en gestión, propiedades de tierras.
  • marca_personal_strapi: servicios de consultoría.
  • espacios_plus_strapi: espacios de trabajo.

Sincronización automática (lifecycle hooks)

Ciertos content types de iwage_strapi tienen lifecycle hooks que disparan la sincronización automáticamente al crear o actualizar:

Content TypeLifecycleTipo en reservas
ExperienciaafterCreate / afterUpdateexperiencia (slot_horario)
Propiedad-GestionafterCreate / afterUpdatepropiedad_estancia (rango_fechas o bajo_consulta)

El hook envía un POST a /api/admin/recursos/sync en app_reservas con los datos del recurso (nombre, slug, tipo, precio, capacidad, configuración de disponibilidad, URL pública).

Sincronización manual (script batch)

Para sincronizar todos los recursos de una vez (ej: después de una migración o cambio masivo), se usa el script:

node strapi/scripts/sync-recursos-reservas.mjs

El script sincroniza en este orden:

  1. Experiencias de iwage_naturaleza.
  2. Paquetes de iwage_naturaleza.
  3. Propiedades en gestión (iwage_gestion).
  4. Propiedades de tierras (visitas).
  5. Servicios de marca_personal.

Variables de entorno del script: IWAGE_STRAPI_URL, MP_STRAPI_URL, ESPACIOS_PLUS_STRAPI_URL, RESERVAS_API_URL, RESERVAS_SYNC_TOKEN.

Mecanismo anti-echo

Algunas experiencias en iwage_strapi son "espejo" de recursos que nacieron originalmente en app_reservas (recursos de aliados externos). Para evitar duplicación infinita, el sistema verifica el campo etiquetas_personalizadas.origen. Si el origen es app_reservas, la experiencia se omite en la sincronización (ni el lifecycle hook ni el script batch la envían de vuelta).

Endpoint de sync

El endpoint POST /api/admin/recursos/sync en app_reservas:

  • Busca el recurso por slug + origen.
  • Si existe, lo actualiza (UPSERT).
  • Si no existe, lo crea.
  • Requiere token de autenticación (RESERVAS_SYNC_TOKEN).
  • Retorna la acción realizada: "created" o "updated".

¿Te fue útil esta guía?