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"
- Применим миграции в микросервисе пользователей и авторизации(порядок не важен)
alembic upgreade head
- Перезапустите микросервис приватного чата(переписки)
Тк для чата требуется таблица пользователей, а в микросервисе приватного чата миграции автоматические при запуске
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 |
PATCH /users/upload-avatar/
Заголовок | Тип | Описание |
---|---|---|
Authorization |
string |
Обязательно. jwt токен авторизации |
{
"avatar_file": file
}
{
"Detail": "success"
}
Код | Описание |
---|---|
200 | OK |
401 | Unauthorized |
500 | INTERNAL SERVER ERROR |
GET /auth/yandex_oauth_url/
{
"yandex_url": string
}
Код | Описание |
---|---|
200 | OK |
500 | INTERNAL SERVER ERROR |
POST /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
}
{
"detail": "success"
}
Код | Описание |
---|---|
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 этапе |
{
"detail": "success"
}
Код | Описание |
---|---|
200 | OK |
400 | BAD REQUEST |
POST /auth/login/
Заголовок | Тип | Описание |
---|---|---|
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 |
GET /gateway/get-token/
Заголовок | Тип | Описание |
---|---|---|
Authorization |
string |
Обязательно. jwt токен авторизации |
Код | Описание |
---|---|
200 | OK |
403 | FORBIDDEN |
500 | INTERNAL SERVER ERROR |
- Создание приватного чата
POST /private/start-chat/
Заголовок | Тип | Описание |
---|---|---|
Authorization |
string |
Обязательно. jwt токен авторизации |
{
"recipient_id": integer
}
{
"chat_id": integer
}
Код | Описание |
---|---|
200 | OK |
400 | BAD REQUEST |
500 | INTERNAL SERVER ERROR |
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 |
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 |
POST /private/add-message/"chat_id"/
Параметр | Тип | Описание |
---|---|---|
chat_id |
integer |
Обязательно. id приватного чата |
{
"text": string
}
{
"detail": "Success add."
}
Код | Описание |
---|---|
200 | OK |
400 | BAD REQUEST |
500 | INTERNAL SERVER ERROR |
GET /private/chat-list/
Заголовок | Тип | Описание |
---|---|---|
Authorization |
string |
Обязательно. jwt токен авторизации |
[{
"id": integer
}]
Код | Описание |
---|---|
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"
}
{
"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
}
{
"op": "pending_ticket_confirmation",
"confirmation_code": string
}
{
"op": "Success auth",
"user_payload": string
}
Код | Описание |
---|---|
1000 | NORMAL CLOSURE |
1006 | ABNORMAL CLOSURE |
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 |
GET /auth/encrypt_user_data/
Заголовок | Тип | Описание |
---|---|---|
Authorization |
string |
Обязательно. jwt токен авторизации |
{
"token": string
}
Код | Описание |
---|---|
200 | OK |
404 | NOT FOUND |
403 | FORBIDDEN |
500 | INTERNAL SERVER ERROR |
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 |