Volver a la wiki

Endpoint /api/correo/digest — GET/POST informe de correo

Descripción

Handler CloudFlare Workers que gestiona la publicación y lectura de informes de buzón Zoho. Implementa un patrón double-method (POST para escribir, GET para leer) sobre el recurso /api/correo/digest.

Archivo: functions/api/correo/digest.ts (194 LOC)

Autenticación

Soporta dos caminos:

  1. CF Access (sesión del navegador): resolveTeamMember(request) — trae la identidad del header CF-Access.
  2. Bearer tokens personales (MCP_TOKENS): variable de entorno con pares nombre:token separados por comas.
    • Ej: EDER:abc123,DANI:xyz789
    • Mapea nombre normalizado → TeamMember (Edu, Dani, Txell).

Restricción crítica: tokens de servicio (maintenance-agent, dr-backup, etc.) NO pueden publicar. El informe siempre pertenece a una persona.

Función memberFromBearer(request, env): TeamMember | null

Función resolveMember(request, env): TeamMember | null

POST /api/correo/digest

Descripción: publica un nuevo informe de pasada.

Identidad requerida: miembro del staff (personal, no servicio).

Request body (JSON):

interface DigestBody {
  generated_at: string;      // ISO 8601: timestamp de la pasada
  resumen?: string;           // línea de resumen (opcional)
  ruido_count?: number;       // nº mensajes filtrados como ruido
  items: DigestItem[];        // max 50 items
}

interface DigestItem {
  nivel: 'actua' | 'enterate'; // categoría (obligatorio)
  urgente?: boolean;           // true → entra en alerta general
  remitente: string;           // dirección o nombre remitente
  asunto: string;              // línea asunto
  porque: string;              // síntesis "por qué importa"
  zoho_link?: string;          // URL del mensaje en Zoho (opcional)
}

Validaciones:

Acción:

  1. Inserta en tabla correo_digests (D1).
  2. Poda automática: elimina registros del mismo miembro con created_at < now - 30 days (decisión grill).
  3. Si hay items con urgente=true + nivel='actua':
    • Desactiva alerta anterior (UPDATE alerts SET active=0).
    • Crea nueva alerta general con tipo 'warning'.
    • Llama logActivity() para auditoría.
  4. Devuelve { ok: true, owner, items: count, urgentes: count } (201).

Errores:

GET /api/correo/digest

Descripción: obtiene el último informe DEL MIEMBRO que pregunta.

Identidad requerida: miembro del staff.

Respuesta (JSON):

interface DigestResponse {
  owner: string;           // 'Edu' | 'Dani' | 'Txell'
  generated_at: string;    // ISO 8601 de la pasada
  resumen: string | null;
  ruido_count: number;
  items: DigestItem[];
  created_at: string;      // timestamp de inserción en D1
}

Lógica:

Privacidad: cada miembro solo ve su propio informe. Si intenta GET sin autenticación válida → 403.

Tabla D1 correo_digests

Ver [[entity—migrations—table—correo-digests]].

Resumen:

Componentes y funciones

Importaciones

Constantes

Interfaces

Flujo E2E típico

  1. Miembro ejecuta /correo en Claude (skill desatendido).
  2. Extrae categorías, remitentes, asuntos del buzón Zoho.
  3. Envía POST /api/correo/digest { generated_at, items: [...] } con su token personal.
  4. Handler valida identidad, inserta en D1, poda registros viejos.
  5. Si hay urgentes, crea alerta visual.
  6. Miembro abre dashboard o /correo → GET trae último informe.
  7. UI pinta secciones Actúa/Entérate con links a Zoho.

Testing

Véase también

Subir