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
| Columna | Tipo | Nullable | Descripción |
|---|---|---|---|
id | INTEGER | NO | Clave primaria auto-incrementante. |
owner | TEXT | NO | Miembro del staff (‘Edu’, ‘Dani’, ‘Txell’). Fijado por autenticación en el endpoint. |
generated_at | TEXT | NO | Timestamp ISO 8601 de cuándo se ejecutó la pasada de /correo. Lo proporciona el skill. |
resumen | TEXT | SÍ | Línea de resumen (ej: “6 actúa, 12 entérate, 8 urgentes”). Opcional. |
ruido_count | INTEGER | NO | Cantidad de mensajes filtrados como ruido/spam. Default 0. |
payload | TEXT | NO | JSON serializado con los items del informe. Array de DigestItem. |
created_at | TEXT | NO | Timestamp 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/digestejecutaDELETE 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 tablaalerts.
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]]