mr-Marshanskiy / chat_websockets

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Chat Messanger

СОДЕРЖАНИЕ

  1. ✏️ Описание проекта
  2. 🛠 Особенности проекта
  3. Описание функциональных возможностей
  4. 📚 Используемые технологии
  5. 📲 Установка и запуск
  6. 📗 Документация API
  7. 🔐 Лицензия
  8. 🧙‍♂️ Авторы

✏️ Описание проекта

Проект на Django REST Framework + Websockets, предназначенный для общения пользователей в чатах

Демо видео: реализация back + front

📋 Задачи

Проект был разработан с целью изучения протокола Websocket на Python:

  • создание подключений
  • прием и обработка сообщений от клиента
  • отправка сообщений клиентам
  • объединение клиентов в общие группы
  • взаимодействие между сокетами

📟 Функциональные возможности

В проекте реализованы следующие функциональные возможности:

REST API

  • Users
    • регистация
    • JWT аутентификация
    • информация о пользователе
  • Chats
    • Список чатов
    • Сообщения выбранного чата

Websockets

  • Список чатов пользователя, в котором:
    • количество непрочитанных сообщений
    • сортировка по дате последнего сообщения
    • отправка обновлений клиенту при получении, прочтении, отправке сообщений в чатах
  • Подписка на уведомления о новых сообщениях из активных чатов
  • Чат:
    • получение истории сообщений
    • получение новых сообщений
    • отправка сообщений

🛠 Особенности проекта

Проект был реализован в целях изучения протокола Websocket, ввиду этого была упрощена бизнес-логика взаимодействия:

  • информация об активных пользователях хранится в виде множества
  • непрочитанные сообщения определяются по разности времени сообщения в чате и времени последнего посещения чата пользователем
  • аутентификация реализона путем передачи параметра в URL
  • сериализация данных осуществляется с помощью фреймворка DRF

⚙️ Описание функциональных возможностей

📋 Список чатов пользователя

chat.consumers.chats.MeChatsConsumer

Подключение

  1. Клиент производит попытку подключения, передавая JWT токен в параметре token
/ws/me/chats/?token=<token>
  1. Проверка валидности токена
  2. Установка соединения
  3. Добавление клиента в список активных пользователей
  4. Отправка клиенту сообщения со списком чатов, в которых он участвует.
    • Сортировка по дате последнего сообщения в чате в порядке убывания
    • Количество непрочитанных сообщений расчитывается на основе последнего посещения чата
[
  {
    "chat_id": 1,
    "name": "Chat name",
    "unread_messages": 15
  }
]

⬇️ Триггеры обновления информации о чатах

  1. В чате, в котором участвует пользователь, появилось новое сообщение
  2. Пользователь открыл чат (обновляется количество непрочитанных сообщений)

Разрыв соединения

  1. Клиент исключается из списка активных пользователей

🔔 Уведомления о новых сообщениях

chat.cosumers.chats.MeChatNotificationsConsumer

Подключение

  1. Авторизация клиента по JWT токену и установка подключения
/ws/me/chats/notifications/?token=<token>

⬇️ Отправка сообщения клиенту

При появлении нового сообщения в чате, в котором участвует пользователь отправляется сообщение в формате

{
  "chat_id": 1,
  "name": "Test chat",
  "sender": "Ivan Ivanov"
}

💬 Отправка и получение сообщений в чате

chat.cosumers.chats.ChatConsumer

Подключение

  1. Авторизация клиента по JWT токену и установка подключения. В качестве room_name передается ID чата.
/ws/chat/(?P<room_name>\w+)/?token=<token>
  1. Обновление информации о последнем посещении чата пользователем
  2. Отправка клиенту списка последних сообщений в чате
[
  {
    "id": 1,
    "sender": {
      "id": 2,
      "username": "test",
      "full_name": "test",
      "email": ""
    },
    "is_message_mine": false,
    "text": "хай",
    "timestamp": "2023-11-13T12:50:52.715202+03:00"
  },
  {
    "id": 3,
    "sender": {
      "id": 1,
      "username": "admin",
      "full_name": "admin@admin.ru",
      "email": "admin@admin.ru"
    },
    "is_message_mine": false,
    "text": "Привет",
    "timestamp": "2023-11-13T12:53:28.034894+03:00"
  }
]
  1. Обновление списка диалогов клиента (отправка сообщения в соответсвующий сокет)

⬆️ Отправка сообщения в чат

  1. Отправляется сообщение в формате
{
  "message": "Root message"
}
  1. Сервер сохраняет сообщение в БД
  2. Отправляет сообщение всем пользователм в комнате сообщение в формате
{
    "id": 3,
    "sender": {
      "id": 1,
      "username": "admin",
      "full_name": "admin@admin.ru",
      "email": "admin@admin.ru"
    },
    "is_message_mine": false,
    "text": "Привет",
    "timestamp": "2023-11-13T12:53:28.034894+03:00"
  }
  1. Отправляет уведомление о новом сообщении всем активным пользователям, кроме отправителя (отправка сообщения в соотвествующее подключение)
  2. Обновляет список диалогов активным пользователей (отправка сообщения в соотвествующее подключение)

📚 Используемые технологии

  • Python 3.11
  • Djnago 4.2.7
  • Django REST Framework 3.14.0
  • PostgreSQL 14
  • redis 5.0

📲 Установка и запуск

  1. Клонирование репозитория:

    git clone [URL-репозитория]
  2. Создание .env на основе example.env:

    docker-compose up -d --build
  3. Билд проекта:

    docker-compose up -d --build
  4. Создание миграций:

    docker exec web python manage.py makemigrations
  5. Применение миграций:

    docker exec web python manage.py migrate

📗 Документация API

Документация по API доступна по /api.

🔐 Лицензия

Подробности см. в файле LICENSE.

🧙‍♂️ Авторы

  • Маршанский Николай

About

License:Apache License 2.0


Languages

Language:Python 99.0%Language:Dockerfile 1.0%