Предварительно необходимо перейти в папку backend
Создайте виртуальное окружение (и зайдите в него)
python -m venv venv
Установите зависимости
pip install -r requirements.txt
Сделайте миграции (перейдя в папку src)
python manage.py migrate
Запустите бэкенд
python manage.py runserver
Регистрация
URL: /api/auth/register/
Тело запроса:

Ответ:

Логин
URL: /api/auth/login/
Тело запроса:

Ответ:

Информация о пользователе
URL: /api/auth/profile
Важно использовать access_token пользователя. Auth Type: Bearer Token
Ответ:

http://localhost:8000/api/chats/
WebSocket: ws://localhost:8000/ws/
Для всех запросов (кроме WebSocket подключения) требуется JWT токен в заголовке:
Authorization: Bearer <ваш_токен>
Для WebSocket токен передается в query параметре:
ws://localhost:8000/ws/chat/1/?token=<ваш_токен>
GET /api/chats/chats/
Response 200 OK
[
{
"id": 1,
"chat_type": "private",
"name": null,
"project": null,
"project_details": null,
"created_at": "2024-01-20T10:00:00Z",
"updated_at": "2024-01-20T10:30:00Z",
"participants": [
{
"id": 1,
"user": {
"id": 1,
"email": "user1@example.com",
"first_name": "Иван",
"last_name": "Иванов",
"full_name": "Иван Иванов",
"display_name": "Иван Иванов"
},
"joined_at": "2024-01-20T10:00:00Z",
"is_admin": true
},
{
"id": 2,
"user": {
"id": 2,
"email": "user2@example.com",
"first_name": "Петр",
"last_name": "Петров",
"full_name": "Петр Петров",
"display_name": "Петр Петров"
},
"joined_at": "2024-01-20T10:00:00Z",
"is_admin": false
}
],
"last_message": {
"id": 10,
"text": "Привет!",
"sender": {
"id": 2,
"email": "user2@example.com",
"full_name": "Петр Петров"
},
"created_at": "2024-01-20T10:30:00Z"
},
"participant_count": 2
},
{
"id": 2,
"chat_type": "group",
"name": "Проект Alpha",
"project": 1,
"project_details": {
"id": 1,
"name": "Проект Alpha",
"description": "Описание проекта",
"created_at": "2024-01-20T09:00:00Z",
"updated_at": "2024-01-20T09:00:00Z"
},
"created_at": "2024-01-20T09:00:00Z",
"updated_at": "2024-01-20T11:00:00Z",
"participants": [...],
"last_message": {...},
"participant_count": 5
}
]GET /api/chats/chats/{id}/
Response 200 OK
{
"id": 1,
"chat_type": "private",
"name": null,
"project": null,
"project_details": null,
"created_at": "2024-01-20T10:00:00Z",
"updated_at": "2024-01-20T10:30:00Z",
"participants": [...],
"last_message": {...},
"participant_count": 2
}POST /api/chats/chats/
Request Body:
{
"chat_type": "private",
"other_user_id": 2
}Response 201 Created
{
"id": 3,
"chat_type": "private",
"name": null,
"project": null,
"project_details": null,
"created_at": "2024-01-20T12:00:00Z",
"updated_at": "2024-01-20T12:00:00Z",
"participants": [
{
"id": 10,
"user": {
"id": 1,
"email": "your@email.com",
"first_name": "Иван",
"last_name": "Иванов",
"full_name": "Иван Иванов",
"display_name": "Иван Иванов"
},
"joined_at": "2024-01-20T12:00:00Z",
"is_admin": true
},
{
"id": 11,
"user": {
"id": 2,
"email": "other@example.com",
"first_name": "Петр",
"last_name": "Петров",
"full_name": "Петр Петров",
"display_name": "Петр Петров"
},
"joined_at": "2024-01-20T12:00:00Z",
"is_admin": false
}
],
"last_message": null,
"participant_count": 2
}POST /api/chats/chats/
Request Body:
{
"chat_type": "group",
"name": "Чат команды разработки",
"participant_ids": [2, 3, 4]
}POST /api/chats/chats/
Request Body:
{
"chat_type": "group",
"project_name": "Мой новый проект",
"project_description": "Описание проекта",
"participant_ids": [2, 3, 4]
}Response 201 Created
{
"id": 4,
"chat_type": "group",
"name": "Мой новый проект",
"project": 1,
"project_details": {
"id": 1,
"name": "Мой новый проект",
"description": "Описание проекта",
"created_at": "2024-01-20T12:00:00Z",
"updated_at": "2024-01-20T12:00:00Z"
},
"created_at": "2024-01-20T12:00:00Z",
"updated_at": "2024-01-20T12:00:00Z",
"participants": [
{
"id": 12,
"user": {
"id": 1,
"email": "your@email.com",
"first_name": "Иван",
"last_name": "Иванов",
"full_name": "Иван Иванов",
"display_name": "Иван Иванов"
},
"joined_at": "2024-01-20T12:00:00Z",
"is_admin": true
}
],
"last_message": null,
"participant_count": 1
}POST /api/chats/chats/{id}/add_participant/
Request Body:
{
"user_id": 3
}Response 201 Created
{
"id": 15,
"user": {
"id": 3,
"email": "newuser@example.com",
"first_name": "Новый",
"last_name": "Пользователь",
"full_name": "Новый Пользователь",
"display_name": "Новый Пользователь"
},
"joined_at": "2024-01-20T12:05:00Z",
"is_admin": false
}Response 403 Forbidden (если не админ)
{
"error": "Only admins can add participants"
}POST /api/chats/chats/{id}/remove_participant/
Request Body:
{
"user_id": 3
}Response 200 OK
{
"status": "participant removed"
}GET /api/chats/chats/{id}/available_users/
Response 200 OK
[
{
"id": 3,
"email": "user3@example.com",
"first_name": "Сергей",
"last_name": "Сергеев",
"full_name": "Сергей Сергеев",
"display_name": "Сергей Сергеев"
},
{
"id": 4,
"email": "user4@example.com",
"first_name": "Анна",
"last_name": "Аннова",
"full_name": "Анна Аннова",
"display_name": "Анна Аннова"
}
]GET /api/chats/messages/?chat_id={id}
Параметры:
chat_id- ID чата (обязательно)page- номер страницы (опционально)page_size- количество сообщений на странице (опционально, по умолчанию 50)
Response 200 OK
[
{
"id": 101,
"chat": 1,
"sender": {
"id": 2,
"email": "user2@example.com",
"first_name": "Петр",
"last_name": "Петров",
"full_name": "Петр Петров",
"display_name": "Петр Петров"
},
"text": "Привет! Как дела?",
"created_at": "2024-01-20T10:30:00Z",
"updated_at": "2024-01-20T10:30:00Z",
"is_deleted": false,
"reply_to": null,
"reply_to_data": null,
"attachments": []
},
{
"id": 100,
"chat": 1,
"sender": {
"id": 1,
"email": "user1@example.com",
"first_name": "Иван",
"last_name": "Иванов",
"full_name": "Иван Иванов",
"display_name": "Иван Иванов"
},
"text": "Всем привет!",
"created_at": "2024-01-20T10:29:00Z",
"updated_at": "2024-01-20T10:29:00Z",
"is_deleted": false,
"reply_to": null,
"reply_to_data": null,
"attachments": []
}
]POST /api/chats/messages/
Request Body:
{
"chat": 1,
"text": "Новое сообщение",
"reply_to": null // опционально, ID сообщения на которое отвечаем
}Response 201 Created
{
"id": 102,
"chat": 1,
"sender": {
"id": 1,
"email": "user1@example.com",
"first_name": "Иван",
"last_name": "Иванов",
"full_name": "Иван Иванов",
"display_name": "Иван Иванов"
},
"text": "Новое сообщение",
"created_at": "2024-01-20T12:10:00Z",
"updated_at": "2024-01-20T12:10:00Z",
"is_deleted": false,
"reply_to": null,
"reply_to_data": null,
"attachments": []
}POST /api/chats/messages/{id}/mark_as_deleted/
Response 200 OK
{
"status": "deleted"
}POST /api/chats/messages/
Request Body:
{
"chat": 1,
"text": "Это ответ на предыдущее сообщение",
"reply_to": 100
}Response 201 Created (содержит информацию об оригинальном сообщении)
{
"id": 103,
"chat": 1,
"sender": {...},
"text": "Это ответ на предыдущее сообщение",
"created_at": "2024-01-20T12:15:00Z",
"reply_to": 100,
"reply_to_data": {
"id": 100,
"text": "Всем привет!",
"sender": {
"id": 1,
"email": "user1@example.com",
"first_name": "Иван",
"last_name": "Иванов",
"full_name": "Иван Иванов"
}
},
"attachments": []
}WebSocket URL: ws://localhost:8000/ws/chat/{chat_id}/?token={jwt_token}
Пример подключения:
ws://localhost:8000/ws/chat/1/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{
"type": "message",
"text": "Текст сообщения"
}{
"type": "new_message",
"message_id": 102,
"text": "Текст сообщения",
"user_id": 1,
"email": "user1@example.com",
"full_name": "Иван Иванов",
"display_name": "Иван Иванов",
"created_at": "2024-01-20T12:10:00Z"
}{
"type": "user_connected",
"user_id": 2,
"email": "user2@example.com",
"full_name": "Петр Петров",
"display_name": "Петр Петров"
}{
"type": "user_disconnected",
"user_id": 2,
"email": "user2@example.com",
"full_name": "Петр Петров",
"display_name": "Петр Петров",
"close_code": 1000
}{
"type": "new_participant",
"user_id": 3,
"email": "newuser@example.com",
"full_name": "Новый Пользователь",
"display_name": "Новый Пользователь",
"joined_at": "2024-01-20T12:05:00Z"
}В первой командной строке (для бэкэнда):
cd backend
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt
cd src
python manage.py migrate
python manage.py runserver
Во второй командной строке (для фронтенда):
cd frontend
npm install
npm run dev