Skip to content

API: ответственность, видимость и интеграции ​

Статус: реализовано в native v1, схема БД 32. Каждая операция контракта, включая HEAD, относится к одной из шести областей ниже. Потребители: CI/CD, интеграции и отдельный удалённый интерфейс. Они используют один серверный контракт; встроенная консоль не имеет привилегированного канала.

Независимые области ответственности ​

SurfaceОтветственностьПримеры
discoveryУзнать возможности, разрешённые операции и репозиторные областиcapabilities, operations, OpenAPI, repositories
identityВход и собственная identitylogin/logout, me, permissions, password, активация собственного managed key
catalogОписания, организация, версии и ссылки на содержимоеartifacts, annotations, packages, assets/history, references, repository audit
transfersПриём и раздача байтов, состояние собственных загрузок/заданийupload create/parts/complete/cancel, jobs, download/HEAD/Range по ID, пакету и пути файла
administrationУчётные записи, группы, сервисы, credentials, policy и delegationusers, access-groups, service-accounts, api-keys
operationsТекущее состояние процесса и готовность шлюзаhealth/live, health/status, health/ready, health/metrics

Это логические области контракта, не шесть новых сервисов. URL существующих операций /api/v1 сохраняются. Размещение writer/reader определяется deployment-профилем, а не названием surface. Будущее физическое разделение должно сохранять operationId, авторизацию, ресурсные границы и общий контракт ошибок.

Уровни видимости — без наследования полномочий ​

VisibilityЧто означает
publicСам вызов не требует Bearer: liveness и обмен username/password на сессию. Каталог операций всё равно требует авторизацию.
authenticatedОбщие сведения для действующего credential; не разрешение читать чужие ресурсы.
selfСвоя identity, сессия либо credential; дополнительные условия отражены в authorization metadata.
repositoryТочные actions внутри одного репозитория.
owned-resourceТе же actions плюс владелец upload/job/reference.
delegatedКонкретный целевой service account, отдельные admin actions и ceiling; bootstrap остаётся явной альтернативой.
bootstrapЛокально настроенное управление сервисными identities/delegations.
administratorУправление пользовательскими учётными записями и группами; системные права backup.read/backup.manage резервных копий (вид доступа system, ADR 0056).

Administrator не наследует download, bootstrap не становится пользовательским administrator, Publisher не наследует Reader. Managed account/key bindings пересекаются по действию и тому же репозиторию. Новые actions не включаются в старые read/write автоматически. Runtime use cases остаются источником решений; x-arkvory-surface и x-arkvory-visibility являются описанием, а не middleware авторизации.

Каталог операций для текущего клиента ​

http
GET /api/v1/operations?repository=releases&surface=transfers&limit=50
Authorization: Bearer <credential>

Ответ содержит apiVersion, documentVersion, gatewayRole, repository, advisory: true, items и next. В операции: operationId, HTTP method/path template, summary, surface, visibility, retry, requiredActions и conditions.

  • Без repository возвращаются только применимые общие, собственные и административные операции; bytes/catalog/upload конкретного репозитория не предполагаются.
  • Discovery списков может оставаться доступным с пустым результатом: видимость операции listRepositories не выдаёт repository.read или доступ к именам чужих репозиториев.
  • С repository добавляются операции, для которых действуют все обязательные permissions. Достаточно своего непустого binding; отдельное repository.read не требуется для introspection существующего узкого data key. Карточка репозитория по-прежнему требует своё repository.read у managed key.
  • Чужая и неизвестная репозиторная область дают одинаковый 404. Endpoint не проверяет существование файлов или глобального repository registry.
  • requiredActions описывает managed permissions. Legacy keys и пользовательские группы проверяются по прежнему coarse mapping; introspection не меняет их права.
  • conditions перечисляет оставшиеся проверки: resource-state, upload-owner, job-owner, reference-owner, delegation-target-and-ceiling, own-key. Наличие строки в каталоге не гарантирует доступ к произвольному resource ID, успешный CAS или свободную квоту.
  • Делегированные admin actions видны при наличии актуального enabled grant с этим action. Целевые account IDs и ceiling не выдаются через общий каталог; они читаются отдельным API собственных delegations. Bootstrap видит свою альтернативу.
  • Reader исключает все изменяющие методы. Права на writer могут быть шире; этот ответ описывает именно опрошенный шлюз.
  • limit: 1–100, default 50. Порядок по operationId, next — последний ID страницы. Фильтрация прав выполняется до LIMIT. Следующая страница повторно проверяет права. Это не snapshot; после смены фильтра/репозитория обход начинают заново.
  • Неизвестные, повторённые и некорректные query options дают 400. GET и HEAD защищены одинаково. Ответ — Cache-Control: private, no-store; не сохранять его как долговременный permission cache.

advisory: true обязателен: каждый настоящий запрос заново проверяет ключ, область, владельца, состояние, ревизию, ограничения и роль шлюза. Отозванный ключ не может продолжить работу по старому каталогу. Для возможностей ещё не реализованного API не публикуются фиктивные operationId.

Спецификация по областям ​

http
GET /api/v1/openapi.json
GET /api/v1/openapi.json?surface=catalog
GET /api/v1/openapi.json?surface=administration

Первый URL сохраняет полную спецификацию. Второй и третий — документационные представления, с параметрами путей, схемами, security, retry и gateway metadata исходного контракта. Они не фильтруются по правам пользователя: документация административного метода не открывает доступ к нему. Для построения меню удалённого UI применяется /operations, а не факт наличия пути в OpenAPI.

В каждой операции OpenAPI присутствуют x-arkvory-surface и x-arkvory-visibility наряду с прежними x-arkvory-authorization, x-arkvory-gateway и x-arkvory-retry. Неизвестная responsibility или операция без описания останавливает сборку/запуск. Registry/route guard проверяет весь inventory, в том числе новые GET/HEAD.

SDK по зонам ответственности ​

typescript
const client = new ArkvoryClient('https://arkvory.example.com/', () => currentToken);
const repository = client.inRepository('releases');

const visible = await repository.operations({ surface: 'transfers' });
const files = await repository.artifacts.search({ label: 'stable' });
const revisions = await repository.assets.history('current/app.upack');
const annotations = await repository.annotations.get(artifactId);
await repository.annotations.update(artifactId, annotations.revision, {
  labels: ['stable'],
  collections: ['desktop'],
  metadata: { channel: 'stable' },
});
const verifiedBytes = await repository.artifacts.downloadVerified(artifactId, {
  signal: abortController.signal,
});
SDK namespaceМетоды
client.identitylogin, logout, me, permissions, changePassword, activateKey
client.administration.userslist, create, update
client.administration.groupslist, create, setMember, setGrant
client.administration.serviceslist, get, create, update, policy, setPolicy, keys, audit
client.administration.credentialsget, issue, rotate, revoke, delegations, setDelegation, removeDelegation
repositorydescribe, operations; immutable id
repository.artifactslist, search, get, download, downloadVerified
repository.annotationsget, update
repository.uploadscreate, get, parts, resume, complete, completeAsync, cancel
repository.packageslist, register
repository.assetsget, list (cursor page), history, revision, assign, restore

Плоские методы client.create, client.repository, client.downloadVerified и остальные сохранены. Новые namespaces делегируют тем же методам, не дублируют HTTP/retry/auth логику. Клиент хранит callback получения текущего токена; смена токена не закрепляет старую identity за созданным namespace. Namespace не является security boundary: его методы всё равно могут вернуть 401/403/404/409 и другие контрактные ошибки.

Подключение удалённого интерфейса ​

  1. Авторизоваться через пользовательскую сессию либо отдельный подходящий credential; не встраивать общий service secret в распространяемый UI.
  2. Получить capabilities, identity/permissions и разрешённые репозитории. У data-only managed key логический репозиторий может быть задан конфигурацией интеграции, без repository.read.
  3. Прочитать все страницы /operations для нужного repo/gateway; построить разделы по surface и действия по operationId. Ограничения conditions остаются видимыми пользователю.
  4. После 401 удалить локальную авторизацию; после 403 обновить права и доступные действия; после 409 перечитать ревизию. Ошибки не превращаются в бесконечный retry.
  5. Для записи использовать writer, для раздачи — разрешённый endpoint. Не переносить постоянный credential на произвольный host через redirect. CORS настраивается на точный origin по EXTERNAL_UI.

Дальнейшее расширение — ещё не реализовано ​

ОбластьСледующий самостоятельный контракт
CatalogРеестр и настройки репозиториев, resolve exact/latest в метаданные, управляемые schemas/labels/collections, namespace selectors
TransfersДолговечная общая очередь и её own/admin views, transfer tickets, динамические квоты, подтверждённые replicas
Integration eventsЧастично: лента изменений репозитория (ADR 0058) и доставка вебхуков из файла оператора курсором по ней, с подписью, повторами, дедупликацией по id и защитой egress (ADR 0069). Запланированы API управления подписками и события identity
AdministrationИмпорт legacy ownership, делегированное identity administration, готовые версионированные роли
OperationsОтдельное system.observe для подробной диагностики, retention dry-run/apply, проверенный backup/restore

Эти расширения не выдаются за работающие API. Текущий health/ready сохраняет прежний доступ любого действующего credential к агрегатам. Добавление новых административных или опасных операций требует отдельного действия, явной видимости, bounds, отрицательных тестов и документации, а не назначения через общий write.

Проверка ​

Unit: ответственность всех операций, разделение областей OpenAPI, отсутствие перемножения bindings, независимость bootstrap/admin/delegation, exact repository после 100-й записи, строгий parser страниц. Integration: реальный HTTP/PostgreSQL, schema validation, HEAD, paging, узкие managed keys, отзыв policy/key/delegation, reader-фильтрация, пользовательская сессия/группы и SDK upload/download/metadata/assets. Новая версия не требует миграции БД и не объявляет HA.

Для манифестов и дополнительных файлов добавлена группа repository.attachments.{get,replace,history}. Операции getBuildAttachments, replaceBuildAttachments, getBuildAttachmentHistory относятся к catalog/repository. Контракт и UI.

Внутренняя композиция SDK не меняет эти поверхности: 68 flat methods и namespaces сохранены, группы используют общий HTTP-транспорт с актуальным credential для каждого запроса. Снимок публичных типов и сетевые регрессии входят в unit-гейт. Архитектурное решение.

Arkvory · ProAnimaStudio