CreaRack-SL

Tabla D1 correo_digests

Descripción

Tabla D1 que almacena los informes periódicos de buzón Zoho publicados por cada miembro via POST /api/correo/digest.

Archivo de migración: migrations/0050_correo_digests.sql

Modelo de datos: una fila por pasada y miembro; retención 30 días (poda automática en cada POST).

Esquema

CREATE TABLE IF NOT EXISTS correo_digests (
  id           INTEGER PRIMARY KEY AUTOINCREMENT,
  owner        TEXT NOT NULL,                       -- 'Edu' | 'Dani' | 'Txell'
  generated_at TEXT NOT NULL,                       -- timestamp ISO 8601 de la pasada
  resumen      TEXT,                                -- una línea de resumen (opcional)
  ruido_count  INTEGER NOT NULL DEFAULT 0,          -- nº mensajes clasificados como ruido
  payload      TEXT NOT NULL,                       -- JSON: items actúa/entérate
  created_at   TEXT NOT NULL DEFAULT (datetime('now'))
);

CREATE INDEX IF NOT EXISTS idx_correo_digests_owner
  ON correo_digests(owner, created_at DESC);

Columnas

ColumnaTipoNullableDescripción
idINTEGERNOClave primaria auto-incrementante.
ownerTEXTNOMiembro del staff (‘Edu’, ‘Dani’, ‘Txell’). Fijado por autenticación en el endpoint.
generated_atTEXTNOTimestamp ISO 8601 de cuándo se ejecutó la pasada de /correo. Lo proporciona el skill.
resumenTEXTSÍLínea de resumen (ej: “6 actúa, 12 entérate, 8 urgentes”). Opcional.
ruido_countINTEGERNOCantidad de mensajes filtrados como ruido/spam. Default 0.
payloadTEXTNOJSON serializado con los items del informe. Array de DigestItem.
created_atTEXTNOTimestamp ISO 8601 de inserción (autogenerado).

Índice

  • Nombre: idx_correo_digests_owner
  • Columnas: (owner, created_at DESC)
  • Propósito: queries rápidas para “obtener último informe de X miembro” (patrón WHERE owner = ? ORDER BY created_at DESC LIMIT 1).

Privacidad y retención

Decisión del grill (12-08-2026):

  • En payload (JSON): solo remitente, asunto, “por qué importa”, enlace a Zoho.
  • NUNCA se guardan cuerpos de mensajes.
  • Retención: máximo 30 días desde la inserción.
  • Poda automática: cada POST /api/correo/digest ejecuta DELETE FROM correo_digests WHERE owner = ? AND created_at < datetime('now', '-30 days').

Estructura del payload JSON

interface DigestItem {
  nivel: 'actua' | 'enterate';   // categoría: acción requerida o informativo
  urgente?: boolean;              // true → alerta general del workspace
  remitente: string;              // máx 500 chars
  asunto: string;                 // máx 500 chars
  porque: string;                 // síntesis "por qué importa", máx 500 chars
  zoho_link?: string;             // URL del mensaje original en Zoho, máx 500 chars
}

Ejemplo:

[
  {
    "nivel": "actua",
    "urgente": true,
    "remitente": "CEO <ceo@example.com>",
    "asunto": "Aprobación presupuesto Q4",
    "porque": "Decisión crítica, deadline mañana",
    "zoho_link": "https://crearack.zohomail.com/mail/...#id=123456"
  },
  {
    "nivel": "enterate",
    "remitente": "Noticias <news@example.com>",
    "asunto": "Resumen semanal",
    "porque": "Solo informativos"
  }
]

Máximo 50 items por pasada. Campos truncados a 500 caracteres en el endpoint.

Uso desde el endpoint

Ver [[entity—functions—endpoint—correo-digest]].

INSERT (POST)

INSERT INTO correo_digests (owner, generated_at, resumen, ruido_count, payload)
  VALUES (?, ?, ?, ?, ?)

SELECT (GET)

SELECT owner, generated_at, resumen, ruido_count, payload, created_at
  FROM correo_digests
  WHERE owner = ?
  ORDER BY created_at DESC, id DESC
  LIMIT 1

DELETE (poda automática)

DELETE FROM correo_digests
  WHERE owner = ?
  AND created_at < datetime('now', '-30 days')

Integraciones

  • Endpoint: [[entity—functions—endpoint—correo-digest]] — escribe y lee.
  • UI: [[entity—src—page—correo-ui]] — consume último informe vía GET.
  • Alertas: si hay items urgente=true + nivel='actua', el endpoint crea alerta en tabla alerts.

Migración aplicada

✅ Ya aplicada a D1 remota en la sesión de deploy (12-08-2026).

Véase también

  • [[entity—functions—endpoint—correo-digest]]
  • [[feature—workspace—correo-menu-f0]]
  • [[concept—infra—d1-database]]