5.1 KiB
5.1 KiB
07. Channels Feature Runbook (человеческое описание + диагностика)
1) Что уже сделано простыми словами
Сейчас реализован полный минимальный контур для каналов:
-
Серверные read API:
ListSubscriptionsFeed— экран списка каналов.GetChannelMessages— сообщения конкретного канала.GetMessageThread— дерево обсуждения для сообщения.
-
UI вкладки Каналы:
- при открытии пытается загрузить реальный feed с сервера;
- если сервер недоступен — fallback на мок-данные;
- группы каналов выводятся в нужном порядке;
- есть кнопка «Добавить канал», модалки подписки, переход в канал.
-
Проверка уникальности имени канала на сервере
- в
AddBlockприCreateChannelBodyдобавлена проверка; - при дубле возвращается
409 channel_name_already_exists.
- в
2) Что тестировать в первую очередь (быстрый чеклист)
Базовый smoke
- Авторизоваться в UI.
- Открыть вкладку «Каналы».
- Убедиться, что данные загрузились с сервера (или виден fallback-баннер).
- Нажать любой канал — должен открыться экран канала с сообщениями.
API smoke
- Вызвать
ListSubscriptionsFeed. - Для канала
ownedChannels[0]вызватьGetChannelMessages. - Для первого
messages[0]вызватьGetMessageThread.
Ошибки
ListSubscriptionsFeedс пустым login ->bad_fields.GetChannelMessagesс битым channel payload ->bad_fields.GetMessageThreadс несуществующим block ->message_not_found.AddBlock(CreateChannel)с уже существующим именем ->channel_name_already_exists.
3) Готовые JSON-запросы для ручной диагностики
3.1 ListSubscriptionsFeed
{
"op": "ListSubscriptionsFeed",
"requestId": "debug-feed-1",
"payload": {
"login": "TestUser1",
"limit": 200
}
}
3.2 GetChannelMessages
{
"op": "GetChannelMessages",
"requestId": "debug-ch-1",
"payload": {
"channel": {
"ownerBlockchainName": "TestUser1-001",
"channelRootBlockNumber": 0,
"channelRootBlockHash": ""
},
"limit": 200,
"sort": "asc"
}
}
3.3 GetMessageThread
{
"op": "GetMessageThread",
"requestId": "debug-thread-1",
"payload": {
"message": {
"blockchainName": "TestUser1-001",
"blockNumber": 123,
"blockHash": "<hash-from-GetChannelMessages>"
},
"depthUp": 20,
"depthDown": 2,
"limitChildrenPerNode": 50
}
}
4) Что смотреть в ответах
ListSubscriptionsFeed
payload.login— канонический login.ownedChannels / followedUsersChannels / followedChannels— массивы.- у каждой записи есть:
channel.channelRoot.blockNumber,messagesCount,lastMessage(может быть null, если сообщений нет).
GetChannelMessages
payload.channelзаполнен;payload.messages[]содержит:likesCount,repliesCount,versionsTotal,versions[],textдолжен быть текущей (последней) версией.
GetMessageThread
payload.ancestors[],payload.focus,payload.descendants[].- у узлов должны быть версии и счетчики.
5) Частые проблемы и как быстро локализовать
-
status != 200, code=bad_fields- проверить вложенность payload и обязательные поля.
-
message_not_foundв GetMessageThread- обычно передали blockNumber/hash не из
messageRef.
- обычно передали blockNumber/hash не из
-
Пустой список сообщений в GetChannelMessages
- проверить
ownerBlockchainNameиchannelRootBlockNumber.
- проверить
-
channel_name_already_existsпри AddBlock- это ожидаемо: в этой цепочке уже есть канал с таким именем.
6) Для будущей доработки
- Добавить курсоры (пагинацию) для больших каналов.
- Перевести «Подписаться»/«Добавить канал» в UI с демо-заглушек на реальные write RPC.
- Добавить batch-агрегации для thread/versions (оптимизация).
- Добавить полноценные интеграционные тесты на негативные кейсы и нагрузку.