Volver a la wiki

Descripción

task-zoho-auto es el servicio Cloudflare Workers que sincroniza automáticamente las tareas internas de CreaRack con eventos de Zoho Calendar. Se invoca mediante hooks de ciclo de vida de tarea (onTaskCreated, onTaskUpdated, onTaskDeleted) y mantiene una tabla D1 de enlace entre task_id y zoho_event_uid.

Ubicación: functions/_lib/task-zoho-auto.ts


Responsabilidades

HookAcción en Zoho
onTaskCreatedCrea evento en el calendario del miembro responsable vía createAutoEvent()
onTaskUpdatedBorra eventos del tipo afectado (deleteEventsByType) y recrea si procede
onTaskDeletedBorra todos los eventos asociados a la tarea

Patrón de borrado con ETag (concurrencia optimista)

Actualizado en commit e779e6a (2026-05-17) tras el incidente [[incident—20260517—zoho-calendar-etag-missing]].

La Zoho Calendar API requiere el header HTTP etag en todas las peticiones DELETE y PUT. Sin él la API devuelve 400 ETAG_MISSING. El flujo implementado es:

1. GET  /api/v1/calendars/{calendarUid}/events/{eventUid}
        → leer events[0].etag
2. Si GET devuelve !ok  → skip (evento ya no existe en Zoho, nada que borrar)
3. DELETE /api/v1/calendars/{calendarUid}/events/{eventUid}
           Header: etag: <valor del paso 1>
4. Si DELETE !ok → console.warn con status y body (máx 200 chars)

Esto implica dos llamadas HTTP por cada evento borrado, pero es el único patrón oficial y robusto. Si el evento ya fue borrado externamente (GET → 404), se omite el DELETE y se registra un console.warn.

Función auxiliar fetchEventEtag

async function fetchEventEtag(
  env: ZohoEnv,
  member: TeamMember,
  calendarUid: string,
  eventUid: string,
): Promise<string | null>

Dependencias clave

SímboloOrigenRol
ZohoEnvtypes/zoho.tsBindings de env (DB, KV, secrets OAuth)
getValidAccessToken_lib/zoho-auth.tsObtiene/refresca token OAuth2 de Zoho
zohoFetch_lib/zoho-fetch.tsWrapper fetch con retry y logging
calendarApiHost_lib/zoho-auth.tsResuelve host por data-center (dc)
env.DB (D1)Cloudflare D1Tabla zoho_calendar_links para persistencia de uid

Columnas relevantes para el borrado:

ColumnaTipoDescripción
zoho_event_uidTEXTUID del evento en Zoho
calendar_uidTEXTUID del calendario destino
created_byTEXT (TeamMember)Miembro propietario del evento
task_idINTEGERFK a la tarea interna
link_typeTEXTTipo de enlace (LinkType)

Observabilidad

Todos los warn se emiten con prefijo [task-zoho-auto] y contienen zoho_event_uid + task#<id>, facilitando la búsqueda en Cloudflare Workers Logs.


Véase también

Subir