Riferimento API Admin GraphQL¶
L'API GraphQL admin è il piano di configurazione di Provisa. È l'API che l'app web di amministrazione chiama per ogni operazione di gestione: creare origini, registrare tabelle, definire relazioni, configurare regole RLS, e tutto il resto che modella il modello.
Punto di mount: POST /admin/graphql
Questa non è la stessa API del data plane su /data/graphql. Il data plane serve le query degli utenti finali sui domini registrati ed è descritto dall'SDL su /data/sdl. L'API admin configura come appare quello schema e chi può vedere cosa.
Come la UI parla con questa API¶
L'app web di amministrazione usa Apollo Client, puntato su ${API_BASE}/admin/graphql.
Ogni richiesta porta un bearer token (recuperato fresco dal provider di autenticazione a ogni chiamata), un header X-Org-Id in multi-tenancy, e un header X-Env quando serve un ambiente branch.
Lo schema è assemblato da due classi @strawberry.type — Query da schema_query.py e Mutation da schema_mutation.py — e avvolto in una ModelCommitExtension che registra ogni mutation contro il branch dell'ambiente corrente.
Autorizzazione¶
Modalità dev: quando non è configurata alcuna autenticazione e ogni richiesta arriva come principal anonimo, tutti i controlli di capability vengono saltati. Questo mantiene un'installazione locale funzionante senza configurazione di autenticazione.
Gate di capability: i deployment di produzione applicano capability nominate. Il diritto specifico richiesto da ogni campo è annotato inline. Chiamare una mutation senza la capability richiesta solleva un PermissionError. Il ruolo di amministratore della piattaforma bypassa tutti i controlli di capability.
Gate di dominio: diverse mutation controllano anche il dominio a cui appartiene l'oggetto. Un chiamante ambitoato a sales non può registrare una tabella in finance, accodare una regola RLS per essa, o creare una relazione la cui tabella origine vive in un dominio che non possiede. Le viste sono ulteriormente vincolate: ogni tabella letta dall'SQL della vista deve essere all'interno dei domini del chiamante, perché altrimenti l'SQL a mano libera darebbe a un membro accesso a dati fuori dal proprio ambito.
Ereditarietà dei ruoli: le capability di un ruolo padre vengono ereditate dai ruoli figli. createRole e deleteRole rifiutano i cicli e impediscono di eliminare un ruolo che ha eredi.
Tipo di ritorno comune¶
La maggior parte delle mutation restituisce MutationResult.
type MutationResult {
success: Boolean!
message: String!
code: String # stable i18n key, e.g. "schema.source_created"
params: JSON # key/value pairs for client-side localization
}
Quando una mutation fallisce, success è false e message porta la ragione in inglese. code è un identificatore stabile che la UI usa per rendere un messaggio localizzato.
Query¶
Origini¶
sources → [SourceType!]!¶
Tutte le origini dati registrate.
query {
sources {
id type host port database username dialect
cacheEnabled cacheTtl replicate
loadProtected offPeakWindow offPeakTz
gqlNamingConvention path allowedDomains
description mappingJson federationHintsJson
changeSignal passwordRef
cdc {
bootstrapServers topicPrefix consumerGroupId
schemaRegistryUrl schemaRegistryAuth schemaRegistryUsername schemaRegistryPassword
schemaRegistryToken schemaRegistryClientCert schemaRegistryClientKey schemaRegistryCa
}
}
}
passwordRef è un riferimento ${secret:NAME} nel vault dell'org, mai la credenziale letterale.
source(id: String!) → SourceType¶
Una singola origine per ID. Restituisce null quando non trovata.
availableSchemas(sourceId: String!) → [String!]!¶
Schemi visibili in un'origine, filtrati per escludere quelli interni a Provisa. Usa prima l'introspezione nativa; ricade sul catalogo del motore quando il tipo di origine non ha un pool diretto.
availableTables(sourceId: String!, schemaName: String = "public") → [AvailableTableType!]!¶
Tabelle in uno schema di un'origine, con i loro commenti. Per le origini OpenAPI, restituisce operazioni GET la cui risposta è un array o un wrapper di paginazione. Per le origini GraphQL, restituisce i campi query che restituiscono una lista. Per gRPC, restituisce le RPC server-streaming.
availableColumns(sourceId: String!, schemaName: String!, tableName: String!) → [String!]!¶
Nomi delle colonne per una tabella nel catalogo del motore. Per le origini govdata, usa un resolver separato.
availableColumnsMetadata(sourceId: String!, schemaName: String!, tableName: String!) → [AvailableColumnType!]!¶
Nomi delle colonne con tipi di dato, commenti, tipi di filtro nativo, e flag di chiave primaria. Per le origini OpenAPI, deriva la forma dallo schema di risposta dell'operazione e dai parametri.
availableFunctions(sourceId: String!, schemaName: String = "openapi") → [AvailableTableType!]!¶
Operazioni non-GET per un'origine OpenAPI (POST, PUT, PATCH, DELETE). Restituisce una lista vuota per origini non-OpenAPI.
crawlSource(path, depth, pattern, recursive, simpleLinks, sameDomain, excludePattern) → CrawlResultType¶
Anteprima di cosa scoprirebbe un crawl del connettore file — file, tabelle e colonne — prima che un'origine venga creata. Le impostazioni solo-HTTP (simpleLinks, sameDomain, excludePattern) vengono ignorate per radici locali, S3, FTP e SFTP.
suggestTableAlias(tableName: String!, domainId: String!, sourceId: String!) → String!¶
Restituisce l'alias da usare quando si registra tableName in domainId da sourceId. Restituisce un semplice alias snake-case quando non esiste conflitto, o un alias con prefisso origine (sqlite_b_orders) quando il nome effettivo è già preso da un'origine diversa nello stesso dominio.
Tabelle¶
tables → [RegisteredTableType!]!¶
Tutte le tabelle registrate, ciascuna con l'elenco completo delle colonne. La visibilità delle colonne nella risposta rispetta la capability table_registration del chiamante: canDeployToDb è vincolato al fatto che il chiamante possieda quel diritto.
Ogni RegisteredTableType espone sotto-campi calcolati:
refreshPolicySummary → RefreshPolicySummaryType— la policy effettiva di refresh/serving come testo semplice, derivata lato server dalla stessa risoluzione del planner usata dal motore. Restituiscenulldurante l'avvio.graphqlFieldName → String— il nome del campo che questa tabella ha nello schema data-plane compilato, cosicché il pannello Data Product possa costruire un esempio eseguibile senza replicare l'algoritmo di naming.dqDataset → String— questa tabella come dataset contratto di qualità dei dati, nella forma che il checker scansiona.productId → String— il prodotto dati a cui appartiene questa tabella. Una tabella DQ-checker eredita il prodotto della tabella scansionata dal suo contratto.
refreshPolicyPreview(...) → RefreshPolicySummaryType¶
Anteprima del riepilogo effettivo di refresh/serving per manopole di tabella in bozza (non salvate), cosicché il riepilogo in cima al modulo si aggiorni man mano che i campi cambiano senza persistere nulla. Stessa derivazione di refreshPolicySummary sopra.
Argomenti: sourceId, domainId, schemaName, tableName, cacheTtl, replicate, loadProtected, offPeakWindow, offPeakTz, changeSignal.
columnDependents(tableId: String!, renamed: [String!], removed: [String!]) → [ColumnDependentsType!]!¶
Artefatti che una ridenominazione di alias o rimozione di colonna in sospeso romperebbe. È consultivo: la UI admin lo mostra prima di salvare e l'amministratore decide. Deve essere chiamato prima di salvare, perché i dipendenti sono stati scritti contro il nome esposto che la colonna porta attualmente.
Relazioni¶
relationships → [RelationshipType!]!¶
Tutte le relazioni definite dall'utente (esclude le voci auto-generate gql_auto__ e le voci sintetiche meta:% usate dall'ERD).
allRelationships → [RelationshipType!]!¶
Come relationships, ma include le voci sintetiche meta:%. Usata dall'ERD del grafo, che deve mostrare ogni arco inclusi i link impliciti HAS_TABLE tra le tabelle dati e il registro dei metadati.
Ogni RelationshipType espone:
autoSuggested → Boolean— se la relazione è stata suggerita dall'analisi FK (l'idinizia confk__).physicalName → String— il nome della relazione sui piani SQL e gRPC (il parametro?include=). Derivato lato server; i client non devono traslitterare l'alias GraphQL.
Domini, ruoli e utenti¶
domains → [DomainType!]!¶
Tutti i domini nel database del tenant dell'org attiva. Il database del tenant è isolato a livello di schema, quindi l'elenco domini di un org-admin contiene solo le righe della propria org.
roles → [RoleType!]!¶
Ruoli visibili al chiamante. Un admin vede ogni ruolo; un non-admin vede solo ruoli senza org_id o ruoli appartenenti alla propria org.
resolveOwners(refs: [String!]!) → [UserSummaryType!]!¶
Risolve ID di ruolo o ID utente in singoli utenti. Usato per espandere DataProduct.ownerRole, Domain.steward, e Column.visibleTo in un elenco leggibile dall'uomo. I riferimenti sconosciuti vengono restituiti così come sono, cosicché la UI mostri l'ID grezzo invece di nulla.
Regole RLS¶
rlsRules → [RLSRuleType!]!¶
Tutte le regole di sicurezza a livello di riga. Il repository sottostante decifra filterExpr al confine.
Prodotti dati¶
dataProducts → [DataProductType!]!¶
Tutti i prodotti dati. Richiede la capability data_product_read.
Tag¶
tags → [TagType!]!¶
Tutte le definizioni di tag, inclusi i valori di parametro permessi per ogni tag.
tagAssignments → [TagAssignmentType!]!¶
Tutte le assegnazioni di tag su origini, tabelle, colonne e relazioni.
Viste materializzate¶
mvList → [MVType!]!¶
Tutte le viste materializzate con il loro stato a runtime: abilitata/disabilitata, timestamp dell'ultimo refresh, conteggio righe, e ultimo errore.
Cache¶
cacheStats → CacheStatsType¶
Statistiche della cache. Restituisce storeType: "redis" con metriche operative complete quando Redis è configurato, storeType: "memory" per lo store fakeredis integrato, e storeType: "noop" quando non è configurata alcuna cache.
cacheTableStats → [CacheTableStatType!]!¶
Conteggi di voci in cache per tabella. Vuoto quando non è configurato alcuno store di cache.
hotTables → [HotTableStatType!]!¶
Tabelle di cui Provisa mantiene una copia, su due livelli: hot (specchiata nello store di risposta per l'inlining dei JOIN) e warm (atterrata come copia Iceberg). Una tabella è al massimo in un livello.
materializeStoreInfo → MaterializeStoreInfoType¶
Identità dello store di materializzazione durevole: nome del motore, riferimento DSN dello store, conteggio MV, e se lo store è locale all'istanza (un file locale come DuckDB o SQLite, il che significa che ogni istanza dietro un load balancer mantiene la propria copia).
Salute del sistema¶
systemHealth → SystemHealthType¶
Stato della connessione al motore, conteggi del worker pool, stato del pool DB dei metadati, modalità cache, e liveness di ogni listener di protocollo (pgwire, gRPC, Arrow Flight, Bolt).
query {
systemHealth {
engineConnected engineWorkerCount engineActiveWorkers
metadataPoolSize metadataPoolFree metadataDialect
cacheMode cacheConnected mvRefreshLoopRunning
protocols { name status port }
}
}
Task pianificati¶
scheduledTasks → [ScheduledTaskType!]!¶
Trigger pianificati da config con stato a runtime. Ogni voce porta la propria espressione cron, kind (webhook o sql), se è attualmente abilitata, il timestamp dell'ultima esecuzione (sempre null; lo tiene lo scheduler), e il prossimo orario di esecuzione pianificato da APScheduler.
Qualità dei dati¶
dqContractParse(checker: String!, contractText: String!) → DqContractType¶
Analizza il testo grezzo del contratto nelle righe modificabili del pannello builder. Chiamata a ogni modifica; un fallimento di parsing torna come error invece che come errore GraphQL, perché testo a metà scrittura è normale mentre l'operatore sta digitando.
dqCheckCatalog(checker: String!, dataset: String!) → DqCheckCatalogType¶
I controlli che checker offre, ambitoati alle colonne di dataset. Il dataset è il target osservato del contratto, risolto nello stesso modo in cui lo scanner lo risolve, cosicché i controlli offerti corrispondano alle colonne che il checker vedrà davvero.
dqCheckDefinition(checker: String!, check: DqCheckBuildInput!) → DqCheckDefinitionType¶
Il testo di un controllo dagli editor del pannello. Lato server perché il dialetto ha un'unica implementazione; un controllo creato dal builder e uno digitato a mano devono essere indistinguibili.
dqContractBuild(checker: String!, dataset: String!, checks: [DqCheckInput!]!) → DqContractTextType¶
Serializza le righe di controllo modificate in testo di contratto. L'inverso di dqContractParse. Lato server per lo stesso motivo: il pannello non può emettere testo che il checker rifiuterebbe.
Anteprime origine¶
neo4jPreview(sourceId: String!, cypher: String!) → QueryPreviewType¶
Anteprima di una proiezione Cypher su un'origine Neo4j: fino a cinque righe e i tipi di colonna che la registrazione porterà. I fallimenti tornano come error.
sparqlPreview(sourceId: String!, query: String!) → QueryPreviewType¶
Anteprima di un SELECT SPARQL su un'origine SPARQL: fino a cinque righe, tutte le colonne come testo.
Kaggle¶
kaggleTokenValid(token: String!) → Boolean!¶
Controllo live contro l'API Kaggle. Restituisce true solo quando il token si autentica. Sostiene il passo di gate del token nel modulo dell'origine Kaggle.
kaggleDatasets(token: String!, query: String = "", page: Int = 1) → [KaggleDatasetType!]!¶
Ricerca nel catalogo pubblico completo dei dataset Kaggle. Vincolata dal token.
Calendari¶
calendars → [CalendarType!]!¶
Tutte le versioni registrate di calendario dei confini di snapshot. Alimenta il selettore di configurazione dello snapshot-schedule e conferma quali calendari una MV periodica può referenziare.
Metriche¶
metrics → [MetricType!]!¶
Tutte le definizioni di metriche governate. Le metriche derivate da fact portano fromFact.
Versione schema¶
schemaVersion → String!¶
Hash SHA-256 dello stato corrente dello schema (domini, ID tabella, ID relazione). Il client Apollo legge questo dall'header di risposta X-Schema-Version e ri-recupera tutte le query attive quando avanza.
Helper IA¶
generateTableDescription(tableId: String!) → String!¶
Usa l'LLM configurato per generare una descrizione di una o due frasi per una tabella registrata. Salva prima la tabella; chiamare questo su una tabella non salvata restituisce un messaggio istruttivo.
generateColumnDescription(tableId: String!, columnName: String!) → String!¶
Usa l'LLM configurato per generare una descrizione di una frase per una singola colonna.
Richieste di creazione¶
creationRequests → [CreationRequestType!]!¶
Richieste di creazione in sospeso, visibili ai chiamanti che hanno la capacità di creazione pertinente. Usato quando un membro senza create_relationship o create_view invia una richiesta che un titolare del diritto deve approvare. Una richiesta di relazione è elencata per gli utenti il cui diritto create_relationship raggiunge il dominio della sua tabella di origine o di destinazione, e per l'utente che l'ha fatta.
Mutation¶
Origini¶
createSource(input: SourceInput!) → MutationResult¶
Registra una nuova sorgente di dati. Un id già esistente viene rifiutato (schema.source_id_taken) dopo i controlli della definizione e prima che qualcosa venga preparato o scritto; una sorgente si modifica con updateSource. Convalida la connessione prima di persistere. Una sorgente rifiutata non lascia alcuna voce nel vault. Memorizza le credenziali nel vault dell'organizzazione e registra il riferimento; il testo in chiaro non arriva mai al database. Richiede la capacità source_registration.
updateSource(input: SourceInput!) → MutationResult¶
Aggiorna i dettagli di connessione, la descrizione e la configurazione di una sorgente esistente, poi la riprovvisiona sul motore associato, ricostruisce gli schemi e riconcilia le sue tabelle atterrate, così che una sorgente salvata con un motore sia servita da quello a cui si è passati in seguito. Smonta e ricollega l'endpoint pgwire delle sorgenti file/SharePoint perché un cambio di percorso abbia effetto subito. Richiede source_registration.
deleteSource(id: String!) → MutationResult¶
Rimuove un'origine e la sua voce nel vault. Elimina il catalogo del motore e ricostruisce gli schemi.
renameSource(oldId: String!, newId: String!) → MutationResult¶
Rinomina l'id di una sorgente. Un nuovo id già posseduto da un'altra sorgente viene rifiutato (schema.source_id_taken) e non viene scritto nulla; rinominare una sorgente con il suo stesso id non cambia nulla.
updateSourceCache(sourceId: String!, cacheEnabled: Boolean!, cacheTtl: Int) → MutationResult¶
Abilita o disabilita il caching dei risultati delle query per un'origine, e imposta il TTL in secondi.
updateSourceReplicate(sourceId: String!, replicate: Int) → MutationResult¶
Stabilisce quando le tabelle di una sorgente vengono servite dalle loro repliche: null Default, -1 Never, N maggiore di 0 non appena una tabella supera N istruzioni governate per intervallo, 0 Always. Una tabella senza un valore proprio lo eredita. Rifiutato quando abbinerebbe load_protected a -1, o lascerebbe senza cache_ttl una tabella ttl che replica. Richiede source_registration.
updateSourceLoadProtection(sourceId, loadProtected, offPeakWindow, offPeakTz) → MutationResult¶
Contrassegna un'origine come protetta dal carico (solo-refresh-pianificato). Richiede almeno un gate — finestra off-peak, cadenza TTL della cache, o un segnale di cambiamento a probing — altrimenti la chiamata fallisce.
updateSourceNaming(sourceId: String!, gqlNamingConvention: String) → MutationResult¶
Imposta la convenzione di naming GraphQL per singola origine.
updateSourceAllowedDomains(sourceId: String!, allowedDomains: [String!]!) → MutationResult¶
Imposta quali domini possono usare un'origine (lista vuota = senza restrizioni). Richiede source_registration.
stageKaggleDataset(token, owner, ref, idPrefix) → KaggleStageResultType¶
Scarica e decomprime un dataset Kaggle su disco locale. Restituisce il percorso della directory in stage; il chiamante crea poi un'origine di tipo files che punta ad essa. I bundle contenenti SQLite vengono rifiutati per intero. Richiede source_registration.
refreshKaggleSource(sourceId: String!, token: String!) → MutationResult¶
Riscarica il dataset di un'origine derivata da Kaggle sul posto. Salta il download se Kaggle non ha nulla di più recente di quanto sia già su disco. Richiede source_registration.
refreshSourceStatistics(sourceId: String!) → MutationResult¶
Esegue ANALYZE su tutte le tabelle registrate per un'origine. Migliora le decisioni di ordine di join e broadcast per le query federate.
Tabelle¶
registerTable(input: TableInput!) → MutationResult¶
Registra una nuova tabella (o vista) in un dominio, con ogni impostazione che l'input porta, tra cui gqlNamingConvention, roleTtl, replicate, writeGrants, cacheTtl, pagination, region, rowRules e draft, in una transazione: se una qualsiasi viene rifiutata, non si registra nulla. Richiede la capability table_registration e l'appartenenza al dominio di destinazione; portare writeGrants richiede anche masking_config lì. Un chiamante senza create_relationship che invia una vista viene messo in coda come richiesta di creazione da far approvare a chi ha i diritti.
updateTable(input: TableInput!) → MutationResult¶
Aggiorna alias, descrizione, metadati delle colonne, impostazioni MV, configurazione di consegna live di una tabella esistente e le impostazioni che l'input porta (gqlNamingConvention, roleTtl, replicate, writeGrants, cacheTtl, pagination, region, rowRules, draft), in una transazione: se una qualsiasi viene rifiutata, non si salva nulla. Un'impostazione omessa mantiene il valore salvato. Richiede table_registration.
deleteTable(id: Int!) → MutationResult¶
Elimina una tabella registrata. Cerca il dominio della tabella per il gate di dominio prima di eliminare.
updateTableCache(tableId: Int!, cacheTtl: Int) → MutationResult¶
Sovrascrive il TTL della cache per una tabella.
updateTableReplicate(tableId: Int!, replicate: Int) → MutationResult¶
Stabilisce quando una tabella viene servita dalla sua replica. null = ereditare il valore della sorgente. Stessi valori e rifiuti di updateSourceReplicate. Richiede table_registration.
updateTableLoadProtection(tableId, loadProtected, offPeakWindow, offPeakTz) → MutationResult¶
Sovrascrive la protezione dal carico per una tabella. null per loadProtected eredita il default dell'origine. Valida la combinazione effettiva di gate (tabella → origine).
updateTableNaming(tableId: Int!, gqlNamingConvention: String) → MutationResult¶
Imposta la convenzione di naming GraphQL per singola tabella.
deployViewToDb(tableId: Int!) → MutationResult¶
Promuove una vista virtuale Provisa a una vista di database reale sulla sua origine nativa sottostante.
forceRegen(tableId: Int!, reason: String!) → MutationResult¶
Ricalcola le righe atterrate di una tabella on demand, bypassando il normale gate di cambiamento. reason è un'annotazione di audit obbligatoria. Rifiutata per tabelle federate live (nessuna riga atterrata).
invalidateFileSource(tableId: Int!) → MutationResult¶
Forza il prossimo accesso di una tabella connettore-file SQLite a ri-sincronizzare da disco.
registerEntity(input: EntityInput!) → MutationResult¶
Zucchero sintattico per registrare un'entità dimensione/hub. Si riduce a una MV (bitemporale, quando storicizzata) e chiama registerTable.
registerFact(input: FactInput!) → MutationResult¶
Zucchero sintattico per registrare un fact a schema a stella. Si riduce a una MV aggregata, crea relazioni con le dimensioni, e registra automaticamente le misure fact come metriche governate.
Relazioni¶
createRelationship(input: RelationshipInput!) → MutationResult¶
Crea una relazione. Il controllo verifica il dominio della tabella di origine (non quello della destinazione). Un arco tra domini viene memorizzato con needsReview: true. Un chiamante senza create_relationship viene messo in coda come richiesta di creazione. Gli archi di giunzione (molti-a-molti) richiedono liste di chiavi della stessa lunghezza. Rifiutato per nome, prima di scrivere qualsiasi cosa: un id già esistente (schema.relationship_id_taken); un nome di tabella che non si risolve in nessuna tabella registrata o in più di una (schema.relationship_unknown_source, _target, _junction, schema.relationship_ambiguous_table); un alias Cypher o un alias GraphQL già posseduto da un'altra relazione della stessa tabella di origine (schema.relationship_alias_taken, schema.relationship_graphql_alias_taken). Una tabella è indicata con il suo nome virtuale: il suo alias quando ne ha uno.
updateRelationship(input: RelationshipInput!) → MutationResult¶
Modifica una relazione esistente, con gli stessi controlli di createRelationship. Un id che nessuna relazione possiede viene rifiutato (schema.relationship_not_found). Una modifica richiede il diritto stesso; non viene mai messa in coda come richiesta.
Un salvataggio che ricolloca colonne chiave tra una Proprietà e una Classe può togliere loro pii. Viene allora rifiutato con tag.move_loses, e params.columns elenca ogni colonna con i tag che perde (loses) e guadagna (gains). Salvare di nuovo con confirmTagLoss che nomina ogni tag perso, o con carryTags: true per metterli sul termine verso cui va ciascuna colonna.
deleteRelationship(id: String!, confirmTagLoss: [String!], carryTags: Boolean) → MutationResult¶
Elimina una relazione per ID e ricostruisce gli schemi. Un'eliminazione che ricolloca colonne chiave accetta gli stessi confirmTagLoss e carryTags di un salvataggio.
Domini¶
createDomain(input: DomainInput!) → MutationResult¶
Crea un dominio. Un id già esistente viene rifiutato (schema.domain_id_taken). Le parole di segmento riservate (tables, relationships e altri segmenti di percorso URI) vengono rifiutate, così come il letterale jolly *. Richiede la capacità org_settings.
deleteDomain(id: String!) → MutationResult¶
Elimina un dominio. Richiede org_settings.
updateGqlNamingConvention(convention: String!) → MutationResult¶
Imposta la convenzione di naming GraphQL globale e ricostruisce gli schemi per tutti i ruoli. Vengono accettati solo nomi di convenzione riconosciuti.
Ruoli¶
createRole(input: RoleInput!) → MutationResult¶
Crea un ruolo con capacità, accesso ai domini, limiti di frequenza facoltativi e un ruolo padre facoltativo. Verifica che il padre esista e che la catena dei padri sia priva di cicli. Dopo i controlli della definizione, un id già esistente viene rifiutato (schema.role_id_taken). Richiede user_management.
updateRole(input: RoleInput!) → MutationResult¶
Modifica un ruolo esistente, con gli stessi controlli di createRole. Un id che nessun ruolo possiede viene rifiutato (schema.role_not_found). Ridefinire un ruolo è un atto in ogni dominio che raggiunge.
deleteRole(id: String!) → MutationResult¶
Elimina un ruolo. Fallisce se altri ruoli ereditano da esso; ri-assegnali prima a un nuovo padre. Richiede user_management.
Regole RLS¶
upsertRlsRule(input: RLSRuleInput!) → MutationResult¶
Crea o aggiorna una regola di sicurezza a livello di riga. L'espressione di filtro viene validata al momento del salvataggio contro le colonne della tabella o del dominio di destinazione, cosicché una regola che l'admin non può interrogare venga rifiutata con la ragione invece di fallire silenziosamente al momento della query. Richiede masking_config.
I target sono mutuamente esclusivi: imposta tableId per una regola a livello di tabella, domainId per una regola a livello di dominio, o actionName per una funzione/webhook tracciato.
deleteRlsRule(roleId, tableId, domainId, actionName) → MutationResult¶
Elimina una regola RLS. Richiede masking_config.
Prodotti dati¶
createDataProduct(input: DataProductInput!) → MutationResult¶
Crea un prodotto dati. Un id già esistente viene rifiutato (schema.data_product_id_taken). Richiede la capacità data_product_rw.
updateDataProduct(input: DataProductInput!) → MutationResult¶
Modifica un prodotto dati esistente. Un id che nessun prodotto possiede viene rifiutato (schema.data_product_not_found). Richiede data_product_rw.
deleteDataProduct(id: String!) → MutationResult¶
Elimina un prodotto dati. Richiede data_product_rw.
Tag¶
createTag(input: TagInput!) → MutationResult¶
Crea una definizione di tag. Un id già esistente viene rifiutato (schema.tag_id_taken). I tag di sistema e i tag derivati non possono essere ridefiniti. appliesTo deve essere un sottoinsieme non vuoto di ["source", "table", "column", "relationship", "command"].
updateTag(input: TagInput!) → MutationResult¶
Modifica una definizione di tag esistente, con gli stessi controlli di createTag. Un id che nessun tag possiede viene rifiutato (schema.tag_not_found).
deleteTag(id: String!) → MutationResult¶
Elimina un tag. Rifiuta i tag di sistema e derivati.
assignTag(input: TagAssignmentInput!) → MutationResult¶
Assegna un tag a una sorgente, tabella, colonna, relazione o comando. Applica le politiche di campo del tag (reason_policy, expires_policy) e, per un tag parametrizzato, controlla il valore del parametro rispetto all'elenco consentito del tag.
pii può andare anche su un termine del glossario, così ogni colonna con quel significato porta il tag, comprese le colonne registrate in seguito. Impostare objectType: "term" e termId:
mutation { assignTag(input: {tagId: "pii", objectType: "term", termId: 12}) { success code params } }
Su una colonna, alsoTerm: true mette invece il tag sul termine della colonna. params.covers nel risultato dice quante colonne raggiunge il tag: per una colonna, quante altre colonne ha il suo termine; per un termine, quante ne ha. Rifiutati per nome: un tag diverso da pii su un termine (tag.not_on_terms), un termine che non è una Proprietà (tag.term_not_property), un termine in bozza (tag.term_not_live, «Definisci termine per contrassegnarlo») e, con alsoTerm, una colonna chiave (tag.key_column) o una colonna senza termine (tag.column_has_no_term). Una colonna contrassegnata direttamente richiede un motivo.
unassignTag(input: TagAssignmentInput!) → MutationResult¶
Rimuove un'assegnazione di tag, anche da un termine (objectType: "term", termId). Rimuovere pii da una colonna che lo porta tramite il suo termine viene rifiutato (tag.inherited_from_term): togliere il contrassegno dal termine, o spostare la colonna su un termine che corrisponde a ciò che contiene.
upsertTagParamValue(input: TagParamValueInput!) → MutationResult¶
Aggiunge o ridescrive un valore di parametro permesso per un tag parametrizzato. La lista dei valori permessi è chiusa: ogni assegnazione deve nominare un valore da essa.
deleteTagParamValue(tagId: String!, value: String!) → MutationResult¶
Rimuove un valore permesso. Rifiutato mentre qualche assegnazione lo porta ancora, perché quelle assegnazioni nominerebbero un tipo che la lista non ammette più.
Metriche¶
createMetric(input: MetricInput!) → MutationResult¶
Crea una definizione di metrica governata. Un nome già esistente viene rifiutato (schema.metric_name_taken). L'espressione deve essere analizzabile da sqlglot e contenere almeno una funzione di aggregazione. Rigenera tutte le viste composte da metriche che fanno riferimento a questa metrica. Richiede table_registration.
updateMetric(input: MetricInput!) → MutationResult¶
Sostituisce la definizione di una metrica esistente, con gli stessi controlli di createMetric. Un nome che nessuna metrica possiede viene rifiutato (schema.metric_not_found). Salvarla richiede i domini della nuova espressione e della definizione che sostituisce.
deleteMetric(name: String!) → MutationResult¶
Elimina una metrica governata. Ricostruisce gli schemi. Richiede table_registration.
Calendari¶
createCalendar(input: CalendarInput!) → MutationResult¶
Crea o sostituisce un calendario versionato dei confini di snapshot. Validato costruendo il Calendar in memoria prima di persistere. Fallisce su un sistema base sconosciuto, un fuso orario errato, o un'ancora fiscale errata.
deleteCalendar(name: String!) → MutationResult¶
Elimina un calendario (tutte le versioni). Rifiutato quando qualche vista materializzata lo referenzia.
Viste materializzate¶
refreshMv(mvId: String!) → MutationResult¶
Attiva un refresh manuale di una vista materializzata. Coordina tra la flotta quando la modalità di consistenza MV è shared.
toggleMv(mvId: String!, enabled: Boolean!) → MutationResult¶
Abilita o disabilita una vista materializzata.
Cache¶
purgeCache → MutationResult¶
Svuota tutti i risultati di query in cache.
purgeCacheByTable(tableId: Int!) → MutationResult¶
Svuota i risultati in cache per una tabella.
Task pianificati¶
createScheduledTask(id, name, cron, kind, webhookName, argsJson, sql) → MutationResult¶
Crea un trigger pianificato — una chiamata webhook o un'istruzione SQL — e lo registra live in APScheduler. kind è "webhook" o "sql".
deleteScheduledTask(taskId: String!) → MutationResult¶
Rimuove un trigger pianificato dalla config e dallo scheduler live.
toggleScheduledTask(taskId: String!, enabled: Boolean!) → MutationResult¶
Abilita o disabilita un task pianificato nel file di config.
Qualità dei dati¶
dryRunDqContract(sourceId: String!, contractText: String!) → DqDryRunType¶
Esegue un contratto contro la tabella live e restituisce gli esiti senza atterrare nulla. Una mutation piuttosto che una query perché costa una scansione reale. Ciò che dimostra è se l'identificatore del dataset si risolve nella tabella governata che l'operatore intende.
runDqCheckNow(schemaName: String!, tableName: String!) → MutationResult¶
Attiva immediatamente il job di polling di una tabella checker. Atterra le righe nel modo normale, cosicché i risultati persistano e la cronologia DQ mostri la nuova scansione.
Manutenzione dello schema¶
rebuildSchemas → MutationResult¶
Ricostruisce lo schema in memoria dallo stato del database. Utile dopo modifiche esterne al database.
Richieste di creazione¶
approveCreationRequest(requestId: Int!) → MutationResult¶
Approva una richiesta di creazione: la stessa regola, gli stessi rifiuti e le stesse voci del registro di amministrazione di POST /admin/creation-requests/{id}/approve. Il richiedente non può approvare la propria richiesta e l'approvazione di un utente conta una volta. L'approvazione che completa il conteggio della richiesta crea ciò che chiede; params.status è executed quando è stata questa, altrimenti pending, e params.waitingOn elenca i domini che una richiesta di relazione attende ancora.
executeCreationRequest(requestId: Int!) → MutationResult¶
Esegue una richiesta di creazione che ha ottenuto le sue approvazioni — relazione, vista, tabella, sorgente o webhook — tramite il codice che usa la mutazione diretta. Rifiutata con requests.approvals_incomplete finché le approvazioni richieste (una, o due per una relazione) non sono raggiunte da utenti diversi dal richiedente; una richiesta di relazione è rifiutata anche con requests.waiting_on_domains finché un dominio che tocca non ha un approvatore. Le approvazioni si danno tramite POST /admin/creation-requests/{id}/approve, e l'approvazione che completa il conteggio esegue la creazione, quindi questa mutazione serve a ritentare una creazione fallita. Una creazione fallita lascia la richiesta in sospeso e risponde con il codice proprio del fallimento.
rejectCreationRequest(requestId: Int!, reason: String!) → MutationResult¶
Rifiuta una richiesta in coda con un motivo utilizzabile. reason è obbligatorio. Una richiesta di relazione può essere rifiutata da qualsiasi utente che potrebbe approvarla. L'autore di una richiesta di qualsiasi altro tipo può ritirarla; ciò viene registrato nel registro di amministrazione come ritiro.
Compilazione query¶
compileQuery(input: CompileQueryInput!) → [CompileQueryResult!]!¶
Compila una query GraphQL data-plane contro lo schema di un ruolo e restituisce la decisione di routing completa: SQL semantico, SQL motore, SQL diretto, route, metadati di enforcement (filtri RLS applicati, colonne escluse, mascheramento applicato), e Cypher compilato. Restituisce un risultato per ogni campo root nella query.
mutation {
compileQuery(input: {
role: "analyst"
query: "{ orders { id customer_id total } }"
}) {
sql
semanticSql
engineSql
route
routeReason
enforcement {
rlsFiltersApplied
columnsExcluded
maskingApplied
}
}
}
Campi di CompileQueryInput:
| Campo | Tipo | Descrizione |
|---|---|---|
query |
String! |
Query GraphQL data-plane da compilare |
role |
String! |
Ruolo contro il cui schema compilare |
variables |
JSON |
Binding delle variabili |
flatSql |
Boolean |
Restituisce un'unica stringa SQL appiattita invece di una coppia semantica/motore |
flatCypher |
Boolean |
Appiattisce l'output Cypher |
nodeOnlyCypher |
Boolean |
Emette Cypher solo-nodi (nessun pattern di arco) |
Tipi di input chiave¶
SourceInput¶
| Campo | Tipo | Note |
|---|---|---|
id |
String! |
Identificatore dell'origine |
type |
String! |
Tipo di connettore (es. postgres, files, openapi) |
host |
String |
|
port |
Int |
|
database |
String |
|
username |
String |
|
password |
String |
Testo in chiaro o riferimento ${secret:NAME} |
path |
String |
Percorso filesystem per origini file/CSV |
federationHintsJson |
String |
Oggetto JSON per gli extra warehouse (warehouse/role di Snowflake, http_path di Databricks) |
changeSignal |
String |
ttl | probe | ttl_probe |
loadProtected |
Boolean |
Solo-refresh-pianificato |
offPeakWindow |
String |
Finestra di manutenzione HH:MM-HH:MM |
offPeakTz |
String |
Fuso orario IANA |
cdc |
SourceCdcConfigInput |
Configurazione del trasporto Kafka CDC, incluso il modo di raggiungere il suo schema registry (vedere Autenticazione dello schema registry). schemaRegistryPassword e schemaRegistryToken vengono restituiti come riferimenti del vault, mai come credenziali. |
TableInput¶
L'input principale di registrazione tabella. Campi chiave oltre alle basi:
| Campo | Note |
|---|---|
materialize |
Atterra una copia nello store di materializzazione |
mvRefreshInterval |
Secondi tra i refresh |
mvPersist |
replace | append | upsert |
mvIncremental |
Manutenzione incrementale |
mvHoldOnFailingChecks |
Sospendi se i controlli falliscono: un aggiornamento viene annullato, e la vista mantiene la copia precedente, finché una tabella di controllo che analizza uno dei suoi input è fallita all'ultima esecuzione |
businessKey |
Colonne che identificano la stessa cosa tra le versioni; dichiarata con validTime e recordedTime, tutte e tre o nessuna |
validTime |
Colonna con la data che l'azienda dà al record |
recordedTime |
Colonna con il momento in cui questa versione è stata inserita o modificata |
mvCalendar |
Nome del calendario snapshot |
mvGrain |
Grana dello snapshot: daily, weekly, monthly, annual, o custom 3WE / LFR |
viewSql |
SQL per una vista derivata |
viewMetrics |
Spec dichiarativa di vista composta da metriche — mutuamente esclusiva con viewSql |
dqContract |
Testo di contratto di qualità dei dati YAML/JSON |
queryTemplate |
Cypher per una tabella Neo4j |
live |
Config di live-delivery per push SSE/Kafka |
discover |
Inferisce le colonne dall'origine live al momento della registrazione |
gqlNamingConvention |
Convenzione di denominazione GraphQL della tabella; null eredita. Omessa, una nuova tabella eredita e un aggiornamento mantiene quella salvata |
roleTtl |
L'intero elenco da ruolo a TTL, [{ role, ttl }] |
replicate |
Quando la tabella è servita dalla sua replica; null eredita il valore della sorgente |
writeGrants |
L'intero insieme dei permessi di scrittura della tabella; richiede masking_config |
draft |
false rilascia la tabella; altrimenti una registrazione inizia come bozza |
cacheTtl |
Il Cache TTL proprio della tabella; null non ne ha uno proprio |
pagination |
La paginazione dichiarata della tabella; null non ne dichiara |
region |
Dove vivono i dati della tabella; in un aggiornamento un'altra regione la sposta, giudicata come la giudica setTableRegion |
rowRules |
Regole di riga della tabella (RLSRuleInput), salvate con essa; richiede masking_config |
RelationshipInput¶
| Campo | Note |
|---|---|
id |
Identificatore della relazione |
sourceTableId |
Nome tabella virtuale (alias se impostato, altrimenti nome tabella) |
targetTableId |
Nome tabella virtuale; vuoto per relazioni calcolate |
sourceColumn |
Colonna di join sul lato origine |
targetColumn |
Colonna di join sul lato destinazione |
cardinality |
one-to-one | one-to-many | many-to-one | many-to-many |
alias |
Etichetta arco Cypher (es. WORKS_FOR) |
graphqlAlias |
Nome campo GraphQL sul tipo origine |
viaTable |
Nome tabella junction per archi molti-a-molti |
recordCandidate |
Scrive anche una riga relationship_candidates accepted |
Esempio: registrare una tabella¶
mutation {
registerTable(input: {
sourceId: "sales-pg"
domainId: "sales"
schemaName: "public"
tableName: "orders"
alias: "orders"
columns: [
{ name: "id", visibleTo: ["public"], isPrimaryKey: true }
{ name: "customer_id", visibleTo: ["public"] }
{ name: "total", visibleTo: ["public"] }
]
}) {
success
message
code
}
}