GET /api/v1/permissions — Каталог permissions (SEED)
Чтение справочника прав доступа (113 позиций, domain/permission.md) для UI настройки ролей: чекбоксы по контекстам с фильтром «назначимо компанией».
Назначение
Пользователь с правом просмотра ролей открывает конструктор роли и видит каталог прав, сгруппированный
по 16 контекстам. Owning-контекст — identity. Feature group — permissions.
Каталог — SEED reference data (INV-P1): меняется только релизом, runtime-API записи нет.
Metadata
| Поле | Значение |
|---|---|
| Сервис/контекст | identity |
| API area | public |
| Feature group | permissions |
| Статус | draft |
| Документ | docs/06-services/identity/api/company-user/list-permission-catalog.md |
Актор и доступ
| Проверка | Значение |
|---|---|
| Actor type | User (любой аутентифицированный) |
| Auth policy / Permissions | authenticated (без permission-требования) |
| Scope (RBAC) | не применяется — платформенный справочник (не tenanted, ADR-0052 п.3) |
| Record-level | не применяется |
| Tenant isolation | не применяется — данные одинаковы для всех tenant-ов |
| Audit | none |
Право на чтение каталога — у любого аутентифицированного пользователя (domain/permission.md: «чтение каталога — любой аутентифицированный»). Практический сценарий (конструктор роли) требует identity.roles.view для доступа к UI, но сам endpoint не приватен: каталог не содержит секретов.
HTTP-контракт
| Поле | Значение |
|---|---|
| Method | GET |
| Route | /api/v1/permissions |
| Success status | 200 |
| Idempotency header | не применяется |
| Correlation | сквозной trace через заголовок traceparent |
Входные данные / параметры запроса
| Поле | Источник | Тип | Обязательность | Валидация / Ограничения | Безопасность |
|---|---|---|---|---|---|
UserId | identity claims | Guid | Да | Required (authenticated) | — |
Context | query | string? | Нет | <= 32; один из 16 контекстов; неизвестный → пустой список (не ошибка) | — |
AssignableByCompaniesOnly | query | bool | Нет | default true — UI ролей компании скрывает платформенные права | — |
IncludeDeprecated | query | bool | Нет | default false | — |
Модель ответа GetPermissionCatalogQueryResult
| Поле | Тип | Обязательность | Источник | Masking | Описание |
|---|---|---|---|---|---|
Items | IReadOnlyList<PermissionCatalogItemModel> | Да | кэш SEED-каталога | — | Права, отсортированы по (Context, Code). |
PermissionCatalogItemModel
| Поле | Тип | Обязательность | Источник | Masking | Описание |
|---|---|---|---|---|---|
Id | Guid | Да | PermissionDefinition.Id | — | Детерминированный Guid (uuid5 от Code). |
Code | string | Да | PermissionDefinition.Code | — | <context>.<entity>.<action>. |
Name | string | Да | PermissionDefinition.Name | — | Название по-русски. |
Description | string | Да | PermissionDefinition.Description | — | Что разрешает. |
Context | string | Да | PermissionDefinition.Context | — | Контекст-владелец enforcement. |
MinScopeType | string (enum ResourceScopeType) | Да | PermissionDefinition.MinScopeType | — | Минимальный scope назначения. |
IsAssignableByCompanies | bool | Да | PermissionDefinition.IsAssignableByCompanies | — | Доступно ли ролям компаний (INV-P4). |
IsDeprecated | bool | Да | PermissionDefinition.IsDeprecated | — | Выведено из употребления. |
Алгоритм
- Контекст и доступ. Операцию выполняет любой аутентифицированный пользователь; tenant/scope не применяется — это платформенный справочник.
- Проверка входа. Синтаксис по таблице входных данных (
Context ≤ 32); иначе —ValidationError. Ссылок на сущности нет. - Что читаем. Весь каталог прав — из in-memory кэша (permission.md: ~140 строк, кэшируется на инстансе; прогрев при старте, инвалидация — только рестарт после SEED-миграции).
- Фильтрация и маппинг. In-memory: при
Context != null— по контексту; приAssignableByCompaniesOnly— толькоIsAssignableByCompanies = true; при!IncludeDeprecated— толькоIsDeprecated = false. Сортировка (Context,Code). Маппинг поле-в-поле по таблице модели. Неизвестное значениеContext— не ошибка: пустой список. - Результат. Каталог прав (
200). Каталог версионируется релизом (INV-P1: записи только SEED-миграцией) — расхождение между инстансами возможно только в окно rolling-deploy (безопасно: клиент получит новые коды после завершения деплоя).
Диаграмма
Побочные эффекты
| Тип | Детали |
|---|---|
| Проекции / кэш | чтение in-memory кэша; HTTP-кэширование — Cache-Control: private, max-age=300 (справочник меняется релизом) |
Ошибки и failure modes
| Код | HTTP status | Условие | Сообщение | Retry |
|---|---|---|---|---|
ValidationError | 400 | Context длиннее 32 симв. | Список ошибок | no retry |
UNAUTHORIZED | 401 | Нет access-токена | — | retry после refresh |
Неизвестное значение Context не приводит к ошибке: возвращается пустой Items (клиент не должен падать на новых контекстах).
Совместимость и наблюдаемость
- Добавление permission — additive (permission.md «Совместимость»); удаление — deprecate → sunset
через 2 релиза; клиенты обязаны игнорировать неизвестные
Context/MinScopeType-значения. - Logs: количество отданных позиций; metrics:
identity_permission_catalog_total; traces: OTel; dashboardidentity-overview; runbook — не применяется.
Acceptance Criteria
- Given любой аутентифицированный пользователь, When
GET /permissionsс дефолтами, Then200; только права сIsAssignableByCompanies = trueиIsDeprecated = false, отсортированы по (Context,Code). - Given
Context = crm, WhenGET, Then в ответе только права контекстаcrm. - Given
Context— несуществующий контекст, WhenGET, Then200сItems = [](не ошибка — клиент не должен падать на новых контекстах). - Given
AssignableByCompaniesOnly = false, WhenGET, Then в ответе присутствуют и права сIsAssignableByCompanies = false(для UI платформенных ролей). - Given
IncludeDeprecated = true, WhenGET, Then права сIsDeprecated = trueвключены. - Given
Contextдлиннее 32 символов, WhenGET, ThenValidationError(400). - Given запрос без access-токена, When
GET, ThenUNAUTHORIZED(401). - Given между двумя запросами не было релиза, When
GETдважды, Then состав каталога идентичен (SEED-данные меняются только релизом, INV-P1); ответ кэшируем (Cache-Control: private, max-age=300).
Обратные ссылки
Автоссылки: где используется этот документ.
- API (2): Identity Company-User API — реестр методов и общие правила области, PUT /api/v1/roles/{roleId}/permissions — Настройка permissions роли
- Use Cases (1): UC-IDN-005. Создание роли компании и назначение агенту в scope проекта
- registries (1): Реестр API-методов PIN
Связанные документы
- Сущность и полный каталог 113: domain/permission.md.
- Использование в ролях: create-company-role.md, set-role-permissions.md.