Репозиторий клиента для ios
короче сейчас есть 9 методов
их код можно посмотреть в Sources/App/Handlers
Все данные передаются в теле запроса в следующем формате
{
"time": UInt, // текущие время не должно сильно отличаться от серверного
"method": "name", //имя метода
"reuestId": "id", // id requestа
"authorisation": {
"token": String
"secretKey": String // Берем хэш который собрали в login и делаем так SHA512(hash+time)
}?
"content": {
//тут наш обьект (даже если парметров к запросу нет сюда надо все равно отправитьь пустой обьект) (дальше буду описывать только это поле Input)
}
}
Все ответы приходят в формате
{
"state": "ok" || "error",
"method": "name", //имя метода
"reuestId": "id", // id requestа если реквест был
"content": {
//тут наш контент если ok (дальше буду описывать только это поле Output)
},
"errors": [//если пошло по пизде
{
"code": String, // завязываться можно только на code остальное отрезается в prod
"developerInfo": ? {
"description": String // как я описал ошибку
"error": String? // полная распечатка (если такая есть)
"position": ? { // позиция в коде где произошло (если емеет смысл)
"file": String
"line": Int
}
}
}
]
}
IdentifierType = UInt
User {
name: String
userId: IdentifierType
isSelf: Bool // true - если вы этот пользователь
hex: String?
emoji: String?
firstName: String?
lastName: String?
}
Message {
user: User
date: UInt
body: String
type: String
messageId: IdentifierType
chatId: IdentifierType
}
можно post или get
Логинет пользователя возращает авторизационный токен
Input {
name: String,
securityHash: String // SHA512(name+password),
userPublicKey: String // Public part SymmetricKey user for secretKey
}
Output {
token: String
serverPublicKey: String // Public part SymmetricKey server for secretKey
userId: Int
}
req:
{
"content": {
"name": "alex10"
}
}
res:
{
"state": "ok",
"content": {
"token": "202C394B-D55E-421B-8172-B28DEB98EC24",
"userId": 4
}
}
Logout пользователя
Input {
}
Output {
}
Устанавливает apns токен
Input {
token: String
}
Output {
}
Регистрирует пользователя, сразу логинет пользователя
Input {
name: String,
securityHash: String // SHA512(name+password),
userPublicKey: String // Public part SymmetricKey user for secretKey
}
Output {
token: String
serverPublicKey: String // Public part SymmetricKey server for secretKey
userId: Int
}
req:
{
"content": {
"name": "alex10"
}
}
res:
{
"state": "ok",
"content": {}
}
поиск пользователя по имени
Input {
name: String
}
Output {
users: [User]
}
req:
{
"token":"94091781-F29B-4301-80B0-F0CF6BA103E7",
"content": {
"name": "alex"
}
}
res:
{
"state": "ok",
"content": {
"users": [
{
"name": "alex",
"userId": 1,
"isSelf": true
},
{
"name": "alex2",
"userId": 2,
"isSelf": false
},
{
"name": "alex3",
"userId": 3,
"isSelf": false
},
{
"name": "alex4",
"userId": 4,
"isSelf": false
},
{
"name": "alex6",
"userId": 5,
"isSelf": false
},
{
"name": "alex8",
"userId": 6,
"isSelf": false
}
]
}
}
возращает информацию о вашем пользователе
Input {
}
Output: User
обновляет информацию о вашем пользователе
Input {
hex: String?
emoji: String?
firstName: String?
lastName: String?
}
Output: {
}
}
Создаем чат
Input {
name: String
}
Output {
"chatId": IdentifierType
}
req:
{
"token":"94091781-F29B-4301-80B0-F0CF6BA103E7",
"content": {
"name": "Alex-Nikita3"
}
}
res:
{
"state": "ok",
"content": {
"chatId": 5
}
}
Создаем чат c пользователем
Input {
userId: IdentifierType
}
Output {
"chatId": IdentifierType
"user": User
}
req:
{
"token":"94091781-F29B-4301-80B0-F0CF6BA103E7",
"content": {
"userId": 3
}
}
res:
{
"state": "ok",
"content": {
"chatId": 5,
"user": {
"name": "alex10",
"userId": 1,
"isSelf": false
}
}
}
Добавить пользователя в чат
Input {
chatId: IdentifierType
userId: IdentifierType
}
Output { }
req:
{
"token":"94091781-F29B-4301-80B0-F0CF6BA103E7",
"content": {
"chatId": 3,
"userId": 4
}
}
res:
{
"state": "ok",
"content": {}
}
Список чатов в которые я добавлен
Input { }
Output {
chats: [{
message: Message?, //последние сообщение в чате
name: String,
chatId: IdentifierType,
type: String// group | personal,
notReadCount: Int?
lastMessageId: Int?
}]
}
req:
{
"token":"94091781-F29B-4301-80B0-F0CF6BA103E7",
"content": { }
}
res:
{
"state": "ok",
"content": {
"chats": [
{
"name": "Alex-Nikita3",
"chatId": 1,
"isPersonal": false,
"notReadCount": 0,
"lastMessageId": 1,
"message": {
"user": {
"name": "alex10",
"userId": 1,
"isSelf": true
},
"content": "Start chat",
"messageId": 2,
"chatId": 1,
"type": "SYSTEM_TEXT",
"date": 657101002,
"notReadCount": 0,
"lastMessageId": 3
}
},
{
"name": "Alex-Nikit3",
"chatId": 2,
"isPersonal": false,
"notReadCount": 0,
"lastMessageId": 3,
"message": {
"user": {
"name": "alex10",
"userId": 1,
"isSelf": true
},
"content": "Start chat",
"messageId": 3,
"chatId": 2,
"type": "SYSTEM_TEXT",
"date": 657101132
}
}
]
}
}
Список пользователей в чате
Input {
chatId: IdentifierType
}
Output {
users: [User]
}
req:
{
"token":"94091781-F29B-4301-80B0-F0CF6BA103E7",
"content": {
"chatId": 3
}
}
res:
{
"state": "ok",
"content": {
"users": [
{
"name": "alex8",
"userId": 6,
"isSelf": true
},
{
"name": "alex2",
"userId": 2,
"isSelf": false
}
]
}
}
отправить сообщение в чат
Input {
type: String // произвольный типо обрабатывается на клиентах (можно писать че захотите до 15 символов)
content: String // сам контент
chatId: IdentifierType //в какой чат
}
Output {
messageId: IdentifierType
}
req:
{
"token":"94091781-F29B-430",
"content": {
"chatId": 3,
"type": "text",
"content": "Hello"
}
}
res:
{
"state": "ok",
"content": {
"messageId": 7
}
}
Помечает сообщение прочитаным (предыдущие сообщения также будут считаться прочитанами)
Input {
messageId: IdentifierType
chatId: IdentifierType
}
Output {
count: Int // сколько осталось не прочитаных сообщений
}
req:
{
"token":"94091781-F29B-430",
"content": {
"messageId": 3,
"chatId": 2
}
}
res:
{
"state": "ok",
"content": {
"count": 0
}
}
Выгружает сообщения из чата начиная с последних
Input {
chatId: IdentifierType // из какого чата
limit: Int // сколько грузить max(100)
lastMessageId: IdentifierType? // id последнего загруженного сообщения ( какое сообщение послдение загрузили в прошлый раз),
reverse: Bool? // инвертирует сортировку начинает грузить с первого сообщения (или то сообщение которое после lastMessageId)
}
Output: Codable {
messages: [Message]
}
req:
{
"token":"94091781-F29B-430",
"content": {
"chatId": 3,
"limit": 10,
"lastMessageId": 2
}
}
res:
{
"state": "ok",
"content": {
"messages": [
{
"user": {
"name": "alex8",
"userId": 6,
"isSelf": false
},
"content": "Hello",
"chatId": 3,
"type": "text",
"messageId": 1,
"date": 657047168
}
]
}
}
Подписывает на ws нотификации в методе update
Input {}
Output {
}
{
type: newMessage,
content: Message
}
{
type: addedInNewChat,
content: {
name: String,
chatId: IdentifierType,
isPersonal: Bool
}
}
{
type: newPersonalChat,
content: {
chatId: IdentifierType,
user: User
}
}
req:
{
"token":"94091781-F29B-430",
"content": { }
}
res:
{
"state": "ok",
"content": {
"notification": []
}
}