Что это за слой
Эта страница описывает слой прав и настроек уведомлений: как для каждого сотрудника хранится матрица «канал × тема», кто её видит и редактирует, и как система сама достраивает недостающие строки, чтобы у любого сотрудника всегда был полный набор переключателей. Идея простая: у каждого сотрудника есть таблица подписок. По строкам — темы событий (например, «Заявка забронирована», «Возврат по операции», «Низкий баланс SMS»), по столбцам — три канала доставки: веб, мобильный push и Telegram. На пересечении стоит флажок «Включено/Выключено». Именно этот флажок решает, придёт ли конкретному сотруднику конкретный тип события по конкретному каналу.Полная матрица одного сотрудника — это три канала, умноженные на весь каталог тем. На момент написания каталог содержит 27 тем, значит полная матрица — это 3 × 27 = 81 строка на сотрудника.
Модель данных
Каждая запись «Доступ к уведомлениям» — это одна ячейка матрицы: связка сотрудника, канала и темы плюс флаг включения.Комбинация «компания + сотрудник + канал + тема» уникальна. То есть для одного сотрудника не может быть двух строк с одинаковой парой «канал × тема» — на каждую ячейку матрицы приходится ровно одна запись.
Каналы доставки
Каналов ровно три:Каталог тем
Тема — это классификатор события. Он используется не только для управления доступом, но и для фильтрации и группировки уведомлений в других частях модуля. Ниже — полный каталог тем, сгруппированный по смыслу. Служебная- По умолчанию — общая тема для событий без отдельной классификации.
- Заявка забронирована
- Заявка завершена
- Просрочка по заявке
- Смена статуса оплаты заявки
- Операция создана
- Возврат по операции
- Операция удалена
- Превышен лимит долга клиента
- Клиент добавлен в чёрный список
- Документ создан
- Документ подписан
- Инвентаризация создана
- Чек-лист инвентаризации
- Доставка назначена
- Смена статуса доставки
- Доставка завершена
- Доставка отменена
- Подходит срок ТО
- ТО назначено
- ТО завершено
- Инвентарь сломан
- Низкий баланс SMS
- Ошибка SMS
- Возврат SMS
- Штраф создан (сервис автомобильных штрафов)
- Получено сообщение Wazzup
Как сотрудник видит и меняет свои настройки
Есть один адрес настроек доступа. Он доступен только авторизованному сотруднику и работает всегда в контексте текущей компании и текущего пользователя — то есть сотрудник видит и меняет только свои собственные настройки. Постраничная разбивка отключена: список всегда возвращается целиком. Адрес совмещает два режима:- Чтение (запрос списка) — отдаёт матрицу доступов сотрудника. При этом служебные поля (компания и владелец) в ответ не включаются: наружу отдаются канал, тема, флаг включения и технический идентификатор строки.
- Запись (массовое обновление) — принимает список настроек и применяет их разом.
Ленивое досоздание полной матрицы
Ключевая особенность режима чтения: система не требует, чтобы матрица была заранее заполнена. При запросе списка она сравнивает количество уже существующих строк сотрудника с размером полной матрицы (все каналы × все темы).- Если строк ровно столько, сколько нужно, — просто возвращает их.
- Если число строк не совпадает с эталоном (обычно строк меньше — сотрудник новый, либо в каталог добавились новые темы/каналы), система на лету создаёт все недостающие ячейки со значением «Включено» и затем возвращает уже полную матрицу.
Досоздание всегда включает недостающие ячейки. То есть новые темы, появившиеся в каталоге, для всех сотрудников по умолчанию оказываются включёнными — согласие на новые типы уведомлений выдаётся автоматически, а не запрашивается.
Массовое обновление (создать или обновить)
Режим записи принимает не одну ячейку, а список настроек. Каждый элемент списка — это тройка: канал, тема и новое значение флага «Включено». Обработка идёт единой транзакцией и работает по принципу «создать или обновить»:- Система сначала считывает, какие пары «канал × тема» у сотрудника уже есть.
- Те элементы списка, для которых строки ещё нет, — создаются с переданным значением флага.
- Те, для которых строка уже существует, — обновляются: у них меняется только флаг «Включено».
Обновление затрагивает исключительно флаг включения. Канал и тему у существующей строки массовое обновление не переписывает — пара «канал × тема» служит ключом, по которому находится нужная ячейка.
Обе части — создание недостающих и обновление существующих — выполняются в одной транзакции. Если что-то пойдёт не так, изменения не применятся частично: либо весь пакет настроек сохраняется, либо ничего.
Как это используется дальше
Матрица доступов задумана как источник правды о том, кому и куда доставлять уведомления. При рассылке события система сверяется с флагами включения соответствующих ячеек, чтобы отобрать получателей по нужным каналам. Таким образом слой доступа работает как «предохранитель» веерной рассылки: даже если событие сгенерировано, конкретный сотрудник получит его по конкретному каналу только тогда, когда у него включена соответствующая ячейка матрицы.Особенности поведения
- Все недостающие ячейки при ленивом досоздании создаются со значением «Включено», поэтому новые темы, добавленные в каталог, для всех сотрудников автоматически оказываются подписанными без явного согласия.
- Создание недостающих строк и обновление существующих при массовом сохранении выполняются в одной транзакции, поэтому частичное применение пакета невозможно: либо сохраняется всё, либо ничего.
- Массовое обновление меняет у существующей строки только флаг включения; канал и тема при обновлении не переписываются — они служат ключом поиска ячейки.
- Адрес всегда работает только с настройками текущего сотрудника в текущей компании и не позволяет читать или менять чужие подписки; постраничная разбивка отключена.
- Размер полной матрицы вычисляется как произведение числа каналов на число тем (на момент написания 3 × 27 = 81 строка на сотрудника) и растёт автоматически при расширении каталога тем.
Связанные страницы
Глоссарий: Доступ и настройки
Полный перечень полей модели доступа, каналов и тем с точными названиями и назначением.
Уведомления (доставка и доступ)
Обзорная страница модуля уведомлений: доставка, создание, каналы и права доступа.
Модель и веер доставки
Модели уведомления и его получателей, сигнал сохранения и разветвление доставки по каналам с учётом доступов.
Создание и группировка
Фоновые задачи создания уведомлений: одиночные, по объекту и сгруппированные в 30-минутном окне.
Каналы доставки
Транспортные задачи и сервис: веб-доставка, мобильный push с деактивацией мёртвых токенов и Telegram-рассылка.
Чтение, архивация и список
Адреса списка, счётчика непрочитанных, отметки прочтения и архивации с фильтрами.
Push-токены устройств
Регистрация и отписка push-токенов мобильных устройств сотрудника с уникальностью по устройству.
Привязка Telegram
Привязка и отвязка аккаунта сотрудника к Telegram-боту по одноразовому коду верификации.