Los datos
Trece tablas. El centro es items —el archivo— y todo lo demás cuelga de
cuentas, que es lo que este sistema sabe hablar.
El diagrama
Cuatro tablas más no cuelgan de nada y por eso quedan fuera del diagrama:
ajustes (clave/valor, incluido el freno general), alertas (los avisos y si
se entregaron), latidos (qué worker late y cuándo) y metricas_diarias (el
resumen por día).
Las restricciones que son guardas
Estas no son validaciones de forma: son reglas del proyecto sostenidas por la base, donde no dependen de que un programador se acuerde.
| Restricción | Qué impide |
|---|---|
items_atribucion_obligatoria | Que un ítem atribucion_sin_permiso exista sin enlace al original. La atribución no es una convención: es un CHECK. |
items_regimen_check | Un régimen inventado. Sólo consentido o atribucion_sin_permiso. |
cuentas_rol_plataforma_coherente | Declarar que se publica en Instagram (no se puede) o que se lee de LinkedIn (no hay cliente). Espeja la tabla de plataformas del código. |
consentimientos_destino_no_vacio | Un permiso que nombra una lista vacía de destinos: se leería como «permiso otorgado» y no habilitaría nada. |
rutas_clave_unica + trigger de inmutabilidad | Que la identidad de un flujo cambie. Sin eso, cada renombre entraría como flujo nuevo al importar. |
UNIQUE (item_id, cuenta_destino_id, ronda) | Publicar dos veces lo mismo en el mismo destino. Es lo que hace idempotente a «diseminar». |
¿Por qué cuentas_destino es un arreglo de UUID y no un texto con la red?
Porque el permiso es por cuenta, no por red. Con dos cuentas de Mastodon, un
permiso de alcance mastodon habilitaba las dos, y no había forma de consentir
una y no la otra. La versión anterior guardaba 'mastodon' y era exactamente
esa la falla: más ancha que lo que la persona afirmó.
Por qué el archivo guarda bytes y no URLs
archivo_estado tiene seis valores y dos de ellos no sanan solos:
| Estado | Significa | ¿Se arregla solo? |
|---|---|---|
pendiente | Todavía no se bajó | Sí, el descargador lo toma |
descargando | En eso está | Sí |
listo | Los bytes están | — |
sin_medios | Un post de sólo texto: no hay nada que bajar | — (no es una falta) |
fallido | La bajada falló | No. El descargador sólo toma pendiente/descargando |
purgado | Se liberó el disco a propósito | No. Hay que volver a traerlo |
sin_medios existe para no mentir. Un post de texto no tiene archivo, y
marcarlo pendiente lo dejaría para siempre en la cola del descargador,
contando como trabajo que nunca se hace. No es una falta: es que no hay nada que
faltar.