# API для разработчиков: связи пользователей Документ описывает операции чтения и записи пользовательских связей. Текущие операции: - `GetFriendsLists` - `ListContacts` - `GetUserConnectionsGraph` - `AddCloseFriend` ## 1. `GetFriendsLists` ### Запрос ```json { "op": "GetFriendsLists", "requestId": "friends-001", "payload": { "login": "alice" } } ``` ### Успешный ответ ```json { "op": "GetFriendsLists", "requestId": "friends-001", "status": 200, "ok": true, "payload": { "login": "Alice", "out_friends": ["Bob"], "in_friends": ["Kate"] } } ``` --- ## 2. `ListContacts` `ListContacts` использует текущую авторизованную сессию. В payload нет дополнительных полей. ### Запрос ```json { "op": "ListContacts", "requestId": "contacts-001", "payload": { } } ``` ### Успешный ответ ```json { "op": "ListContacts", "requestId": "contacts-001", "status": 200, "ok": true, "payload": { "login": "Alice", "dialogs": [ { "peerLogin": "Bob", "relationFlag": "close_friend", "lastMessageBlobB64": "U0hpTkVfRE0B...", "lastMessageTimeMs": 1774700000123, "unreadCount": 2, "hasDialog": true }, { "peerLogin": "Kate", "relationFlag": "contact", "lastMessageBlobB64": "", "lastMessageTimeMs": 0, "unreadCount": 0, "hasDialog": false }, { "peerLogin": "Mira", "relationFlag": "none", "lastMessageBlobB64": "U0hpTkVfRE0B...", "lastMessageTimeMs": 1774700000555, "unreadCount": 1, "hasDialog": true } ] } } ``` ### Примечание - `dialogs` это серверный inbox-проекционный список диалогов; - `relationFlag` возвращается как `close_friend`, `contact` или `none`; - если один и тот же человек есть и в `contact`, и в `close_friend`, в `dialogs` он приходит как `close_friend`. - `lastMessageBlobB64` содержит полный signed DM block последнего контентного сообщения в base64; - для чатов без сообщений поле `lastMessageBlobB64` пустое. --- ## 3. `GetUserConnectionsGraph` ### Запрос ```json { "op": "GetUserConnectionsGraph", "requestId": "graph-001", "payload": { "login": "alice" } } ``` ### Успешный ответ ```json { "op": "GetUserConnectionsGraph", "requestId": "graph-001", "status": 200, "ok": true, "payload": { "login": "Alice", "outFriends": ["Bob"], "inFriends": ["Kate"], "outContacts": [], "inContacts": [], "outFollows": [], "inFollows": [], "outSpouses": [], "inSpouses": [], "outParents": [], "inParents": [], "outChildren": [], "inChildren": [], "outSiblings": [], "inSiblings": [], "outKnownPersons": [], "inKnownPersons": [], "outShineConfirmed": [], "inShineConfirmed": [], "outShineSeen": [], "inShineSeen": [], "parents": [], "children": [], "siblings": [], "spouses": [], "allUsers": [ { "login": "Bob", "official": false, "shine": true, "officialLabel": "", "shineLabel": "shine", "avatar": { "ar": "..." } } ] } } ``` ### Примечание Поля `known_person`, `shine_confirmed`, `shine_seen` в UI считаются недопроверенной зоной проекта; при изменениях этой логики нужна ручная end-to-end проверка. --- ## 4. `AddCloseFriend` `AddCloseFriend` использует текущую авторизованную сессию как источник `login`. ### Запрос ```json { "op": "AddCloseFriend", "requestId": "close-friend-001", "payload": { "toLogin": "bob" } } ``` ### Успешный ответ ```json { "op": "AddCloseFriend", "requestId": "close-friend-001", "status": 200, "ok": true, "payload": { "login": "Alice", "toLogin": "Bob", "relation": "close_friend" } } ```