SHA256
Убрали старый sync и обновили bundle
Что сделано: вычистили неиспользуемый user-settings sync/DM sync хвост, сохранили сборку, обновили bundle.sh так, чтобы gradle-wrapper.jar всегда попадал в архив. Проверено: compileJava и deploy на t2 (server + UI). Не проверяли: полные интеграционные сценарии, ручные UI-флоу и продовый деплой.
This commit is contained in:
@@ -1,104 +1,57 @@
|
||||
# API пользовательских настроек
|
||||
# User Settings API
|
||||
|
||||
Этот раздел описывает `user_settings` - отдельное хранилище пользовательских настроек, не связанное с `users_params` и не связанное с legacy DM-таблицами.
|
||||
user_settings хранит технические настройки пользователя только на его
|
||||
единственном действующем access-сервере. Межсерверной синхронизации настроек
|
||||
нет. При смене access-сервера старые настройки автоматически не переносятся.
|
||||
|
||||
## 1. Назначение
|
||||
## Подпись
|
||||
|
||||
`user_settings` хранит технические пользовательские настройки, которые должны синхронизироваться между максимум двумя access/sync-серверами пользователя.
|
||||
UI формирует строку:
|
||||
|
||||
Основной текущий кейс:
|
||||
SHiNe/UserSettings:<login>|<setting_type>|<setting_key>|<time_ms>|<value_text>|<value_num>
|
||||
|
||||
- `setting_type = 1` - курсор прочитанности канала;
|
||||
- `setting_key = ownerBlockchainName/channelName`;
|
||||
- `value_num = number of messages already seen in channel`;
|
||||
- `value_text = ''`.
|
||||
и подписывает её текущим Ed25519 clientKey пользователя. Сервер:
|
||||
|
||||
Если настройки нет, канал считается полностью прочитанным, то есть unread = `0`.
|
||||
После первого открытия канала UI отправляет текущий курсор, чтобы зафиксировать baseline и дальше считать только новые сообщения.
|
||||
1. находит пользователя;
|
||||
2. проверяет совпадение client_key с актуальным ключом пользователя;
|
||||
3. строго проверяет подпись;
|
||||
4. при неверной подписи возвращает INVALID_SIGNATURE;
|
||||
5. сохраняет запись только если time_ms новее локальной версии.
|
||||
|
||||
## 2. Структура записи
|
||||
## Операции
|
||||
|
||||
- `login` - логин владельца настройки;
|
||||
- `setting_type` - числовой код типа настройки;
|
||||
- `setting_key` - строковый ключ настройки;
|
||||
- `time_ms` - время установки значения в миллисекундах;
|
||||
- `value_text` - строковое значение;
|
||||
- `value_num` - числовое значение;
|
||||
- `client_key` - публичный Ed25519 ключ клиента в Base64;
|
||||
- `signature` - Ed25519 подпись preimage в Base64;
|
||||
- `synced` - была ли настройка успешно доставлена на второй сервер.
|
||||
### UpsertUserSetting
|
||||
|
||||
Уникальность: `(login, setting_type, setting_key)`.
|
||||
Обновление: только если `time_ms` новее текущего значения.
|
||||
Обязательные поля:
|
||||
|
||||
## 3. Формат подписи
|
||||
- login;
|
||||
- setting_type;
|
||||
- setting_key;
|
||||
- time_ms;
|
||||
- client_key;
|
||||
- signature.
|
||||
|
||||
Подписывается строка:
|
||||
Значения:
|
||||
|
||||
`SHiNe/UserSettings:|login|setting_type|setting_key|time_ms|value_text|value_num`
|
||||
- value_text — строковое значение, по умолчанию пустая строка;
|
||||
- value_num — числовое значение, по умолчанию 0.
|
||||
|
||||
Где внутри полей используется экранирование `\` и `|`.
|
||||
Поля sync_delivery и synced удалены.
|
||||
|
||||
Подпись создаётся клиентским `client_key`.
|
||||
### GetUserSetting
|
||||
|
||||
## 4. Операции
|
||||
Возвращает одну локальную настройку по login, setting_type и setting_key.
|
||||
|
||||
### `UpsertUserSetting`
|
||||
### ListUserSettings
|
||||
|
||||
Записывает или обновляет настройку пользователя.
|
||||
Возвращает все локальные настройки пользователя.
|
||||
|
||||
Если запрос пришёл от клиента, сервер:
|
||||
## Удалённые операции
|
||||
|
||||
- сохраняет запись локально;
|
||||
- пытается сразу отправить её на доступный sync-сервер;
|
||||
- если отправка успешна, помечает запись как `synced=true`;
|
||||
- если нет, оставляет `synced=false`.
|
||||
После перехода на один access-сервер удалены:
|
||||
|
||||
Если запрос пришёл по синхронизации между серверами, используется `sync_delivery=true`, и повторной пересылки дальше не делается.
|
||||
- UserSettingsSyncBatch;
|
||||
- MarkAllUserSettingsUnsynced.
|
||||
|
||||
### `GetUserSetting`
|
||||
|
||||
Чтение одной настройки по `(login, setting_type, setting_key)`.
|
||||
|
||||
### `ListUserSettings`
|
||||
|
||||
Список всех настроек пользователя.
|
||||
|
||||
### `UserSettingsSyncBatch`
|
||||
|
||||
Внутренний межсерверный batch-эндпоинт.
|
||||
|
||||
- отдаёт настройки, новые относительно курсора;
|
||||
- используется для bootstrap и догрузки после восстановления;
|
||||
- применяется только для пользователей, чей сервер есть в `access_servers`.
|
||||
|
||||
### `MarkAllUserSettingsUnsynced`
|
||||
|
||||
Внутренний служебный запрос.
|
||||
|
||||
- помечает все настройки пользователя или все настройки сразу как `synced=false`;
|
||||
- одновременно сбрасывает DM-outbox того же пользователя (или всех пользователей), чтобы операция замены/добавления access-сервера не оставила историю DM несинхронизированной;
|
||||
- ответ дополнительно содержит `dmUpdated` — количество сброшенных DM-событий;
|
||||
- нужен после добавления нового sync-сервера или при потере локальной БД.
|
||||
|
||||
## 5. Синхронизация
|
||||
|
||||
Настройки и DM имеют раздельные таблицы и правила ACK, но периодический процесс
|
||||
использует один логический последовательный сеанс поверх постоянного WSS-пула:
|
||||
сначала синхронизирует настройки, затем забирает `DmSyncBatch`. Завершение
|
||||
логического сеанса не закрывает физический сокет.
|
||||
|
||||
- локальная запись создаётся с `synced=false`, если её ещё не подтвердил второй сервер;
|
||||
- если запись пришла с другого сервера, она сохраняется сразу как `synced=true`;
|
||||
- периодический sync раз в 6 часов проверяет несинхронизированные настройки, догружает их по курсору и затем забирает несинхронизированные DM;
|
||||
- если появляется новый sync-сервер или локальная БД была потеряна, нужно пометить все настройки несинхронизированными и заново догрузить batch с нуля.
|
||||
|
||||
## 6. Текущий UI-кейс
|
||||
|
||||
UI при открытии канала отправляет `UpsertUserSetting` с:
|
||||
|
||||
- `setting_type = 1`;
|
||||
- `setting_key = ownerBlockchainName/channelName`;
|
||||
- `value_num = количество уже просмотренных сообщений в канале`.
|
||||
|
||||
Это значение используется сервером для расчёта unread в списке каналов и в канале.
|
||||
Также удалены таблица peer-cursor и периодический сервис синхронизации
|
||||
настроек.
|
||||
|
||||
Reference in New Issue
Block a user