mirror of
https://github.com/anyproto/anytype-heart.git
synced 2025-06-11 18:20:33 +09:00
6.6 KiB
6.6 KiB
User stories
0. Как ответы задавать
// 1. Избыточная информация, плюс Result получится слишком кастомным
Package (id:'0x765', Reply {to:'0x123', error:Error{ type:WRONG_MNEMONIC, message:'Mnemonic is wrong' }, Result:{ type:FAILURE }})
// 2. Сообщение тоже получается ибыточным. из Error.type мы можем его получать на клиенте, плюс локализация
Package (id:'0x765', Status{ type:WRONG_MNEMONIC, message:'Mnemonic is wrong' })
// 3.
Package (id:'0x765', Error{ type:WRONG_MNEMONIC })
Package (id:'0x765', Success{})
// 4.
Package (id:'0x765', Status{ type:WRONG_MNEMONIC })
Package (id:'0x765', Status{ type:SUCCESS })
Выбрали четвертый вариант
1. Log in
// 1. Клиент передает мнемонику в middle, которую ввел пользователь
Front: Package (id:'0x123', WalletLogin { mnemonic:'abc def ... xyz', pin:'12345'} )
Middle: Package (id:'0x980', Status { replyTo:'0x123', type:SUCCESS })
// 2. Middle начинает слать аккаунты
Middle: Package (id:'0x789', AccountFound { Account {name:'Pablo', id:'0xabcabc', icon:'0x123123'}}})
Middle: Package (id:'0x678', AccountFound{ Account {name:'Carlito', id:'0xabcabc', icon:'0x123123'}})
// 2.B. Middle сообщает об ошибке
Middle: Package (id:'0x765', Status { replyTo'0x123': type: WRONG_MNEMONIC })
// 3. Клиент отправляет аккаунт, под которым хочет работать
Front: Package (id:'0x789', AccountSelect {id:'0xabcabc'}})
Middle: Package (id:'0x777', Status { replyTo'0x789': type: SUCCESS })
2. Sign up
// 1. Просим создать аккаунт
Front: Package (id:'0x123', WalletCreate {} )
Middle: Package (id:'0x980', Status { replyTo'0x123': type: SUCCESS })
Front: Package (id:'0x345', AccountCreate { name:'Carlos', icon:'0x1231243257', pin:'1232724'} )
Middle: Package (id:'0x456', Status { replyTo'0x345': type: SUCCESS })
3A. Получение списка документов (если store контролирует клиент)
Нужно получить список id документов, их имена, аватарки, хеши последних актуальных версий Когда нужен этот сценарий? Когда юзер хочет запустить главный экран.
- Юзер запустил приложение. Middle уже авторизован, пока ничего не отрисовано
- Фронт сообщает о том, какие у него документы есть
Front: Message StartUp (docs: [
{root:0x345, last_ver:0x123},
{root:0x456, last_ver:0x234},
...])
- Миддл сообщает, какие документы поменяли имена/аватарки, присылает их, актуальная ли версия хранимого документа, и если нет, то какая актуальная (или массив хешей CRDT-изменений, которые нужно скачать для восстановления до актуальной версии)
Middle: Message StartUp reply (docs: [
{root:0x345, status:last_version},
{root:0x456, status:outdated, name:same, icon:b64(newIcon.png), lastVersion:0x789},
...])
- Клиент применяет полученные изменения и отображает список документов
3B. Получение списка документов (если store контролирует middle)
Не вижу проблемы, если middle будет контролировать store. Плюсы – логика с клиента переходит на middle.
- Юзер запустил приложение. Middle уже авторизован, пока ничего не отрисовано
- Клиент сообщает, что он запустился
Front: Message StartUp ()
- Middle отдает данные, которые нужно отрисовать на главной странице – список документов
Middle: Message DocumentsOrganizier (docs: [
{name:'Doc 1', version:0x123, icon:icon1.png},
{name:'Doc 2', version:0x234, icon:icon2.png},
...])
Логика по получению актуальных версий, сверки и прочего полностью абстрагирована от клиента.
- Клиент просто отрисовывает полученные данные.
Cообщения сценария
- Сообщение, которым клиент сообщает, что ему нужен отрисовать список документов. Возникает в сценариях, когда мы на главном меню, плюс, возможно, в других сценариях (например, какое-то всплывающее контекстное меню, в котором отображаются документы).
- Сообщение, в котором middle передает список всех документов.
// С помощью запроса с entity == docHeaders можно запросить список документов
// Выделять отдельное в сообщение DocumentsRequest не вижу смысла, оно слишком тривиальное получится
message Request {
string id = 0;
string entity = 1;
string target = 2;
}
// когда приходит DocHeaders, автоматом на фронте отрисовывается соответствующий target с docHeaders.
message DocHeaders {
string id = 0;
repeated DocHeader docHeaders = 1;
}
message DocHeader {
string id = 0;
string name = 1;
string root = 2;
string version = 3;
string iconName = 4;
}
4. Получение документа
- Юзер находится в главном меню и видит список документов. Юзер нажимает на один из них
- Клиент отправляет сообщение
Request { entity:document, target:0x123123 }
- Middle отправляет сообщение
Document { root:0x123123, ..., blocks:[...] }
- Клиент отрисовывает документ.