JID

Работа ведётся в командах. Внутри команды есть контакты, задачи, групповые чаты. Контакт из одной команды не может просто так общаться с контактом из другой.

Каждый пользователь в команде имеет идентификатор вида d-<UID>. По историческим причинам он называется JID.

В скольких командах состоит пользователь, столько у него и JID. Если пользователь состоит в 3 командах, у него 3 JID. Если пользователь новый, то JID у него ещё нет.

Групповые чаты тоже имеют JID, немного другой: g-<UID>.

Поле is_archive

Из системы ничего не удаляется, просто выставляется флаг is_archive. Исключение: устройства.

Поля can_*

Если известно, кто запрашивает объект, у него появляются дополнительные поля can_ЧТО-НИБУДЬ. Они означают, «могу ли я, запрашивающий, делать с этим объектом ЧТО-НИБУДЬ».

Примеры:

  • {"can_send_message": false} в своём профиле означает, что я НЕ могу послать себе сообщение.
  • {"can_add_to_team": true} в команде означает, что я МОГУ добавляеть новых участников в команду (вероятно я администратор, а может владелец)

В реальности этих полей в базе не существует — они вычисляются на лету.

Для чего это надо: чтобы логика была по-максимуму в одном месте.

Например, мы решаем, что теперь можно слать себе сообщения. Немного изменяем сервер, и если приложения проверяли не «это я себе пишу, или не себе пишу», а тупо смотрели на флаг can_send_message, то больше никаких изменений вносить не надо: оба мобильных клиента и веб-клиент сразу меняют свою логику.

Второй пример: мы можем когда-нибудь завести новую сущность «администратор с настраиваемыми правами». При использовании флагов can_* можно про это не думать: в старых приложениях ничего не сломается.

/features.json

В корне есть файл features.json с полями, которые зависят от инсталляции. На разных нодах могут быть включены разные возможности.

Файл не является частью API. У API может меняться версия, старые версии могут отключаться, меняться способ авторизации. А этот файл будет на этом месте всё время.

Также есть обёртка features.js. Достаточно включить её как скрипт, и она создаст window.FEATURES.