RIDERSRUN

Доступ и восстановление

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

Вход в управление

Панель открывается после ввода логина и пароля. В публичном демонстрационном стенде admin / admin уже заполнены. Эти общедоступные данные предназначены для демонстрации, а при внедрении заменяются персональными учетными записями.

GET /admin/session возвращает состояние входа. POST проверяет логин, пароль и generationId, DELETE завершает вход. Сессионная cookie используется и в интерфейсе, и в API.

POST /api/v1/admin/session
{"generationId":"<из /session>","login":"admin","password":"admin"}
Открыть управление

Действие и конкретный объект

Просмотр области показывает первые пять реальных объектов с названиями и фотографиями. Кнопка «Далее» загружает следующие; можно свернуть список обратно. Для раздела показываются входящие в него товары. В итоговых правах, персональных настройках и наследуемых правилах используется тот же просмотр. Закрытые блоки не загружают списки заранее.

Просмотр товара, публикация, возврат оплаты и проведение складского действия — независимые права. Разрешение содержит устойчивый код действия и область: все объекты, выбранные разделы каталога или конкретные идентификаторы.

Все разделы, включая каталог, настраиваются одинаково: выберите роль в разделе и раскройте «Уточнить права». Действия можно ограничить целыми разделами, отдельными товарами, заказами и другими объектами через поиск с карточками.

Основная роль применяется по умолчанию. Для отдельного раздела можно назначить другую роль (mode: role, roleId), уточнить действия персонально (custom) или запретить доступ (deny). Уточнение полностью заменяет роль только в этом разделе; пустой список означает запрет. Изменения выбранной роли учитываются и для ее назначений отдельным разделам.

Если роль разрешает весь каталог, а персонально выбран только просмотр товара Ливень, сотрудник видит только этот товар и не может его редактировать. Заказы продолжают наследовать роль. Опубликованная витрина остается публичной.

GET /api/v1/admin/access/actions
GET /api/v1/admin/access/objects?action=products.view&q=Ливень

"overrides": {
  "products": {
    "mode": "custom",
    "rules": [{"action":"products.view","scope":{"all":false,"ids":["p-021"]}}]
  }
}
Команда и доступ

Выдать права и увидеть последствия

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

Перед сохранением сервер рассчитывает измененный доступ прямых и зависимых получателей. Можно сузить связанные назначения или принять их на себя, если собственных полномочий достаточно. Независимые действующие назначения сохраняются.

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

POST /api/v1/admin/access/changes/preview
{"generationId":"<текущий>","kind":"employees","id":"<ID>","revision":1,"name":"Редактор","login":"editor","roleId":"viewer","overrides":{"products":{"mode":"deny","rules":[]}},"consequences":"cascade"}

POST /api/v1/admin/access/changes/apply
<тот же запрос с token из предварительного расчета>

GET /api/v1/admin/access/employees/<ID>/effective
POST /api/v1/admin/access/employees/<ID>/check
{"action":"products.view","target":{"id":"p-021"}}

Те же операции доступны AI

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

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

Обычный пакет применяется целиком. Внешние отправки подтверждаются отдельно; неопределенный ответ помечается для проверки, а не объявляется отмененным. Интерактивная запись звука, звонок и ввод пароля остаются в специализированном интерфейсе.

GET /api/v1/admin/ai/tools
POST /api/v1/admin/ai/tools/read
{"tool":"products.view","parameters":{},"query":{"view":"table"}}

POST /api/v1/admin/ai/tools/prepare
{"generationId":"<текущий>","idempotencyKey":"batch-1","calls":[{"tool":"products.draft.save","parameters":{"id":"p-021"},"body":{"baseRevision":1,"draftRevision":0,"fields":{"name":"Ливень"}}}]}

POST /api/v1/admin/ai/tools/confirm
{"generationId":"<текущий>","id":"<proposalId>"}
Открыть AI-сотрудника

Ограничения на сервере

Списки, счетчики, поиск, прямые адреса, версии, вложения и экспорт учитывают разрешенные объекты. Нельзя обойти запрет через прежний API или инструмент AI. Доступ к заказу включает его сохраненный состав, но не открывает редактор товара.

Права и основания выдачи хранятся отдельно от каталога в связанных таблицах PostgreSQL. Для выбора конкретных объектов используются индексированные связи. Новые действия не добавляются автоматически обычным ролям.

Подключения 1С и каналов переписки используют выделенную ограниченную учетную запись. Ее идентификатор настраивается на сервере; без такой настройки фоновое выполнение закрыто. Секреты не передаются AI.

Спецификация API

Удалить из продажи и восстановить

DELETE /admin/products/{id} перемещает товар в корзину удаленных. Нужны текущие generationId и revision. Это мягкое удаление: физического удаления через этот метод нет. Повторное удаление не продлевает срок восстановления.

Восстановление доступно в течение 30 дней с даты удаления. Сохраняются прежний адрес, SEO, фотографии и варианты. Актуальные цены, остатки и история заказов не откатываются. По истечении 30 дней автоматическое восстановление закрывается, учетные записи остаются для связности истории.

В текущем демонстрационном стенде общий часовой сброс имеет приоритет над 30-дневным сроком. После сброса изменения и созданные сотрудниками учетные записи очищаются.

GET /api/v1/admin/trash

DELETE /api/v1/admin/products/p-021
{"generationId":"<текущий>","revision":1}

POST /api/v1/admin/products/p-021/restore
{"generationId":"<текущий>","revision":2}
Корзина удаленных

Бренд как связанная сущность

Создайте бренд, добавьте название, описание, адрес и логотип SVG или растровое изображение. Загрузчик поддерживает файл, ссылку, буфер обмена и перетаскивание. SVG проверяется: скрипты, активное содержимое и внешние ресурсы запрещены.

Черновик остается в редакторе до публикации. Публичная страница /brands/{slug} показывает описание и все доступные товары бренда. При изменении адреса прежняя ссылка перенаправляется на актуальную с кодом 301.

Бренды