> ## Documentation Index
> Fetch the complete documentation index at: https://docs.yume.cloud/llms.txt
> Use this file to discover all available pages before exploring further.

# Push-токены устройств

> Регистрация мобильных устройств для пуш-уведомлений: модель токена (Expo, идентификатор и тип устройства, признак активности), правило уникальности, регистрация и отписка, а также деактивация и очистка.

Полный перечень полей — в [глоссарии](/ru/logic/notifications/push-tokens-glossary).

## Обзор

Эта страница описывает, как мобильное приложение регистрирует своё устройство для получения пуш-уведомлений и как оно отписывается от них. Пуш-токен устройства — это адрес, по которому облачная служба доставки пушей находит конкретный телефон сотрудника, чтобы показать ему уведомление даже при закрытом приложении.

Механика проста по замыслу: приложение при входе присылает свой пуш-токен, система сохраняет его и держит «активным». Когда доставка на этот адрес перестаёт срабатывать, токен помечается как неактивный и в рассылку больше не попадает. Ниже разобраны модель данных, правила уникальности и очистки, а также два обращения к API — регистрация и отписка.

<Info>
  Каждый токен привязан одновременно к сотруднику и к компании. Один сотрудник может иметь несколько активных токенов — по одному на каждое устройство, с которого он заходит (например, личный и рабочий телефон).
</Info>

## Модель данных

Push-токен устройства хранит всё необходимое для адресной доставки пуша на одно физическое устройство.

| Поле                     | Тип          | Назначение                                                                         |
| ------------------------ | ------------ | ---------------------------------------------------------------------------------- |
| Компания                 | связь        | Арендатор, которому принадлежит токен; может быть пустым                           |
| Пользователь             | связь        | Владелец устройства (сотрудник); у пользователя есть обратный список его токенов   |
| Токен                    | текст        | Собственно пуш-токен устройства (адрес для доставки), до 255 символов              |
| Идентификатор устройства | текст        | Необязательный ID устройства; помогает опознать «то же самое» устройство           |
| Тип устройства           | перечисление | Платформа устройства: iOS, Android или Web; по умолчанию iOS                       |
| Активен                  | флаг         | Участвует ли токен в рассылке; по умолчанию включён                                |
| Последнее использование  | дата/время   | Обновляется автоматически при каждом сохранении записи                             |
| Создан                   | дата/время   | Момент первичного создания записи                                                  |
| Обновлён                 | дата/время   | Момент последнего изменения; по нему выполняется очистка старых неактивных токенов |

### Правило уникальности

Запись считается уникальной по связке из пяти значений: **компания + пользователь + токен + идентификатор устройства + тип устройства**. Это значит, что одна и та же комбинация не может быть заведена дважды — повторная регистрация с теми же значениями обновит существующую запись, а не создаст дубликат.

<Note>
  Идентификатор устройства и тип устройства входят в ключ уникальности. Поэтому одно и то же устройство, зарегистрированное как iOS и как Web, либо с заполненным и с пустым идентификатором устройства, будет представлено разными записями. Это осознанное поведение, а не ошибка.
</Note>

## Регистрация токена

Регистрация выполняется одним обращением к списку токенов. То же обращение возвращает уже сохранённые токены текущего сотрудника в рамках его компании, отсортированные от новых к старым.

### Кто и что видит

* Обращение доступно только авторизованному сотруднику.
* В списке показываются только токены **этого сотрудника в текущей компании** — чужие устройства и устройства из других компаний не видны.

### Что происходит при регистрации

Когда приложение присылает пуш-токен, платформу и (при наличии) идентификатор устройства, система выполняет два шага.

<Steps>
  <Step title="Освобождение устройства от прежних владельцев">
    Система ищет активные токены с тем же пуш-токеном, а если передан идентификатор устройства — то и с тем же идентификатором, **в пределах текущей компании**. Все такие токены, принадлежащие **другим** сотрудникам, деактивируются.

    Это защита от ситуации, когда одним телефоном пользуются по очереди разные сотрудники: пуши не должны приходить прежнему владельцу устройства. Токены других компаний этот шаг не затрагивает — освобождение устройства работает внутри одной компании.
  </Step>

  <Step title="Создание или обновление собственной записи">
    Затем система создаёт или обновляет запись текущего сотрудника по связке «компания + сотрудник + токен + идентификатор устройства + тип устройства» и принудительно ставит признак «активен». Если запись уже существовала (например, сотрудник переустановил приложение и снова прислал тот же токен), она просто снова включается, а не задваивается.
  </Step>
</Steps>

<Warning>
  Часть полей при регистрации задаётся системой и не принимается от клиента: признак активности, время последнего использования, служебные даты и внутренний идентификатор. Даже если приложение пришлёт «активен = нет», токен всё равно будет создан активным — статус на этом шаге всегда выставляется системой.
</Warning>

<Note>
  Компания для новой записи берётся из контекста текущего запроса (той компании, в которой работает сотрудник), а не из присланных данных. Поэтому зарегистрировать токен «в чужую компанию» через это обращение нельзя.
</Note>

## Отписка устройства

Отдельное обращение позволяет отписать устройство от пушей по его идентификатору устройства.

* Обращение доступно только авторизованному сотруднику.
* В запросе обязателен идентификатор устройства.
* Система находит токены **текущего сотрудника в текущей компании** с этим идентификатором устройства и деактивирует их.

<Note>
  Отписка ограничена собственными токенами сотрудника: если одним и тем же устройством пользуются несколько сотрудников компании, отписка одного из них не выключит пуши остальным. Отписка не удаляет записи, а лишь снимает признак активности.
</Note>

## Как токены выходят из оборота

У токена есть два способа перестать участвовать в рассылке.

### Деактивация при недоставке

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

<Tip>
  Деактивация по недоставке снимает признак активности у всех записей с этим пуш-токеном, независимо от владельца и компании (отбор идёт только по значению самого пуш-токена) — так «мёртвый» адрес гарантированно исключается из будущих рассылок.
</Tip>

### Очистка старых неактивных токенов

Неактивные токены не удаляются сразу. Отдельная фоновая процедура периодически убирает неактивные записи, которые не менялись дольше **30 дней** (отсчёт ведётся по времени последнего обновления записи). Это не даёт таблице разрастаться, но при этом оставляет запас времени: если устройство вернётся в строй вскоре после деактивации, его запись ещё существует.

## Как это используется

* **Мобильный push (служба доставки Expo).** При рассылке уведомления система берёт из этого хранилища активные токены получателей в рамках их компании и отправляет пуш на каждое устройство. Неактивные токены в выборку не попадают.
* **Синхронизация владельца устройства.** Логика «освобождения устройства» при регистрации гарантирует, что на конкретном телефоне активен токен только текущего вошедшего сотрудника.
* **Гигиена данных.** Связка «деактивация при недоставке + периодическая очистка старше 30 дней» поддерживает актуальность списка адресов без ручного вмешательства.

## Особенности поведения

* При регистрации признак активности не принимается от клиента и всегда принудительно выставляется во «включён», даже если прислать обратное значение.
* Идентификатор устройства и тип устройства входят в ключ уникальности, поэтому одно и то же физическое устройство с разным типом (iOS/Web) или с пустым и заполненным идентификатором даёт отдельные записи, а не одну.
* При регистрации все активные токены с тем же пуш-токеном (или тем же идентификатором устройства) у других сотрудников **этой же компании** деактивируются — это осознанная передача устройства новому владельцу; на другие компании шаг не распространяется.
* Отписка устройства выключает только токены самого сотрудника, сделавшего запрос, — пуши другим сотрудникам компании она не гасит.
* Деактивация при недоставке снимает активность у всех записей с данным пуш-токеном независимо от владельца и компании, так как отбор идёт только по значению токена.
* Деактивация при недоставке срабатывает не на любую ошибку рассылки, а только когда служба доставки сообщает о недействительном адресе или о том, что устройство больше не зарегистрировано.
* Неактивные токены не удаляются сразу: очистка убирает их только когда запись не менялась дольше 30 дней (по времени последнего обновления).
* Компания у нового токена берётся из контекста запроса, а поле компании в модели допускает пустое значение.
* Рассылка пушей выбирает только активные токены получателей в пределах компании и отправляет их через службу доставки Expo.
* Отдельный механизм обновления статуса токена описан в коде, но в обращениях регистрации и отписки не используется — доступны только список/создание и отписка.

## Связанные страницы

<CardGroup cols={2}>
  <Card title="Глоссарий: Push-токены устройств" icon="book" href="/ru/logic/notifications/push-tokens-glossary">
    Полный перечень полей модели токена, типов устройств и служебных признаков.
  </Card>

  <Card title="Уведомления (доставка и доступ)" icon="bell" href="/ru/logic/notifications">
    Обзорная страница модуля уведомлений: доставка, каналы и доступы.
  </Card>

  <Card title="Модель и веер доставки" icon="sitemap" href="/ru/logic/notifications/model-dispatch">
    Модели уведомления и его получателей, сигнал сохранения и разветвление доставки по каналам с учётом доступов.
  </Card>

  <Card title="Создание и группировка" icon="layer-group" href="/ru/logic/notifications/creation-grouping">
    Фоновые задачи создания уведомлений: одиночные, обновление по объекту и группировка в 30-минутном окне.
  </Card>

  <Card title="Каналы доставки" icon="tower-broadcast" href="/ru/logic/notifications/delivery-channels">
    Транспортные задачи и сервис доставки: веб-канал, мобильный push с деактивацией мёртвых токенов и Telegram.
  </Card>

  <Card title="Чтение, архивация и список" icon="envelope-open" href="/ru/logic/notifications/read-archive">
    Адреса списка, счётчика непрочитанных, отметки прочтения и архивации, включая логику «первый забрал».
  </Card>

  <Card title="Привязка Telegram" icon="paper-plane" href="/ru/logic/notifications/telegram-link">
    Привязка и отвязка аккаунта сотрудника к Telegram-боту по одноразовому коду верификации.
  </Card>

  <Card title="Доступ и настройки" icon="sliders" href="/ru/logic/notifications/access-settings">
    Матрица доступов «источник × тема» на пользователя и массовое редактирование настроек уведомлений.
  </Card>
</CardGroup>
