Server-side DM dialogs state

This commit is contained in:
AidarKC
2026-08-22 18:31:32 +04:00
parent c70f18fcf4
commit 781157299f
13 changed files with 666 additions and 9 deletions
@@ -334,6 +334,25 @@
### 8.2. Новые методы, которые нужны
### 8.3. Серверный слой диалогов
Помимо хранения самих DM-сообщений сервер поддерживает материализованный слой состояния диалогов:
- отдельная запись на пару `owner_login` + `peer_login`;
- `relation_flag` со значениями `close_friend`, `contact`, `none`;
- `last_message_blob_b64` как последний контентный signed DM block в base64;
- `last_message_time_ms`;
- `unread_count`;
- `last_read_receipt_time_ms` как watermark последнего подтверждения прочтения.
Ключевые правила:
- `close_friend` всегда имеет приоритет над `contact`;
- если `read receipt` приходит не по порядку, сервер хранит наибольший watermark и не откатывает состояние назад;
- `unread_count` пересчитывается сервером по сообщениям диалога с учётом watermark и `read_at_ms`;
- старые исторические данные восстанавливаются из `signed_messages` при инициализации/миграции;
- UI не должен собирать inbox только из локального кеша, когда ему доступен серверный список диалогов.
## 9. Правила валидации и применения
### 9.1. Общее правило по ревизиям
@@ -252,6 +252,15 @@ ReadReceiptBody_v1_0
Различается только `messageType` и формат `body`.
### Серверное примечание
Внешний байтовый формат `type=3/4` не меняется, но сервер использует такие контейнеры как вход для обновления `dm_dialog_state`:
- `read receipt` обновляет серверный watermark диалога;
- `unreadCount` пересчитывается на сервере, а не только на клиенте;
- если подтверждение прочтения приходит в другом порядке, сервер сохраняет максимальный watermark и не откатывает счётчик назад.
- в списке диалогов сервер может отдавать последний signed block как `lastMessageBlobB64` без попытки извлечь plaintext preview.
## 9. Контент типов `5/6`
Типы: