Доступ к заявке — UniBPM
  • Ru

Доступ к заявке (TicketPermission)

Доступ к заявке (TicketPermission) — механизм точечной выдачи прав на одну конкретную заявку.

Он используется, когда пользователю, группе или сервисному аккаунту нужно открыть отдельную заявку без доступа ко всему пространству.

TicketPermission не заменяет доступ к пространству: он не даёт права на другие заявки, настройки пространства или управление участниками.

Основная модель

Для одной пары заявка + субъект хранится один текущий доступ.

Если для той же заявки и того же субъекта приходит новая команда выдачи доступа, система не создаёт второй независимый доступ, а заменяет состояние текущей строки.

Это означает:

  • MANUAL и TASK не складываются;
  • предыдущий доступ не хранится как отдельный слой;
  • последняя controlled grant-команда определяет текущее состояние доступа.

Субъект доступа

Доступ к заявке может быть выдан одному субъекту:

  • пользователю;
  • группе;
  • сервисному аккаунту.

В одной записи должен быть заполнен ровно один субъект.

Уровни доступа

READ

Позволяет открыть и читать заявку.

COMMENT

Позволяет читать заявку и оставлять комментарии.

EDIT

Позволяет читать, комментировать и изменять заявку.

Этот уровень не даёт право управлять доступом к заявке или настройками пространства.

Дополнительные возможности

SIGN

SIGN разрешает подписывать документы или вложения, если действие требует отдельного права подписи.

SIGN не даёт право изменять поля заявки.
Если пользователь может изменять заявку через EDIT или более широкий доступ, возможность подписи считается частью более широкого доступа.

Источник доступа

MANUAL

Ручной доступ, выданный пользователем с правом управления доступом к заявке.

Такой доступ можно редактировать и удалять через интерфейс управления доступом.

TASK

Доступ, выданный задачей или процессным сценарием.

TASK-доступ связан с задачей, и эта задача должна относиться к той же заявке.
Такой доступ отображается как процессный и не редактируется напрямую через обычные CRUD-операции.

TASK можно заменить новой controlled grant-командой. Например, пользователь с правом управления доступом может выдать ручной доступ тому же субъекту; после этого строка станет MANUAL и больше не будет связана с задачей.

Срок действия

Поле expiresAt задаёт срок действия доступа.

  • Если expiresAt не указан, доступ действует бессрочно.
  • Если срок истёк, grant больше не считается активным.
  • Истечение срока не восстанавливает предыдущий доступ, потому что предыдущие состояния не хранятся как stack/history.

Replace-current semantics

Доступы MANUAL и TASK не складываются. Система хранит один текущий доступ для пары заявка + субъект.

Новая команда выдачи доступа заменяет текущее состояние:

  • если TASK заменил MANUAL, старый ручной доступ не восстановится после истечения или отзыва TASK;
  • если MANUAL заменил TASK, строка становится ручной и теряет связь с задачей;
  • если TASK от одной задачи заменён TASK от другой задачи, текущая строка будет связана с последней задачей.

API

Основная команда выдачи доступа:

POST /api/ticket-permission/actions/grant

Она принимает скалярный запрос, поддерживает MANUAL и TASK, создаёт доступ при отсутствии строки или заменяет текущее состояние существующей строки.

Обычный:

POST /api/ticket-permission

оставлен для совместимости с ручной выдачей доступа и поддерживает только MANUAL.

Ограничения CRUD

TASK-доступ нельзя напрямую редактировать или удалять через обычные PUT / DELETE CRUD-операции.

Это защищает процессный доступ от случайного ручного изменения. Если такой доступ нужно заменить, используется controlled grant-команда.

После замены на MANUAL строка становится ручной и может редактироваться или удаляться как обычный ручной доступ.

Ограничения уникальности

В базе хранится одна строка доступа на заявку и субъект:

  • ticket_id + user_id;
  • ticket_id + group_id;
  • ticket_id + service_account_id.

sourceType, task и expiresAt не входят в уникальность, потому что это состояние текущего доступа, а не отдельные записи истории.

Что не поддерживается

Система не поддерживает:

  • доступ через Permission.ticketType как актуальную модель;
  • несколько одновременных MANUAL и TASK доступов для одной заявки и субъекта;
  • автоматическое восстановление старого MANUAL после истечения или отзыва TASK;
  • историю всех событий выдачи доступа внутри TicketPermission;
  • прямое редактирование или удаление TASK через CRUD.

Примеры

Нет доступа → MANUAL READ

Пользователю выдали ручной READ.
Он может открыть и читать эту заявку, но не получает доступ ко всему пространству.

MANUAL READ → TASK EDIT до пятницы

У пользователя был ручной READ.
Задача выдала TASK EDIT со сроком до пятницы.

Текущий доступ стал TASK EDIT до пятницы. Старый MANUAL READ больше не хранится как отдельный активный слой.

TASK EDIT истёк

Когда срок TASK EDIT истёк, доступ перестал быть активным.
Старый MANUAL READ не восстановился автоматически.

TASK READ → MANUAL COMMENT

Пользователь с правом управления доступом выдал тому же субъекту ручной COMMENT.

Текущий доступ стал MANUAL COMMENT, а связь с задачей была очищена.

TASK от task-1 → TASK от task-2

Если одна задача выдала TASK-доступ, а затем другая задача выдала доступ тому же субъекту по той же заявке, текущая строка заменяется данными последней команды.