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
| Hook | Acción en Zoho |
|---|---|
onTaskCreated | Crea evento en el calendario del miembro responsable vía createAutoEvent() |
onTaskUpdated | Borra eventos del tipo afectado (deleteEventsByType) y recrea si procede |
onTaskDeleted | Borra 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>
- Llama al endpoint GET de evento Zoho.
- Devuelve
events[0].etagonullsi la respuesta no esoko si la estructura no contiene etag. - Captura todas las excepciones con
try/catchy retornanull(fail-safe). - Usada en
deleteEventsByTypey en el bloque deonTaskDeleted.
Dependencias clave
| Símbolo | Origen | Rol |
|---|---|---|
ZohoEnv | types/zoho.ts | Bindings de env (DB, KV, secrets OAuth) |
getValidAccessToken | _lib/zoho-auth.ts | Obtiene/refresca token OAuth2 de Zoho |
zohoFetch | _lib/zoho-fetch.ts | Wrapper fetch con retry y logging |
calendarApiHost | _lib/zoho-auth.ts | Resuelve host por data-center (dc) |
env.DB (D1) | Cloudflare D1 | Tabla zoho_calendar_links para persistencia de uid |
Tabla D1: zoho_calendar_links
Columnas relevantes para el borrado:
| Columna | Tipo | Descripción |
|---|---|---|
zoho_event_uid | TEXT | UID del evento en Zoho |
calendar_uid | TEXT | UID del calendario destino |
created_by | TEXT (TeamMember) | Miembro propietario del evento |
task_id | INTEGER | FK a la tarea interna |
link_type | TEXT | Tipo 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
- [[incident—20260517—zoho-calendar-etag-missing]] — Incidente s68: eventos no borrados en Zoho por ETag ausente
- [[entity—zoho—schema—zohoevent]] — Schema ZohoEvent con campo
etag - [[entity—zoho—schema—zohoenv]] — Bindings de entorno Zoho Workers
- [[entity—zoho—schema—zohotaskuser]] — Schema de miembro de equipo Zoho
- [[entity—zoho—schema—zohogroup]] — Grupos Zoho relacionados con asignación de tareas