API которое частично эмулирует возможности(и добавляет некоторые другие) Discord api
Стек :
Python 3.12.7 - FastAPI, SqlAlchemy, alembic, pydantic, boto3, websockets
Golang 1.23.3 - net/http, database/sql, rubenv/sql-migrate, gorilla/mux
PostgreSQL
Nginx
Docker
Поиск пользователя по username
Загрузка аватарки пользователю по токену(сохраняются в Yandex S3)
Регистрация пользователя
Регистрация пользователя через YandexID
Авторизация пользователя по email + password
Авторизация пользователя через YandexID(если пользователь был зарегистрирован с помощью YandexID)
Проверка токена через api gateway + nginx
Создание переписки(приватной)
Получение N колличества сообщений в определенной переписке(приватной)
Получение информации о определенной переписке(приватной)
Добавление сообщения в определенную переписку(приватную)
Получение всех переписок пользователя(приватной)
Авторизация через QR код(если пользователь авторизарован на телефоне)
Генерация токена авторизации для авторизации через QR код
Создание токена с информацией о юзере для авторизации через QR код
Авторизация с кодом подтверждения(новое устройство авторизации)
Соберем приложение в Docker.
docker-compose up -d build
Сделаем миграции в микросервисе пользователей и авторизации(порядок не важен).
alembic revision --autogenerate -m " migrations name"
Применим миграции в микросервисе пользователей и авторизации(порядок не важен)
Перезапустите микросервис приватного чата(переписки)
Тк для чата требуется таблица пользователей, а в микросервисе приватного чата миграции автоматические при запуске
1. Поиск пользователя по username
GET /users/user/?username=LedxDelivery
Параметр
Тип
Описание
username
string
Обязательно . Имя пользователя
Заголовок
Тип
Описание
Authorization
string
Обязательно . jwt токен авторизации
{
"id" : integer,
"username" : string,
"avatar_url" : string | None
}
Код
Описание
200
OK
401
Unauthorized
404
NOT FOUND
500
INTERNAL SERVER ERROR
2. Загрузка аватарки пользователю по токену
PATCH /users/upload-avatar/
Заголовок
Тип
Описание
Authorization
string
Обязательно . jwt токен авторизации
Код
Описание
200
OK
401
Unauthorized
500
INTERNAL SERVER ERROR
3. Создание ссылки регистрации через YandexID
GET /auth/yandex_oauth_url/
Код
Описание
200
OK
500
INTERNAL SERVER ERROR
4. Регистрация пользователя - "host"/auth/register/
Заголовок
Тип
Описание
Accept-Language
string
Не обязательно при условии .список языко ответа
X-Forwarded-For
string
Обязательно . ip адрес клиента
Accept-Language обязателен если не удастся определить страну по заголовку X-Forwarded-For
{
"username" : string,
"email" : string,
"description" : string, // не обязательно
"status" : string, // не обязательно
"password" : string
}
Код
Описание
200
OK
400
BAD REQUEST
422
Unprocessable Entity
500
INTERNAL SERVER ERROR
Регистрация пользователя через YandexID
POST /auth/yandex_oauth_register/?oauth_token=fsdt43d4fae23f5qwf
Параметр
Тип
Описание
oauth_token
string
Обязательно Oauth токен получаемый при авторизации через эндпоинт в 3 этапе
Код
Описание
200
OK
400
BAD REQUEST
6. Авторизация пользователя по email + password
Заголовок
Тип
Описание
X-Forwarded-For
string
Обязательно при условии . ip адрес клиента
X-Forwarded-For обязателен если авторизация происходит с нового устройства
{
"email" : string,
"password" : string,
"client_fingerprint" : string
}
{
"token" : string,
"type" : " Bearer"
}
ИЛИ
{
"detail" : " Confirmation code send to: {string}"
}
Код
Описание
200
OK
400
BAD REQUEST
404
NOT FOUND
500
INTERNAL SERVER ERROR
7. Проверка токена через api gateway
Заголовок
Тип
Описание
Authorization
string
Обязательно . jwt токен авторизации
Код
Описание
200
OK
403
FORBIDDEN
500
INTERNAL SERVER ERROR
Создание приватного чата
POST /private/start-chat/
Заголовок
Тип
Описание
Authorization
string
Обязательно . jwt токен авторизации
{
"recipient_id" : integer
}
Код
Описание
200
OK
400
BAD REQUEST
500
INTERNAL SERVER ERROR
9. Получение N колличества сообщений в приватном чате
GET /private/"chat_id"/messages?limit=50&offset=0
Параметр
Тип
Описание
chat_id
integer
Обязательно . id приватного чата
limit
integer
Обязательно . колличество сообщений
offset
integer
Обязательно . срез(лучше оставить пока на 0)
[{
"id" : integer,
"text" : string,
"answer" : integer,
"chat_id" : integer,
"message_owner" : {
"id" : integer,
"username" : string,
"avatar_url" : string
}
}]
Код
Описание
200
OK
400
BAD REQUEST
500
INTERNAL SERVER ERROR
10. Получение информации о приватном чате
GET /private/"chat_id"/info/
Параметр
Тип
Описание
chat_id
integer
Обязательно . id приватного чата
{
"id" : integer,
"chat_starter" : {
"id" : integer,
"username" : string,
"avatar_url" : string
},
"chat_recipient" : {
"id" : integer,
"username" : string,
"avatar_url" : string
}
}
Код
Описание
200
OK
400
BAD REQUEST
500
INTERNAL SERVER ERROR
11. Добавление сообщения в приватный чат
POST /private/add-message/"chat_id"/
Параметр
Тип
Описание
chat_id
integer
Обязательно . id приватного чата
{
"detail" : " Success add."
}
Код
Описание
200
OK
400
BAD REQUEST
500
INTERNAL SERVER ERROR
12. Получение всех приватных чатов пользователя
Заголовок
Тип
Описание
Authorization
string
Обязательно . jwt токен авторизации
Код
Описание
200
OK
400
BAD REQUEST
500
INTERNAL SERVER ERROR
Авторизация через QR код
WEBSOCKET /auth_events/qr_auth/?client_id=996a37cf8751bc151a1a0f8&client_ip=188.131.21.22&client_type=pc
Параметр
Тип
Описание
client_id
string
Обязательно . fingerprint устройства(является id хаба авторизации)
client_ip
string
Обязательно . ip адрес клиета
client_type
string
Обязательно . типо клиента(mb/pc)
client_id - Создается через js в браузере
client_ip - Определеятся через js в браузере
client_type - Тип клиента передается "pc" в браузере
Клиент генерирует qr код формата
WEBSOCKET /auth_events/qr_auth/?client_id=996a37cf8751bc151a1a0f8&client_ip=188.131.21.22&client_type=mb
client_id и client_ip передавать те, которые используется для подключение клиента(браузера)
{
"op" : " heartbeat_ack"
}
{
"op" : " pending_ticket" ,
"encrypted_user_payload" : string
}
{
"op" : " New auth device detected, send confirmation code to: {string}"
}
ИЛИ
{
"op" : " Success auth" ,
"user_payload" : string
}
3. pending_ticket_confirmation
{
"op" : " pending_ticket_confirmation" ,
"confirmation_code" : string
}
{
"op" : " Success auth" ,
"user_payload" : string
}
Код
Описание
1000
NORMAL CLOSURE
1006
ABNORMAL CLOSURE
14. Авторизация через auth_token полученного из qr
GET /auth/qr_auth/?client_id=996a37cf8751bc151a1a0f8
Параметр
Тип
Описание
client_id
string
Обязательно . fingerprint устройства
Authorization
string
Обязательно . токен полученный после успешной авторизации через qr
{
"token" : string,
"type" : " Bearer"
}
Код
Описание
200
OK
404
NOT FOUND
403
FORBIDDEN
500
INTERNAL SERVER ERROR
15. Создание токена с информацией о юзере(для авторизации через qr)
GET /auth/encrypt_user_data/
Заголовок
Тип
Описание
Authorization
string
Обязательно . jwt токен авторизации
Код
Описание
200
OK
404
NOT FOUND
403
FORBIDDEN
500
INTERNAL SERVER ERROR
16. Авторизация с кодом подтверждения
POST /auth/confirm_device_and_login/
{
"email" : string,
"password" : string,
"confirmation_code" : string
}
{
"token" : string,
"type" : " Bearer"
}
Код
Описание
200
OK
404
NOT FOUND
500
INTERNAL SERVER ERROR