Доступ к заявке (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-доступ, а затем другая задача выдала доступ тому же субъекту по той же заявке, текущая строка заменяется данными последней команды.