Операции записи в публичном API v2
Эндпоинты записи публичного API v2 создают, полностью заменяют, изменяют и удаляют содержимое РПИ и объекты модели данных, а также управляют доступом к проекту и его владением. Базовый путь, аутентификация, ограничение частоты запросов, локализация и формат ошибок у них те же, что и у эндпоинтов чтения, описанных на странице Публичный API v2.
Общая информация
| Свойство | Значение |
|---|---|
| Базовый путь | /df-api/v2 |
| Аутентификация | Заголовок X-Api-Key |
| Требуемый доступ | Эффективная роль в проекте «разработчик» или выше для записи в РПИ и модель данных; владелец проекта либо Администратор компании / Суперадминистратор для управления доступом |
| Объекты | Проекты, версии, показатели, измерения, факты, справочники, таблицы фактов и их состав, фильтры верификации, связи, доступ к проекту и владение проектом |
| Недоступно | Витрины и подключения нельзя создавать и изменять через публичный API |
Каждая операция записи фиксируется в системном журнале вместе со снимком затронутого объекта до и после изменения.
Семантика методов
| Метод | Значение |
|---|---|
POST на коллекции |
Создаёт новый объект и возвращает его с кодом 201 Created |
POST на …/bulk |
Создаёт или обновляет набор строк РПИ одним вызовом |
POST на пути состава, например …/fact-tables/{fact_table_id}/measures |
Назначает существующие элементы родительскому объекту и возвращает сводку по элементам, для которых операция удалась и не удалась |
PUT |
Полная замена: должны быть переданы все обязательные поля, а любое не переданное опциональное поле сбрасывается к значению по умолчанию или пустому значению |
PATCH |
Частичное обновление: изменяются только переданные поля |
DELETE |
Удаляет объект и возвращает 204 No Content |
Требования к доступу
Запись в РПИ и модель данных требует, чтобы владелец ключа API разрешался в эффективную роль в проекте «разработчик» или выше для целевого проекта:
| Ситуация | Результат |
|---|---|
| У владельца ключа нет доступа к проекту | 404 Not Found, код DF_API.PROJECT_NOT_FOUND — факт существования проекта не раскрывается |
| Доступ владельца ключа ниже разработчика (аналитик или наблюдатель) | 403 Forbidden, код DF_API.WRITE_ACCESS_DENIED |
| Создание проекта | Владелец ключа должен принадлежать компании |
У эндпоинтов управления доступом и владением действует собственное, более строгое правило — см. раздел «Доступ к проекту и владение проектом».
Повторные запросы
Запрос POST может нести заголовок Idempotency-Key со значением в формате UUID версии 4. Ключ запоминается на 24 часа в разрезе ключа API, метода и пути, что делает повторный вызов безопасным после сбоя сети:
| Ситуация | Результат |
|---|---|
| Запрос с таким же ключом уже завершился | Сохранённый ответ возвращается повторно без изменений |
| Запрос с таким же ключом ещё выполняется | 409 Conflict, код DF_API.IDEMPOTENCY_IN_PROGRESS |
| Значение заголовка не является корректным UUID версии 4 | 400 Bad Request, код DF_API.INVALID_IDEMPOTENCY_KEY |
Валидация и ссылочная целостность
- Имена должны соответствовать допустимому шаблону и быть уникальными в своей области; дубликат возвращает
409с кодомDF_API.DUPLICATE_NAME - Формулы показателей разбираются, а их ссылки разрешаются. Ошибка синтаксиса возвращает
422(DF_API.INVALID_FORMULA_SYNTAX), неизвестная ссылка —422(DF_API.FORMULA_REFERENCE_NOT_FOUND), циклическая ссылка —422(DF_API.CIRCULAR_DEPENDENCY) - Удаление или снятие назначения элемента, на который ещё есть ссылки, возвращает
409с кодомDF_API.CONSTRAINT_VIOLATION - У версии есть только название, признак глобальной версии и — при создании — опциональная исходная версия для копирования. Эндпоинты версий не принимают описание
Проекты и версии
| Метод | Путь | Описание |
|---|---|---|
POST |
/projects |
Создать проект: name, опционально description и color |
PATCH |
/projects/{project_id} |
Изменить метаданные проекта |
DELETE |
/projects/{project_id} |
Удалить проект со всем содержимым (204) |
POST |
/projects/{project_id}/versions |
Создать версию, при необходимости скопировав существующую через clone_from_version |
PATCH |
/projects/{project_id}/versions/{version_id} |
Изменить name или is_global версии |
DELETE |
/projects/{project_id}/versions/{version_id} |
Удалить версию со всем содержимым (204) |
Установка is_global для версии, конфликтующей с другой глобальной версией, возвращает 422 с кодом DF_API.GLOBAL_VERSION_CONFLICT.
Показатели, измерения и факты
В таблицах ниже {v} обозначает /projects/{project_id}/versions/{version_id}. Эндпоинты показаны для показателей; измерения (/dimensions, {dimension_id}) и факты (/facts, {fact_id}) работают точно так же.
| Метод | Путь | Описание |
|---|---|---|
POST |
{v}/measures |
Создать показатель |
POST |
{v}/measures/bulk |
Создать или обновить набор показателей одним вызовом |
PUT |
{v}/measures/{measure_id} |
Заменить показатель (полное обновление) |
PATCH |
{v}/measures/{measure_id} |
Изменить показатель (частичное обновление) |
DELETE |
{v}/measures/{measure_id} |
Удалить показатель (204) |
Пример создания показателя:
{ "measure_name": "Total revenue", "measure_type": "base", "group": "Revenue", "formula": "SUM([Amount])" }
Эндпоинты массовых операций принимают строки в массиве, названном по типу элементов, например { "measures": [ … ] }.
Идентификаторы элементов в этих путях — это значения id, возвращаемые эндпоинтами чтения.
Справочники
| Метод | Путь | Описание |
|---|---|---|
POST |
{v}/dimension-groups |
Создать справочник |
PUT |
{v}/dimension-groups/{dimension_group_id} |
Заменить метаданные справочника (полное обновление) |
PATCH |
{v}/dimension-groups/{dimension_group_id} |
Изменить метаданные справочника |
DELETE |
{v}/dimension-groups/{dimension_group_id} |
Удалить справочник (204) |
POST |
{v}/dimension-groups/{dimension_group_id}/dimensions |
Добавить измерения в справочник |
PATCH |
{v}/dimension-groups/{dimension_group_id}/dimensions/{dimension_id} |
Изменить уровень иерархии измерения в справочнике |
DELETE |
{v}/dimension-groups/{dimension_group_id}/dimensions/{dimension_id} |
Удалить измерение из справочника (204) |
Назначение одного и того же уровня иерархии двум измерениям одного справочника возвращает 409 с кодом DF_API.DUPLICATE_LEVEL.
Таблицы фактов
| Метод | Путь | Описание |
|---|---|---|
POST |
{v}/fact-tables |
Создать таблицу фактов |
PUT |
{v}/fact-tables/{fact_table_id} |
Заменить метаданные таблицы фактов (полное обновление) |
PATCH |
{v}/fact-tables/{fact_table_id} |
Изменить метаданные таблицы фактов |
DELETE |
{v}/fact-tables/{fact_table_id} |
Удалить таблицу фактов (204) |
Состав таблицы фактов:
| Метод | Путь | Описание |
|---|---|---|
POST |
{v}/fact-tables/{fact_table_id}/measures |
Назначить показатели: { "measure_ids": [ … ] } |
DELETE |
{v}/fact-tables/{fact_table_id}/measures/{measure_id} |
Снять назначение показателя (204) |
POST |
{v}/fact-tables/{fact_table_id}/dimensions |
Назначить измерения: { "dimension_ids": [ … ] } |
DELETE |
{v}/fact-tables/{fact_table_id}/dimensions/{dimension_id} |
Снять назначение измерения (204) |
POST |
{v}/fact-tables/{fact_table_id}/facts |
Назначить факты: { "fact_ids": [ … ] } |
DELETE |
{v}/fact-tables/{fact_table_id}/facts/{fact_id} |
Снять назначение факта (204) |
POST |
{v}/fact-tables/{fact_table_id}/dimension-groups |
Назначить справочники: { "dimension_group_ids": [ … ] } |
DELETE |
{v}/fact-tables/{fact_table_id}/dimension-groups/{dimension_group_id} |
Снять назначение справочника (204) |
Фильтры верификации таблицы фактов:
| Метод | Путь | Описание |
|---|---|---|
POST |
{v}/fact-tables/{fact_table_id}/verification-filters |
Создать фильтр для таблицы фактов |
PUT |
{v}/fact-tables/{fact_table_id}/verification-filters/{filter_id} |
Заменить фильтр (полное обновление) |
PATCH |
{v}/fact-tables/{fact_table_id}/verification-filters/{filter_id} |
Изменить фильтр |
DELETE |
{v}/fact-tables/{fact_table_id}/verification-filters/{filter_id} |
Удалить фильтр (204) |
Фильтры верификации версии проекта
| Метод | Путь | Описание |
|---|---|---|
POST |
{v}/verification-filters |
Создать фильтр на уровне версии проекта |
PUT |
{v}/verification-filters/{filter_id} |
Заменить фильтр (полное обновление) |
PATCH |
{v}/verification-filters/{filter_id} |
Изменить фильтр |
DELETE |
{v}/verification-filters/{filter_id} |
Удалить фильтр (204) |
Связи
| Метод | Путь | Описание |
|---|---|---|
POST |
{v}/relationships |
Создать связь между таблицей фактов и справочником |
PUT |
{v}/relationships/{relationship_id} |
Заменить координаты ключей связи (полное обновление) |
PATCH |
{v}/relationships/{relationship_id} |
Изменить координаты ключей связи |
DELETE |
{v}/relationships/{relationship_id} |
Удалить связь (204) |
Пример создания связи:
{
"source_fact_table_id": "11",
"target_dimension_group_id": "9",
"foreign_key": { "db": "analytics_db", "schema": "public", "table": "fact_sales", "column": "region_id" },
"primary_key": { "db": "analytics_db", "schema": "public", "table": "dim_geography", "column": "region_id" },
"relationship_type": "many_to_one"
}
Поле relationship_type принимает только значение many_to_one; другое значение возвращает 400 с кодом DF_API.INVALID_RELATIONSHIP_TYPE. Вторая связь между той же таблицей фактов и тем же справочником возвращает 409 с кодом DF_API.DUPLICATE_RELATIONSHIP.
Доступ к проекту и владение проектом
Эти эндпоинты управляют доступом к проекту, который затем наследуют ключи API. В отличие от эндпоинтов РПИ и модели данных, они требуют, чтобы владелец ключа был владельцем проекта, Администратором компании или Суперадминистратором; любой другой вызывающий отклоняется с кодом 403 и кодом ошибки PROJECT.ACCESS_DENIED.
| Метод | Путь | Описание |
|---|---|---|
GET |
/projects/{project_id}/access |
Вернуть конфигурацию доступа к проекту |
POST |
/projects/{project_id}/access |
Добавить пользователя в проект или изменить уровень доступа пользователя |
DELETE |
/projects/{project_id}/access/{user_id} |
Удалить доступ пользователя |
PUT |
/projects/{project_id}/owner |
Передать владение проектом |
Конфигурация доступа
GET /projects/{project_id}/access
Параметры query: language.
Возвращает владельца проекта и всех пользователей, у которых есть явный доступ. Подписи ролей локализуются так же, как в таблице пользователей проекта в приложении.
[
{
"id": 7,
"first_name": "Иван",
"last_name": "Иванов",
"email": "ivan.ivanov@example.com",
"isOwner": true,
"globalRole": "Администратор",
"projectRole": "Разработчик"
}
]
| Поле | Описание |
|---|---|
isOwner |
true для владельца проекта |
globalRole |
Локализованная подпись глобальной роли пользователя или null, если её не удалось определить |
projectRole |
Локализованная подпись роли в проекте или null, если явной роли в проекте нет |
Предоставление и изменение доступа
POST /projects/{project_id}/access
{ "userId": 12, "accessLevel": "developer" }
| Поле | Тип | Описание |
|---|---|---|
userId |
integer | Целевой пользователь; должен существовать и принадлежать компании проекта |
accessLevel |
string | Одно из значений developer, analyst, viewer |
Если у пользователя уже есть доступ, уровень изменяется; иначе доступ предоставляется. Уровень доступа выше глобальной роли пользователя отклоняется.
Удаление доступа
DELETE /projects/{project_id}/access/{user_id}
Удаляет явный доступ целевого пользователя. Пользователь должен существовать.
Передача владения
PUT /projects/{project_id}/owner
{ "newOwnerId": 12 }
Новый владелец должен существовать, принадлежать компании проекта и иметь роль, допустимую для владения проектом — Менеджер проекта, Администратор компании или Суперадминистратор.
Правила валидации
| Условие | HTTP | Код |
|---|---|---|
accessLevel отсутствует или не равен developer, analyst либо viewer |
400 | PROJECT.INVALID_ACCESS_LEVEL |
accessLevel равен project_manager — этот уровень наследуется владельцем и не назначается |
400 | PROJECT.ACCESS_LEVEL_NOT_ASSIGNABLE |
| Запрошенный уровень превышает глобальную роль целевого пользователя | 400 | PROJECT.CANNOT_ELEVATE_ACCESS |
| Целевой пользователь не существует или принадлежит другой компании | 404 | USER.NOT_FOUND |
| У нового владельца нет роли, допустимой для владения проектом | 400 | PROJECT.INVALID_OWNER |
| Вызывающий не является ни владельцем проекта, ни администратором | 403 | PROJECT.ACCESS_DENIED |
Коды ошибок операций записи
| Код | HTTP | Описание |
|---|---|---|
DF_API.MISSING_REQUIRED_FIELD |
400 | Отсутствует обязательное поле, например при полной замене методом PUT |
DF_API.INVALID_ENUM_VALUE |
400 | Значение поля со списком значений не входит в число допустимых |
DF_API.ID_MISMATCH |
400 | Идентификатор в теле запроса не совпадает с идентификатором в пути |
DF_API.INVALID_RELATIONSHIP_TYPE |
400 | relationship_type должен быть равен many_to_one |
DF_API.INVALID_IDEMPOTENCY_KEY |
400 | Idempotency-Key не является корректным UUID версии 4 |
DF_API.INVALID_API_KEY |
401 | Не удалось проверить ключ API |
DF_API.WRITE_ACCESS_DENIED |
403 | Эффективная роль владельца ключа в проекте ниже разработчика |
DF_API.RESOURCE_NOT_FOUND |
404 | Целевой элемент или назначение не существует |
DF_API.DUPLICATE_NAME |
409 | Элемент, проект или версия с таким названием уже существует в этой области |
DF_API.DUPLICATE_RELATIONSHIP |
409 | Связь между этой таблицей фактов и этим справочником уже существует |
DF_API.DUPLICATE_LEVEL |
409 | Двум измерениям одного справочника назначен одинаковый уровень иерархии |
DF_API.CONSTRAINT_VIOLATION |
409 | На элемент ещё есть ссылки, его нельзя удалить или снять его назначение |
DF_API.IDEMPOTENCY_IN_PROGRESS |
409 | Запрос с тем же значением Idempotency-Key ещё выполняется |
DF_API.INVALID_FORMULA_SYNTAX |
422 | Не удалось разобрать формулу показателя |
DF_API.FORMULA_REFERENCE_NOT_FOUND |
422 | Формула показателя ссылается на несуществующий элемент |
DF_API.CIRCULAR_DEPENDENCY |
422 | Формула показателя создаёт циклическую ссылку |
DF_API.GLOBAL_VERSION_CONFLICT |
422 | Нельзя установить is_global — конфликт с другой глобальной версией |
Тело ошибки такое же, как у эндпоинтов чтения — см. страницу Публичный API v2.