Configurar DataSources
Una DataSource puebla la Ontología desde una fuente externa. Se gestiona en
/datasources (UI) o por el template. Tipos soportados: csv_upload, rest_api,
webhook y manual.
Mappings — el corazón
Cada mapping conecta un campo de la fuente con una property de un tipo:
{ "sourceField": "estado", "targetType": "Ticket",
"targetProperty": "estado", "transformation": "toLowerCase", "isIdentity": false }sourceField— la columna CSV o key del JSON.targetType/targetProperty— adónde aterriza (deben existir vivos).transformation— transformer seguro por nombre (sineval):trim,toNumber,toBoolean,toLowerCase,toUpperCase,parseDate.isIdentity— marca la clave natural (ver upsert).
El backend valida que cada targetType exista vivo y que targetProperty sea una
property declarada de ese tipo. Los mappings apuntan a properties (no links).
Upsert por clave natural
Para que re-ingestar actualice en vez de duplicar, marcá exactamente un
mapping por tipo como isIdentity: true. La ingesta computa
externalKey = "{dataSourceId}:{valor}" y busca el objeto por (typeId, externalKey):
- si existe vivo → update (con su
version), - si no → create.
Sin ningún isIdentity, la fuente es insert-only (cada corrida crea objetos nuevos).
Tipos de fuente
CSV (csv_upload)
Subís un archivo; se parsea con hasHeader (y delimiter/encoding opcionales) y
se dispara la ingesta. El archivo vive bajo el prefijo de Storage de la org.
REST (rest_api)
Pull periódico desde un endpoint GET. Soporta headers, auth
(none/apiKey/bearer), recordsPath (dot-path al array dentro del JSON) y
paginación simple. Admite schedule (cron) para ingestas automáticas.
Webhook (webhook)
Un endpoint público al que un sistema externo postea registros. Se autentica con un token (se muestra una vez al crear; en el doc solo vive su hash). Tiene rate-limit por fuente.
Manual
Placeholder para datos cargados a mano por la UI.
Los secretos nunca van en el doc de la DataSource (es legible por todos los
miembros). La API key de REST vive aislada en /dataSourceSecrets; el token del
webhook se guarda hasheado. El doc legible queda libre de secretos.
Corridas e historial
Cada ingesta —manual, programada o por webhook— deja un IngestionRun
inmutable: counts (read/created/updated/failed), errores por fila (acotados), y
estado (success / partial / failed). La ingesta es best-effort por fila:
una fila inválida no aborta la corrida, queda registrada.
El feed de ingestas aparece en el Dashboard. El detalle de la fuente muestra el historial de corridas con sus logs.