Внутренний чат

Внутренний чат — мессенджер между сотрудниками одного домена. Бывает двух видов: личный (один на один, DICPersonal) и групповой (DICGroup). Обмен идёт по WebSocket поверх общего соединения приложения с подпиской на канал chat|internal.

Подключение

Соединение, аутентификация и подписка выполняются через объект WebSocketMember (общий для всех WebSocket-соединений).

Сразу после установки соединения сервер присылает:

{
  "action": "connect",
  "obj": "WebSocketMember",
  "code": 200,
  "action_id": "<uuid>"
}

Клиент авторизуется (в params — JWT-токен в поле authorization):

{
  "obj": "WebSocketMember",
  "action": "auth",
  "action_id": "<uuid>",
  "params": { "authorization": "<JWT-токен>" }
}

Затем подписывается на канал внутреннего чата:

{
  "obj": "WebSocketMember",
  "action": "subscribe",
  "action_id": "<uuid>",
  "params": { "name": "chat|internal" }
}

Отписка — действие unsubscribe с тем же name. Для поддержания соединения сервер шлёт ping, клиент отвечает pong (копируя dt из запроса).

Объекты

Личный чат:

Групповой чат:

DICPersonal — личный чат

Name

Type

Description

Описание

id

Integer

PK, auto

ID чата

members

List[Integer]

required, min_size=2, max_size=2, уникальная пара

Два участника (ID сотрудников)

params

Dict

ключ — ID сотрудника → DICPersonalParams, default={}

Персональные настройки участников

Настройки участника (DICPersonalParams): mute (логический, по умолчанию false) — отключить уведомления.

DICPersonalMessage — сообщение личного чата

Name

Type

Description

Описание

id

Integer

PK, auto

ID сообщения

chat_id

Integer

required, FK → DICPersonal.id

ID личного чата

create_dt

Timestamp

not null

Время создания

update_dt

Timestamp

nullable

Время редактирования

delete_dt

Timestamp

nullable

Время удаления (soft-delete)

sender

Integer

required

ID отправителя (сотрудника)

message

PolyModelType

required, один из типов DICHM*

Тело сообщения

status

Integer

required, choices=[0, 1, 2], default=0

Статус прочтения

DICGroup — групповой чат

Name

Type

Description

Описание

id

Integer

PK, auto

ID группового чата

members

List[Integer]

required, min_size=0, max_size=10000

Участники (без администраторов)

admins

List[Integer]

required, min_size=1, max_size=10000

Администраторы (хотя бы один)

params

Dict

ключ — ID сотрудника → DICMemberParams, default={}

Персональные настройки участников

detail

ModelType

required, DICGroupDetail

Название и иконка чата

is_deleted

Boolean

required, default=False

Признак удаления (soft-delete)

DICGroupDetail: icon (строка, обязательно) — иконка; name (строка, обязательно, min_length=2) — название. Настройки участника (DICMemberParams): mute (логический, по умолчанию false).

Примечание

Автор чата должен быть в admins и не должен быть в members; списки admins и members не пересекаются.

DICGroupMessage — сообщение группового чата

Name

Type

Description

Описание

id

Integer

PK, auto

ID сообщения

chat_id

Integer

FK → DICGroup.id

ID группового чата

create_dt

Timestamp

not null

Время создания

update_dt

Timestamp

nullable

Время редактирования

delete_dt

Timestamp

nullable

Время удаления (soft-delete)

sender

Integer

required

ID отправителя

message

PolyModelType

required, один из типов DICHM*

Тело сообщения

status

Dict

ключ — ID сотрудника → {d, s}

Статусы прочтения по участникам

Элемент статуса: d (число, unix-время установки статуса), s (число, choices=[0, 1, 2], default=1).

Действия

DICPersonal: list, list_with_detail (со счётчиком непрочитанных и последним сообщением), get, append (members: [id1, id2]), delete.

DICPersonalMessage: list, append (chat_id, message), update (только отправитель), status_update (status — только получатель), delete (soft-delete, только отправитель), file_upload (chat_id + multipart-поле file_data, до 15 МБ).

DICGroup: list, list_with_detail, get, append (members, admins, detail), detail_update (только админ), update_members_and_admins (только админ), leave (выйти из чата), delete (пометить удалённым).

DICGroupMessage: list, append, update, status_update, delete, file_upload.

Типы сообщений (model_name)

Тип

Назначение

DICHMSimpleText

Текстовое сообщение (поле value)

DICHMHTMLText

HTML-сообщение (value)

DICHMMarkDownText

Сообщение в Markdown (value)

DICHMFile

Файловое вложение (name, size, link; через file_upload)

DICHMTypes

Индикатор набора текста (не сохраняется в БД)

DICHMImageBase64

Изображение в base64 (image, caption)

DICHMImageListBase64

Несколько изображений в base64 (images, caption)

Статусы сообщения

  • 0 — сохранено, не прочитано;

  • 1 — доставлено;

  • 2 — прочитано.