Справочник Admin GraphQL API¶
Административный GraphQL API — это плоскость конфигурации Provisa. Это API, который вызывает административное веб-приложение для каждой операции управления — создания источников, регистрации таблиц, определения связей, настройки правил RLS и всего остального, что формирует модель.
Точка подключения: POST /admin/graphql
Это не тот же API, что и плоскость данных на /data/graphql. Плоскость данных обслуживает запросы конечных пользователей по зарегистрированным доменам и описывается SDL по адресу /data/sdl. Административный API настраивает то, как выглядит эта схема и кто что может видеть.
Как интерфейс взаимодействует с этим API¶
Административное веб-приложение использует Apollo Client, направленный на ${API_BASE}/admin/graphql. [tool-verified: provisa-ui/src/apolloClient.ts:19]
Каждый запрос несёт bearer-токен (получаемый заново от провайдера авторизации при каждом вызове), заголовок X-Org-Id при многоарендности и заголовок X-Env, когда обслуживается окружение-ветка. [tool-verified: provisa-ui/src/apolloClient.ts:24-42]
Схема собирается из двух классов @strawberry.type — Query из schema_query.py и Mutation из schema_mutation.py — и оборачивается в ModelCommitExtension, который записывает каждую мутацию против текущей ветки окружения (REQ-1524). [tool-verified: provisa/api/admin/schema.py:44]
Авторизация¶
Режим разработки: когда авторизация не настроена и каждый запрос приходит как анонимный принципал, все проверки возможностей пропускаются. Это сохраняет функциональность локальной установки без настройки авторизации. [tool-verified: provisa/api/admin/capabilities.py:98-99]
Шлюзы возможностей: производственные развёртывания применяют именованные возможности. Конкретное право, требуемое каждым полем, отмечено inline. Вызов мутации без требуемой возможности вызывает PermissionError. Роль администратора платформы обходит все проверки возможностей (REQ-1297). [tool-verified: provisa/api/admin/capabilities.py:80-110]
Доменные шлюзы: несколько мутаций также проверяют домен, которому принадлежит объект. Вызывающий, ограниченный доменом sales, не может зарегистрировать таблицу в finance, поставить в очередь правило RLS для неё или создать связь, чья исходная таблица находится в домене, которым он не владеет (REQ-1530, REQ-1531). Представления ограничены дополнительно: каждая таблица, которую читает SQL представления, должна находиться в пределах доменов вызывающего, потому что иначе произвольный SQL даёт участнику доступ к данным вне его области. [tool-verified: provisa/api/admin/domain_guard.py:1-133]
Наследование ролей: возможности родительской роли наследуются дочерними ролями (REQ-1677). createRole и deleteRole отклоняют циклы и не позволяют удалить роль, у которой есть наследники.
Общий тип возврата¶
Большинство мутаций возвращают MutationResult. [tool-verified: provisa/api/admin/types.py:1181-1188]
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 (REQ-1350)
}
Когда мутация завершается неудачей, success равен false, а message несёт причину на английском языке. code — это стабильный идентификатор, который интерфейс использует для отображения локализованного сообщения.
Запросы (Queries)¶
Источники¶
sources → [SourceType!]!¶
Все зарегистрированные источники данных. [tool-verified: provisa/api/admin/schema_query.py:327-331]
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 — это ссылка ${secret:NAME} в хранилище секретов организации — никогда не буквальные учётные данные. [tool-verified: provisa/api/admin/types.py:105]
source(id: String!) → SourceType¶
Один источник по ID. Возвращает null, если не найден. [tool-verified: provisa/api/admin/schema_query.py:334-339]
availableSchemas(sourceId: String!) → [String!]!¶
Схемы, видимые в источнике, отфильтрованные для исключения внутренних для Provisa. Сначала использует нативную интроспекцию; при отсутствии прямого пула у типа источника переходит на каталог движка. [tool-verified: provisa/api/admin/schema_query.py:628-667]
availableTables(sourceId: String!, schemaName: String = "public") → [AvailableTableType!]!¶
Таблицы в одной схеме источника вместе с их комментариями. Для источников OpenAPI возвращает GET-операции, чей ответ представляет собой массив или обёртку пагинации. Для источников GraphQL возвращает поля запросов, возвращающие список. Для gRPC возвращает серверные потоковые RPC. [tool-verified: provisa/api/admin/schema_query.py:669-731]
availableColumns(sourceId: String!, schemaName: String!, tableName: String!) → [String!]!¶
Имена столбцов таблицы в каталоге движка. Для источников govdata использует отдельный резолвер. [tool-verified: provisa/api/admin/schema_query.py:845-866]
availableColumnsMetadata(sourceId: String!, schemaName: String!, tableName: String!) → [AvailableColumnType!]!¶
Имена столбцов с типами данных, комментариями, типами нативных фильтров и флагами первичного ключа. Для источников OpenAPI выводит форму из схемы ответа и параметров операции. [tool-verified: provisa/api/admin/schema_query.py:869-876]
availableFunctions(sourceId: String!, schemaName: String = "openapi") → [AvailableTableType!]!¶
Операции, отличные от GET, для источника OpenAPI (POST, PUT, PATCH, DELETE). Возвращает пустой список для источников, отличных от OpenAPI. [tool-verified: provisa/api/admin/schema_query.py:822-843]
crawlSource(path, depth, pattern, recursive, simpleLinks, sameDomain, excludePattern) → CrawlResultType¶
Предпросмотр того, что обнаружил бы обход файлового коннектора — файлы, таблицы и столбцы — до создания источника. Настройки, специфичные для HTTP (simpleLinks, sameDomain, excludePattern), игнорируются для локальных, S3, FTP и SFTP корней. (REQ-1785) [tool-verified: provisa/api/admin/schema_query.py:733-790]
suggestTableAlias(tableName: String!, domainId: String!, sourceId: String!) → String!¶
Возвращает псевдоним для использования при регистрации tableName в domainId из sourceId. Возвращает обычный псевдоним в snake-case, если конфликта нет, или псевдоним с префиксом источника (sqlite_b_orders), если эффективное имя уже занято другим источником в том же домене. [tool-verified: provisa/api/admin/schema_query.py:879-922]
Таблицы¶
tables → [RegisteredTableType!]!¶
Все зарегистрированные таблицы, каждая с полным списком столбцов. Видимость столбцов в ответе учитывает возможность вызывающего table_registration — canDeployToDb зависит от того, обладает ли вызывающий этим правом. (REQ-016, REQ-021, REQ-042) [tool-verified: provisa/api/admin/schema_query.py:502-536]
Каждый RegisteredTableType предоставляет вычисляемые вложенные поля:
refreshPolicySummary → RefreshPolicySummaryType— эффективная политика обновления/обслуживания в виде обычного текста, выведенная на сервере из того же разрешения планировщика, которое использует движок. Возвращаетnullво время запуска. (REQ-1143) [tool-verified:provisa/api/admin/types.py:319-327]graphqlFieldName → String— имя поля, которое эта таблица имеет в скомпилированной схеме плоскости данных, чтобы панель продукта данных могла построить работающий пример без дублирования алгоритма именования. (REQ-1634) [tool-verified:provisa/api/admin/types.py:330-339]dqDataset → String— эта таблица как набор данных контракта качества данных, в форме, которую сканирует проверяющий. (REQ-1443) [tool-verified:provisa/api/admin/types.py:374-387]productId → String— продукт данных, которому принадлежит эта таблица. Таблица-проверка DQ наследует продукт таблицы, которую сканирует её контракт. (REQ-1634) [tool-verified:provisa/api/admin/types.py:342-372]
refreshPolicyPreview(...) → RefreshPolicySummaryType¶
Предпросмотр эффективной сводки обновления/обслуживания для черновых (несохранённых) настроек таблицы, чтобы сводка вверху формы обновлялась по мере изменения полей без сохранения чего-либо. Тот же вывод, что и refreshPolicySummary выше. (REQ-1143) [tool-verified: provisa/api/admin/schema_query.py:947-979]
Аргументы: sourceId, domainId, schemaName, tableName, cacheTtl, replicate, loadProtected, offPeakWindow, offPeakTz, changeSignal.
columnDependents(tableId: String!, renamed: [String!], removed: [String!]) → [ColumnDependentsType!]!¶
Артефакты, которые сломало бы ожидающее переименование псевдонима или удаление столбца. Рекомендательный характер — административный интерфейс показывает это перед сохранением, а решение принимает администратор. Должен вызываться до сохранения, потому что зависимые объекты были созданы против имени столбца, которое он несёт в данный момент. (REQ-1484) [tool-verified: provisa/api/admin/schema_query.py:1301-1331]
Связи¶
relationships → [RelationshipType!]!¶
Все связи, определённые пользователем (исключает автоматически сгенерированные записи gql_auto__ и синтетические записи meta:%, используемые ERD). [tool-verified: provisa/api/admin/schema_query.py:539-569]
allRelationships → [RelationshipType!]!¶
То же, что и relationships, но включает синтетические записи meta:%. Используется графовой ERD, которой нужно показать каждое ребро, включая неявные связи HAS_TABLE между таблицами данных и реестром метаданных. [tool-verified: provisa/api/admin/schema_query.py:572-601]
Каждый RelationshipType предоставляет:
autoSuggested → Boolean— была ли связь предложена анализом внешних ключей (idначинается сfk__). [tool-verified:provisa/api/admin/types.py:523-525]physicalName → String— имя связи на плоскостях SQL и gRPC (параметр?include=). Выводится на сервере; клиенты не должны транслитерировать псевдоним GraphQL. (REQ-471, REQ-1417) [tool-verified:provisa/api/admin/types.py:527-536]
Домены, роли и пользователи¶
domains → [DomainType!]!¶
Все домены в базе данных тенанта активной организации. База данных тенанта изолирована на уровне схемы, поэтому список доменов администратора организации содержит только строки его организации. (REQ-021, REQ-042, REQ-1293) [tool-verified: provisa/api/admin/schema_query.py:342-357]
roles → [RoleType!]!¶
Роли, видимые вызывающему. Администратор видит каждую роль; не-администратор видит только роли без org_id или роли, принадлежащие его организации. (REQ-042, REQ-059, REQ-060, REQ-215) [tool-verified: provisa/api/admin/schema_query.py:603-618]
resolveOwners(refs: [String!]!) → [UserSummaryType!]!¶
Разрешает идентификаторы ролей или пользователей в отдельных пользователей. Используется для раскрытия DataProduct.ownerRole, Domain.steward и Column.visibleTo в человекочитаемый список. Неизвестные ссылки возвращаются как есть, поэтому интерфейс показывает исходный ID, а не ничего. [tool-verified: provisa/api/admin/schema_query.py:388-444]
Правила RLS¶
rlsRules → [RLSRuleType!]!¶
Все правила безопасности на уровне строк. Базовый репозиторий расшифровывает filterExpr на границе. (REQ-041, REQ-402, REQ-686) [tool-verified: provisa/api/admin/schema_query.py:621-625]
Продукты данных¶
dataProducts → [DataProductType!]!¶
Все продукты данных. Требует возможность data_product_read. (REQ-1634) [tool-verified: provisa/api/admin/schema_query.py:360-386]
Теги¶
tags → [TagType!]!¶
Все определения тегов, включая допустимые значения параметров для каждого тега. (REQ-1373, REQ-1467) [tool-verified: provisa/api/admin/schema_query.py:447-475]
tagAssignments → [TagAssignmentType!]!¶
Все назначения тегов по источникам, таблицам, столбцам и связям. (REQ-1377) [tool-verified: provisa/api/admin/schema_query.py:478-499]
Материализованные представления¶
mvList → [MVType!]!¶
Все материализованные представления с их состоянием во время выполнения: включено/выключено, метка времени последнего обновления, количество строк и последняя ошибка. [tool-verified: provisa/api/admin/schema_query.py:927-944]
Кеш¶
cacheStats → CacheStatsType¶
Статистика кеша. Возвращает storeType: "redis" с полными операционными метриками, когда настроен Redis, storeType: "memory" для встроенного хранилища fakeredis и storeType: "noop", когда кеш не настроен. [tool-verified: provisa/api/admin/schema_query.py:1106-1140]
cacheTableStats → [CacheTableStatType!]!¶
Количество кешированных записей на таблицу. Пусто, когда хранилище кеша не настроено. [tool-verified: provisa/api/admin/schema_query.py:1143-1148]
hotTables → [HotTableStatType!]!¶
Таблицы, копию которых Provisa хранит, в двух уровнях: hot (отражена в хранилище ответов для встраивания в JOIN) и warm (приземлена как копия Iceberg). Таблица находится не более чем в одном уровне (REQ-241). [tool-verified: provisa/api/admin/schema_query.py:1151-1175]
materializeStoreInfo → MaterializeStoreInfoType¶
Идентификация устойчивого хранилища материализации: имя движка, ссылка DSN хранилища, количество MV и является ли хранилище локальным для экземпляра (локальный файл, такой как DuckDB или SQLite, что означает, что каждый экземпляр за балансировщиком нагрузки хранит собственную копию). [tool-verified: provisa/api/admin/schema_query.py:1178-1189]
Состояние системы¶
systemHealth → SystemHealthType¶
Состояние подключения движка, количество рабочих процессов, состояние пула БД метаданных, режим кеша и активность каждого слушателя протокола (pgwire, gRPC, Arrow Flight, Bolt). [tool-verified: provisa/api/admin/schema_query.py:1194-1198]
query {
systemHealth {
engineConnected engineWorkerCount engineActiveWorkers
metadataPoolSize metadataPoolFree metadataDialect
cacheMode cacheConnected mvRefreshLoopRunning
protocols { name status port }
}
}
Запланированные задачи¶
scheduledTasks → [ScheduledTaskType!]!¶
Запланированные триггеры из конфигурации вместе с состоянием во время выполнения. Каждая запись несёт своё cron-выражение, kind (webhook или sql), включена ли она в данный момент, метку времени последнего запуска (всегда null в этом релизе — отслеживается планировщиком) и время следующего запланированного запуска от APScheduler. [tool-verified: provisa/api/admin/schema_query.py:1203-1245]
Качество данных¶
dqContractParse(checker: String!, contractText: String!) → DqContractType¶
Разбор необработанного текста контракта в редактируемые строки панели построителя. Вызывается при каждом редактировании; сбой разбора возвращается как error, а не как ошибка GraphQL, потому что наполовину написанный текст — обычное явление, пока оператор печатает. (REQ-1443, пункт 7) [tool-verified: provisa/api/admin/schema_query.py:1007-1022]
dqCheckCatalog(checker: String!, dataset: String!) → DqCheckCatalogType¶
Проверки, которые предлагает checker, ограниченные столбцами dataset. Набор данных — это наблюдаемая цель контракта, разрешаемая тем же способом, каким её разрешает сканер, — поэтому предлагаемые проверки соответствуют столбцам, которые проверяющий реально увидит. (REQ-1443, пункт 7) [tool-verified: provisa/api/admin/schema_query.py:1025-1050]
dqCheckDefinition(checker: String!, check: DqCheckBuildInput!) → DqCheckDefinitionType¶
Текст одной проверки из редакторов панели. На стороне сервера, потому что у диалекта одна реализация; проверка, созданная построителем, и введённая вручную должны быть неотличимы. (REQ-1443, пункт 7) [tool-verified: provisa/api/admin/schema_query.py:1053-1075]
dqContractBuild(checker: String!, dataset: String!, checks: [DqCheckInput!]!) → DqContractTextType¶
Сериализация отредактированных строк проверок обратно в текст контракта. Обратная операция для dqContractParse. На стороне сервера по той же причине: панель не может выдать текст, который проверяющий отклонит. (REQ-1443, пункт 7) [tool-verified: provisa/api/admin/schema_query.py:1078-1101]
Предпросмотры источников¶
neo4jPreview(sourceId: String!, cypher: String!) → QueryPreviewType¶
Предпросмотр проекции Cypher на источнике Neo4j: до пяти строк и типы столбцов, которые понесёт регистрация. Сбои возвращаются как error. (REQ-1670) [tool-verified: provisa/api/admin/schema_query.py:984-992]
sparqlPreview(sourceId: String!, query: String!) → QueryPreviewType¶
Предпросмотр SPARQL SELECT на источнике SPARQL: до пяти строк, все столбцы как текст. (REQ-1683) [tool-verified: provisa/api/admin/schema_query.py:995-1002]
Kaggle¶
kaggleTokenValid(token: String!) → Boolean!¶
Живая проверка против API Kaggle. Возвращает true, только когда токен аутентифицируется. Обеспечивает шаг проверки токена в форме источника Kaggle. (REQ-1783) [tool-verified: provisa/api/admin/schema_query.py:793-799]
kaggleDatasets(token: String!, query: String = "", page: Int = 1) → [KaggleDatasetType!]!¶
Поиск по полному публичному каталогу наборов данных Kaggle. Доступ по токену. (REQ-1783) [tool-verified: provisa/api/admin/schema_query.py:802-819]
Календари¶
calendars → [CalendarType!]!¶
Все зарегистрированные версии календарей границ снимков. Питает выбор конфигурации расписания снимков и подтверждает, какие календари может использовать периодическое MV. (REQ-962) [tool-verified: provisa/api/admin/schema_query.py:218-242]
Метрики¶
metrics → [MetricType!]!¶
Все управляемые определения метрик. Метрики, выведенные из фактов, несут fromFact. (REQ-1317, REQ-1320) [tool-verified: provisa/api/admin/schema_query.py:245-264]
Версия схемы¶
schemaVersion → String!¶
Хеш SHA-256 текущего состояния схемы (домены, идентификаторы таблиц, идентификаторы связей). Клиент Apollo читает это из заголовка ответа X-Schema-Version и повторно выполняет все активные запросы, когда версия продвигается. [tool-verified: provisa/api/admin/schema_query.py:291-324]
Помощники ИИ¶
generateTableDescription(tableId: String!) → String!¶
Использовать настроенную LLM для генерации описания из одного-двух предложений для зарегистрированной таблицы. Сначала сохраните таблицу; вызов этого для несохранённой таблицы возвращает инструктивное сообщение. [tool-verified: provisa/api/admin/schema_query.py:1250-1298]
generateColumnDescription(tableId: String!, columnName: String!) → String!¶
Использовать настроенную LLM для генерации описания из одного предложения для отдельного столбца. [tool-verified: provisa/api/admin/schema_query.py:1334-1383]
Запросы на создание¶
creationRequests → [CreationRequestType!]!¶
Ожидающие запросы на создание, видимые вызывающим, у которых есть соответствующая возможность создания. Используется, когда участник без create_relationship или create_view отправляет запрос, который должен одобрить обладатель права. Запрос на связь показывается пользователям, чьё право create_relationship достигает домена её исходной или целевой таблицы, и пользователю, который его сделал. (REQ-434, REQ-063, REQ-1948) [tool-verified: provisa/api/admin/schema_query.py:371-420]
Мутации¶
Источники¶
createSource(input: SourceInput!) → MutationResult¶
Регистрирует новый источник данных. Уже существующий id отклоняется (schema.source_id_taken) после проверок определения и до того, как что-либо подготовлено или записано; источник изменяется через updateSource. Проверяет подключение перед сохранением — отклонённый источник не оставляет записи в хранилище. Хранит учётные данные в хранилище организации и записывает ссылку; открытый текст никогда не попадает в базу данных. (REQ-012, REQ-013) Требует возможности source_registration. [tool-verified: provisa/api/admin/schema_mutation.py:616-781]
updateSource(input: SourceInput!) → MutationResult¶
Обновляет параметры подключения, описание и конфигурацию существующего источника, затем заново подготавливает его на привязанном движке, пересобирает схемы и согласует его загруженные таблицы, так что источник, сохранённый при одном движке, обслуживается движком, на который переключились позже (REQ-1730). Отключает и заново подключает endpoint pgwire для источников файлов/SharePoint, чтобы изменение пути вступило в силу сразу. Требует source_registration. [tool-verified: provisa/api/admin/schema_mutation.py:922-1073]
deleteSource(id: String!) → MutationResult¶
Удалить источник и его запись в хранилище секретов. Удаляет каталог движка и перестраивает схемы. [tool-verified: provisa/api/admin/schema_mutation.py:1101-1132]
renameSource(oldId: String!, newId: String!) → MutationResult¶
Переименовывает id источника. Новый id, которым владеет другой источник, отклоняется (schema.source_id_taken), и ничего не записывается; переименование источника в его собственный id ничего не меняет. [tool-verified: provisa/core/repositories/source.py rename]
updateSourceCache(sourceId: String!, cacheEnabled: Boolean!, cacheTtl: Int) → MutationResult¶
Включить или отключить кеширование результатов запросов для источника и задать TTL в секундах. [tool-verified: provisa/api/admin/schema_mutation.py:2327-2350]
updateSourceReplicate(sourceId: String!, replicate: Int) → MutationResult¶
Задаёт, когда таблицы источника обслуживаются из их реплик: null Default, -1 Never, N больше 0 — как только таблица превысит N регулируемых инструкций за интервал, 0 Always. Таблица без собственного значения наследует его. Отклоняется, если сочетало бы load_protected с -1 или оставило бы без cache_ttl таблицу ttl, которую реплицирует. Требует source_registration. (REQ-826, REQ-1907) [tool-verified: provisa/api/admin/schema_mutation.py update_source_replicate]
updateSourceLoadProtection(sourceId, loadProtected, offPeakWindow, offPeakTz) → MutationResult¶
Пометить источник как защищённый от нагрузки (только по расписанию обновления). Требует хотя бы один шлюз — окно вне пиковых часов, периодичность TTL кеша или зондирующий сигнал изменения — иначе вызов завершается неудачей. (REQ-1141) [tool-verified: provisa/api/admin/schema_mutation.py:2431-2480]
updateSourceNaming(sourceId: String!, gqlNamingConvention: String) → MutationResult¶
Задать соглашение об именовании GraphQL для отдельного источника. [tool-verified: provisa/api/admin/schema_mutation.py:2595-2619]
updateSourceAllowedDomains(sourceId: String!, allowedDomains: [String!]!) → MutationResult¶
Задать, какие домены могут использовать источник (пустой список = без ограничений). Требует source_registration. (REQ-1531) [tool-verified: provisa/api/admin/schema_mutation.py:2622-2658]
stageKaggleDataset(token, owner, ref, idPrefix) → KaggleStageResultType¶
Скачать и распаковать набор данных Kaggle на локальный диск. Возвращает путь к подготовленному каталогу; затем вызывающая сторона создаёт один источник типа files, указывающий на него. Пакеты, несущие SQLite, отклоняются целиком. Требует source_registration. (REQ-1780–1782) [tool-verified: provisa/api/admin/schema_mutation.py:784-824]
refreshKaggleSource(sourceId: String!, token: String!) → MutationResult¶
Повторно получить набор данных источника, производного от Kaggle, на месте. Пропускает загрузку, если у Kaggle нет ничего новее того, что уже на диске. Требует source_registration. (REQ-1787) [tool-verified: provisa/api/admin/schema_mutation.py:827-920]
refreshSourceStatistics(sourceId: String!) → MutationResult¶
Выполнить ANALYZE для всех зарегистрированных таблиц источника. Улучшает решения о порядке соединений и широковещательной передаче для федеративных запросов. (REQ-276) [tool-verified: provisa/api/admin/schema_mutation.py:2944-3008]
Таблицы¶
registerTable(input: TableInput!) → MutationResult¶
Зарегистрировать новую таблицу (или представление) в домене. Требует возможность table_registration и членство в целевом домене. Вызывающий без create_relationship, отправляющий представление, ставится в очередь как запрос на создание для утверждения обладателем прав. (REQ-013, REQ-016, REQ-252, REQ-434) [tool-verified: provisa/api/admin/schema_mutation.py:1714-1718]
updateTable(input: TableInput!) → MutationResult¶
Обновить псевдоним, описание, метаданные столбцов, настройки MV и конфигурацию живой доставки существующей таблицы. (REQ-016, REQ-020) Требует table_registration. [tool-verified: provisa/api/admin/schema_mutation.py:1858-1995]
deleteTable(id: Int!) → MutationResult¶
Удалить зарегистрированную таблицу. Ищет домен таблицы для доменного шлюза перед удалением. (REQ-1531) [tool-verified: provisa/api/admin/schema_mutation.py:1998-2029]
updateTableCache(tableId: Int!, cacheTtl: Int) → MutationResult¶
Переопределить TTL кеша для одной таблицы. [tool-verified: provisa/api/admin/schema_mutation.py:2353-2376]
updateTableReplicate(tableId: Int!, replicate: Int) → MutationResult¶
Задаёт, когда одна таблица обслуживается из своей реплики. null = наследовать значение источника. Те же значения и отказы, что у updateSourceReplicate. Требует table_registration. (REQ-826, REQ-1907) [tool-verified: provisa/api/admin/schema_mutation.py update_table_replicate]
updateTableLoadProtection(tableId, loadProtected, offPeakWindow, offPeakTz) → MutationResult¶
Переопределить защиту от нагрузки для одной таблицы. null для loadProtected наследует значение источника по умолчанию. Проверяет эффективную комбинацию шлюзов (таблица → источник). (REQ-1141) [tool-verified: provisa/api/admin/schema_mutation.py:2483-2566]
updateTableNaming(tableId: Int!, gqlNamingConvention: String) → MutationResult¶
Задать соглашение об именовании GraphQL для отдельной таблицы. [tool-verified: provisa/api/admin/schema_mutation.py:2661-2685]
deployViewToDb(tableId: Int!) → MutationResult¶
Продвинуть виртуальное представление Provisa до реального представления базы данных на его базовом нативном источнике. [tool-verified: provisa/api/admin/schema_mutation.py:3058-3060]
forceRegen(tableId: Int!, reason: String!) → MutationResult¶
Пересчитать приземлённые строки таблицы по требованию, минуя обычный шлюз изменений. reason — обязательная аннотация для аудита. Отклоняется для живо-федеративных таблиц (нет приземлённых строк). (REQ-968) [tool-verified: provisa/api/admin/schema_mutation.py:2689-2782]
invalidateFileSource(tableId: Int!) → MutationResult¶
Принудительно синхронизировать таблицу файлового коннектора SQLite с диска при следующем обращении. [tool-verified: provisa/api/admin/schema_mutation.py:2877-2880]
registerEntity(input: EntityInput!) → MutationResult¶
Синтаксический сахар для регистрации сущности измерения/хаба. Сводится к MV (битемпоральному, при историзации) и вызывает registerTable. (REQ-1164) [tool-verified: provisa/api/admin/schema_mutation.py:1721-1725]
registerFact(input: FactInput!) → MutationResult¶
Синтаксический сахар для регистрации факта звёздной схемы. Сводится к агрегатному MV, создаёт связи с измерениями и автоматически регистрирует меры факта как управляемые метрики. (REQ-1164, REQ-1320) [tool-verified: provisa/api/admin/schema_mutation.py:1728-1776]
Связи¶
createRelationship(input: RelationshipInput!) → MutationResult¶
Создаёт связь. Проверка смотрит на домен исходной таблицы (не целевой). Междоменное ребро сохраняется с needsReview: true. Вызывающий без create_relationship ставится в очередь как запрос на создание. Рёбра соединения (многие-ко-многим) требуют списков ключей одинаковой длины. Отклоняется по имени до какой-либо записи: уже существующий id (schema.relationship_id_taken); имя таблицы, которое не разрешается ни в одну зарегистрированную таблицу или разрешается в несколько (schema.relationship_unknown_source, _target, _junction, schema.relationship_ambiguous_table); псевдоним Cypher или GraphQL, который уже занят другой связью той же исходной таблицы (schema.relationship_alias_taken, schema.relationship_graphql_alias_taken). Таблица называется своим виртуальным именем: своим псевдонимом, если он есть. (REQ-019, REQ-020, REQ-366, REQ-434) [tool-verified: provisa/api/admin/schema_mutation.py _save_relationship_as_caller, save_relationship]
updateRelationship(input: RelationshipInput!) → MutationResult¶
Изменяет существующую связь с теми же проверками, что у createRelationship. Id, которым не владеет ни одна связь, отклоняется (schema.relationship_not_found). Изменению нужно само право; оно никогда не ставится в очередь как запрос. (REQ-019, REQ-020) [tool-verified: provisa/api/admin/schema_mutation.py _save_relationship_as_caller]
deleteRelationship(id: String!) → MutationResult¶
Удалить связь по ID и перестроить схемы. [tool-verified: provisa/api/admin/schema_mutation.py:2303-2322]
Домены¶
createDomain(input: DomainInput!) → MutationResult¶
Создаёт домен. Уже существующий id отклоняется (schema.domain_id_taken). Зарезервированные слова сегментов (tables, relationships и другие сегменты пути URI) отклоняются, как и литерал подстановки *. Требует возможности org_settings. (REQ-021, REQ-1531) [tool-verified: provisa/api/admin/schema_mutation.py:1135-1189]
deleteDomain(id: String!) → MutationResult¶
Удалить домен. Требует org_settings. (REQ-1531) [tool-verified: provisa/api/admin/schema_mutation.py:1192-1213]
updateGqlNamingConvention(convention: String!) → MutationResult¶
Задать глобальное соглашение об именовании GraphQL и перестроить схемы для всех ролей. Принимаются только распознанные имена соглашений. (REQ-253, REQ-416) [tool-verified: provisa/api/admin/schema_mutation.py:2571-2592]
Роли¶
createRole(input: RoleInput!) → MutationResult¶
Создаёт роль с возможностями, доступом к доменам, необязательными лимитами запросов и необязательной родительской ролью. Проверяет, что родитель существует и цепочка родителей не содержит циклов. После проверок определения уже существующий id отклоняется (schema.role_id_taken). Требует user_management. (REQ-042, REQ-1531, REQ-1677) [tool-verified: provisa/api/admin/schema_mutation.py:1657-1712]
updateRole(input: RoleInput!) → MutationResult¶
Изменяет существующую роль с теми же проверками, что у createRole. Id, которым не владеет ни одна роль, отклоняется (schema.role_not_found). Переопределение роли — это действие в каждом домене, которого она достигает. (REQ-042, REQ-1531) [tool-verified: provisa/api/admin/schema_mutation.py _save_role]
deleteRole(id: String!) → MutationResult¶
Удалить роль. Завершается неудачей, если от неё наследуют другие роли — сначала переподчините их. Требует user_management. (REQ-1531, REQ-1677) [tool-verified: provisa/api/admin/schema_mutation.py:2032-2063]
Правила RLS¶
upsertRlsRule(input: RLSRuleInput!) → MutationResult¶
Создать или обновить правило безопасности на уровне строк. Выражение фильтра проверяется во время сохранения по столбцам целевой таблицы или домена, поэтому правило, которое администратор не может запросить, отклоняется с указанием причины, а не молча отказывает во время выполнения запроса. Требует masking_config. (REQ-041, REQ-402, REQ-1531, REQ-1676) [tool-verified: provisa/api/admin/schema_mutation.py:2066-2136]
Цели взаимоисключающие: задайте tableId для правила уровня таблицы, domainId для правила уровня домена или actionName для отслеживаемой функции/вебхука. (REQ-1679)
deleteRlsRule(roleId, tableId, domainId, actionName) → MutationResult¶
Удалить правило RLS. Требует masking_config. (REQ-1531) [tool-verified: provisa/api/admin/schema_mutation.py:2139-2178]
Продукты данных¶
createDataProduct(input: DataProductInput!) → MutationResult¶
Создаёт продукт данных. Уже существующий id отклоняется (schema.data_product_id_taken). Требует возможности data_product_rw. (REQ-1634) [tool-verified: provisa/api/admin/schema_mutation.py:1216-1259]
updateDataProduct(input: DataProductInput!) → MutationResult¶
Изменяет существующий продукт данных. Id, которым не владеет ни один продукт, отклоняется (schema.data_product_not_found). Требует data_product_rw. (REQ-1634) [tool-verified: provisa/api/admin/schema_mutation.py _save_data_product]
deleteDataProduct(id: String!) → MutationResult¶
Удалить продукт данных. Требует data_product_rw. (REQ-1634) [tool-verified: provisa/api/admin/schema_mutation.py:1262-1285]
Теги¶
createTag(input: TagInput!) → MutationResult¶
Создаёт определение тега. Уже существующий id отклоняется (schema.tag_id_taken). Системные и производные теги нельзя переопределить. appliesTo должен быть непустым подмножеством ["source", "table", "column", "relationship", "command"]. (REQ-1373, REQ-1375) [tool-verified: provisa/api/admin/schema_mutation.py:1288-1361]
updateTag(input: TagInput!) → MutationResult¶
Изменяет существующее определение тега с теми же проверками, что у createTag. Id, которым не владеет ни один тег, отклоняется (schema.tag_not_found). (REQ-1373) [tool-verified: provisa/api/admin/schema_mutation.py _save_tag]
deleteTag(id: String!) → MutationResult¶
Удалить тег. Отклоняет системные и производные теги. (REQ-1373) [tool-verified: provisa/api/admin/schema_mutation.py:1364-1393]
assignTag(input: TagAssignmentInput!) → MutationResult¶
Назначить тег источнику, таблице, столбцу, связи или команде. Применяет политики полей тега (reason_policy, expires_policy) и — для параметризованных тегов — проверяет значение параметра по допустимому списку тега. (REQ-1376, REQ-1377) [tool-verified: provisa/api/admin/schema_mutation.py:1396-1527]
unassignTag(input: TagAssignmentInput!) → MutationResult¶
Удалить назначение тега. (REQ-1377) [tool-verified: provisa/api/admin/schema_mutation.py:1530-1564]
upsertTagParamValue(input: TagParamValueInput!) → MutationResult¶
Добавить или переописать допустимое значение параметра для параметризованного тега. Список допустимых значений закрыт: каждое назначение должно называть значение из него. (REQ-1467) [tool-verified: provisa/api/admin/schema_mutation.py:1567-1616]
deleteTagParamValue(tagId: String!, value: String!) → MutationResult¶
Удалить допустимое значение. Отклоняется, пока хотя бы одно назначение всё ещё несёт его, потому что эти назначения называли бы тип, который список больше не допускает. (REQ-1467) [tool-verified: provisa/api/admin/schema_mutation.py:1619-1655]
Метрики¶
createMetric(input: MetricInput!) → MutationResult¶
Создаёт определение регулируемой метрики. Уже существующее имя отклоняется (schema.metric_name_taken). Выражение должно разбираться sqlglot и содержать хотя бы одну агрегатную функцию. Пересоздаёт все представления, составленные из метрик, которые ссылаются на эту метрику. Требует table_registration. (REQ-1317, REQ-1318) [tool-verified: provisa/api/admin/schema_mutation.py:1779-1831]
updateMetric(input: MetricInput!) → MutationResult¶
Заменяет определение существующей метрики с теми же проверками, что у createMetric. Имя, которым не владеет ни одна метрика, отклоняется (schema.metric_not_found). Для сохранения нужны домены нового выражения и заменяемого определения. (REQ-1317, REQ-1531) [tool-verified: provisa/api/admin/schema_mutation.py _save_metric]
deleteMetric(name: String!) → MutationResult¶
Удалить управляемую метрику. Перестраивает схемы. Требует table_registration. (REQ-1317) [tool-verified: provisa/api/admin/schema_mutation.py:1834-1856]
Календари¶
createCalendar(input: CalendarInput!) → MutationResult¶
Создать или заменить версионированный календарь границ снимков. Проверяется путём построения объекта Calendar в памяти перед сохранением — завершается неудачей при неизвестной базовой системе, неверном часовом поясе или неверном фискальном якоре. (REQ-962) [tool-verified: provisa/api/admin/schema_mutation.py:525-579]
deleteCalendar(name: String!) → MutationResult¶
Удалить календарь (все версии). Отклоняется, если на него ссылается какое-либо материализованное представление. (REQ-962) [tool-verified: provisa/api/admin/schema_mutation.py:582-613]
Материализованные представления¶
refreshMv(mvId: String!) → MutationResult¶
Инициировать ручное обновление материализованного представления. Координирует по всему парку экземпляров, когда режим согласованности MV — shared. (REQ-133, REQ-158, REQ-879) [tool-verified: provisa/api/admin/schema_mutation.py:2787-2813]
toggleMv(mvId: String!, enabled: Boolean!) → MutationResult¶
Включить или отключить материализованное представление. [tool-verified: provisa/api/admin/schema_mutation.py:2816-2839]
Кеш¶
purgeCache → MutationResult¶
Очистить все кешированные результаты запросов. [tool-verified: provisa/api/admin/schema_mutation.py:2844-2858]
purgeCacheByTable(tableId: Int!) → MutationResult¶
Очистить кешированные результаты для одной таблицы. [tool-verified: provisa/api/admin/schema_mutation.py:2861-2875]
Запланированные задачи¶
createScheduledTask(id, name, cron, kind, webhookName, argsJson, sql) → MutationResult¶
Создать запланированный триггер — либо вызов вебхука, либо оператор SQL — и зарегистрировать его вживую в APScheduler. kind — это "webhook" или "sql". (REQ-1003, REQ-1004) [tool-verified: provisa/api/admin/schema_mutation.py:2923-2936]
deleteScheduledTask(taskId: String!) → MutationResult¶
Удалить запланированный триггер из конфигурации и работающего планировщика. (REQ-1003) [tool-verified: provisa/api/admin/schema_mutation.py:2939-2941]
toggleScheduledTask(taskId: String!, enabled: Boolean!) → MutationResult¶
Включить или отключить запланированную задачу в файле конфигурации. [tool-verified: provisa/api/admin/schema_mutation.py:2885-2920]
Качество данных¶
dryRunDqContract(sourceId: String!, contractText: String!) → DqDryRunType¶
Выполнить контракт против живой таблицы и вернуть результаты, ничего не приземляя. Мутация, а не запрос, потому что это стоит реального сканирования. Она доказывает, разрешается ли идентификатор набора данных в управляемую таблицу, которую имеет в виду оператор. (REQ-1443, пункт 7) [tool-verified: provisa/api/admin/schema_mutation.py:463-487]
runDqCheckNow(schemaName: String!, tableName: String!) → MutationResult¶
Немедленно запустить задачу опроса таблицы-проверки. Приземляет строки обычным способом, поэтому результаты сохраняются, и история DQ показывает новое сканирование. (REQ-1443) [tool-verified: provisa/api/admin/schema_mutation.py:490-522]
Обслуживание схемы¶
rebuildSchemas → MutationResult¶
Перестроить схему в памяти из состояния базы данных. Полезно после внешних изменений базы данных. [tool-verified: provisa/api/admin/schema_mutation.py:456-461]
Запросы на создание¶
approveCreationRequest(requestId: Int!) → MutationResult¶
Одобряет запрос на создание: то же правило, те же отказы и те же записи журнала администратора, что у POST /admin/creation-requests/{id}/approve. Автор запроса не может одобрить собственный запрос, и одобрение одного пользователя засчитывается один раз. Одобрение, которое завершает счёт запроса, создаёт то, что он просит; params.status равен executed, если это сделало оно, иначе pending, а params.waitingOn перечисляет домены, которых запрос на связь ещё ждёт. (REQ-434, REQ-063, REQ-1948) [tool-verified: provisa/api/admin/schema_mutation.py approve_creation_request]
executeCreationRequest(requestId: Int!) → MutationResult¶
Выполняет запрос на создание, получивший свои одобрения — связь, представление, таблицу, источник или webhook, — через тот же код, что использует прямая мутация. Отклоняется с requests.approvals_incomplete, пока требуемые одобрения запроса (одно, или два для связи) не получены от пользователей, отличных от автора; запрос на связь также отклоняется с requests.waiting_on_domains, пока у затронутого им домена нет одобряющего. Одобрения даются через POST /admin/creation-requests/{id}/approve, и одобрение, которое завершает счёт, выполняет создание, поэтому эта мутация служит для повторной попытки неудавшегося создания. Неудавшееся создание оставляет запрос ожидающим и отвечает собственным кодом ошибки. (REQ-434, REQ-063, REQ-1948) [tool-verified: provisa/api/admin/schema_mutation.py execute_creation_request, perform_request_creation; provisa/api/admin/creation_requests_router.py]
rejectCreationRequest(requestId: Int!, reason: String!) → MutationResult¶
Отклоняет запрос из очереди с практичной причиной. reason обязателен. Запрос на связь может отклонить любой пользователь, который мог бы его одобрить. Автор запроса любого другого типа может его отозвать; это записывается в журнал администратора как отзыв. (REQ-434, REQ-063, REQ-1948) [tool-verified: provisa/api/admin/schema_mutation.py:3064-3106]
Компиляция запросов¶
compileQuery(input: CompileQueryInput!) → [CompileQueryResult!]!¶
Скомпилировать запрос GraphQL плоскости данных по схеме роли и вернуть полное решение маршрутизации: семантический SQL, SQL движка, прямой SQL, маршрут, метаданные применения (применённые фильтры RLS, исключённые столбцы, применённое маскирование) и скомпилированный Cypher. Возвращает один результат на каждое корневое поле в запросе. (REQ-161) [tool-verified: provisa/api/admin/schema_mutation.py:3011-3055]
mutation {
compileQuery(input: {
role: "analyst"
query: "{ orders { id customer_id total } }"
}) {
sql
semanticSql
engineSql
route
routeReason
enforcement {
rlsFiltersApplied
columnsExcluded
maskingApplied
}
}
}
Поля CompileQueryInput:
| Поле | Тип | Описание |
|---|---|---|
query |
String! |
Запрос GraphQL плоскости данных для компиляции |
role |
String! |
Роль, по схеме которой компилировать |
variables |
JSON |
Привязки переменных |
flatSql |
Boolean |
Вернуть одну сведённую строку SQL вместо пары семантический/движковый |
flatCypher |
Boolean |
Свести вывод Cypher |
nodeOnlyCypher |
Boolean |
Выдать Cypher только с узлами (без паттернов рёбер) |
Ключевые входные типы¶
SourceInput¶
[tool-verified: provisa/api/admin/types.py:590-611]
| Поле | Тип | Примечания |
|---|---|---|
id |
String! |
Идентификатор источника |
type |
String! |
Тип коннектора (например, postgres, files, openapi) |
host |
String |
|
port |
Int |
|
database |
String |
|
username |
String |
|
password |
String |
Открытый текст или ссылка ${secret:NAME} |
path |
String |
Путь в файловой системе для файловых/CSV-источников |
federationHintsJson |
String |
Объект JSON для дополнительных параметров хранилища (Snowflake warehouse/role, Databricks http_path) |
changeSignal |
String |
ttl | probe | ttl_probe (REQ-929) |
loadProtected |
Boolean |
Только по расписанию обновления (REQ-1141) |
offPeakWindow |
String |
Окно обслуживания HH:MM-HH:MM |
offPeakTz |
String |
Часовой пояс IANA |
cdc |
SourceCdcConfigInput |
Конфигурация транспорта Kafka CDC (REQ-824), включая способ обращения к его schema registry (REQ-1951; см. Аутентификация schema registry). schemaRegistryPassword и schemaRegistryToken возвращаются как ссылки хранилища, никогда как учётные данные. |
TableInput¶
[tool-verified: provisa/api/admin/types.py:745-800]
Основной входной тип регистрации таблицы. Ключевые поля сверх базовых:
| Поле | Примечания |
|---|---|
materialize |
Приземлить копию в хранилище материализации |
mvRefreshInterval |
Секунды между обновлениями |
mvPersist |
replace | append | upsert (REQ-965) |
mvIncremental |
Инкрементальное обслуживание (REQ-969) |
mvBitemporalMode |
snapshot | delta для битемпоральных таблиц (REQ-1162) |
mvCalendar |
Имя календаря снимков (REQ-962) |
mvGrain |
Гранулярность снимка: daily, weekly, monthly, annual или пользовательская 3WE / LFR (REQ-962) |
viewSql |
SQL для производного представления |
viewMetrics |
Декларативная спецификация представления, составленного из метрик — взаимоисключающая с viewSql (REQ-1318) |
dqContract |
Текст контракта качества данных в YAML/JSON (REQ-1443) |
queryTemplate |
Cypher для таблицы Neo4j (REQ-1670) |
live |
Конфигурация живой доставки для push SSE/Kafka (REQ-565, REQ-813) |
discover |
Выводить столбцы из живого источника во время регистрации (REQ-252) |
RelationshipInput¶
[tool-verified: provisa/api/admin/types.py:804-826]
| Поле | Примечания |
|---|---|
id |
Идентификатор связи |
sourceTableId |
Имя виртуальной таблицы (псевдоним, если задан, иначе имя таблицы) |
targetTableId |
Имя виртуальной таблицы; пусто для вычисляемых связей |
sourceColumn |
Столбец соединения на исходной стороне |
targetColumn |
Столбец соединения на целевой стороне |
cardinality |
one-to-one | one-to-many | many-to-one | many-to-many |
alias |
Метка ребра Cypher (например, WORKS_FOR) |
graphqlAlias |
Имя поля GraphQL на исходном типе |
viaTable |
Имя связующей таблицы для рёбер многие-ко-многим (REQ-1586) |
recordCandidate |
Также записать строку relationship_candidates со статусом accepted |
Пример: регистрация таблицы¶
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
}
}