Перейти к содержанию

Профили WhatsApp (whatsapp_channel)🔗

Назначение🔗

Приложение whatsapp_channel содержит модель WhatsappProfile, которая хранит параметры интеграции с платформой WAPPI.
Интеграция позволяет принимать и отправлять сообщения от имени пользователя через WhatsApp.

Приложение отвечает только за хранение данных и отображение их в админке.
Вся бизнес-логика, включая приём сообщений и отправку ответов, реализована в микросервисе WhatsApp.


Основные модели и сущности🔗

WhatsappProfile🔗

Наследуется от BaseProfile.

class WhatsappProfile(BaseProfile):
    token = models.CharField(...)
    profile_id = models.CharField(...)
    phone_number = models.CharField(...)
Поле Назначение
token API-токен от WAPPI. Используется при отправке ответов
profile_id ID профиля WAPPI. Используется для маршрутизации сообщений
phone_number WhatsApp-номер, на который зарегистрирован бот. Используется как ID
is_active Флаг активности. Если выключен — сообщения не обрабатываются

Поле phone_number уникально и служит идентификатором при входящих запросах.
token и profile_id требуются микросервису WhatsApp для взаимодействия с внешним API.


WhatsappChats🔗

Хранит список чатов с клиентами WhatsApp, привязанных к пользователям системы.

class WhatsappChats(models.Model):
    user_owner = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
    user_number = models.CharField(max_length=255, unique=True)
    date_last_message = models.DateTimeField(null=True, blank=True)
    is_favorite = models.BooleanField(default=False)
    note = models.TextField(null=True, blank=True)
Поле Назначение
user_owner Пользователь системы, которому принадлежит чат
user_number Номер клиента WhatsApp. Является уникальным идентификатором
date_last_message Дата последнего сообщения (обновляется при новых сообщениях)
is_favorite Флаг "избранный" чат
note Произвольная заметка от пользователя

Удаление чатов не предполагается, но технически возможно (например, через админку). Позже займусь этим.


WhatsappMessages🔗

Содержит список сообщений внутри чата. Поддерживает как входящие, так и исходящие сообщения, а также системные записи.

class WhatsappMessages(models.Model):
    chat = models.ForeignKey(WhatsappChats, on_delete=models.CASCADE)
    message = models.TextField()
    sender = models.CharField(max_length=255)
    date = models.DateTimeField(auto_now_add=True)
Поле Назначение
chat Связь с чатом (WhatsappChats), которому принадлежит сообщение
message Текст сообщения
sender Отправитель: user, chatgpt или system
date Дата отправки. По умолчанию — дата создания, но может быть перезаписана

sender может принимать три значения:

  • user — пользователь системы
  • chatgpt — сгенерировано моделью
  • system — сообщение с описанием вызванных функций нейросетью

Связи и использование🔗

  • Все поля используются только в микросервисе WhatsApp (непосредственно из базы через data_service);

Note

В будущем так же фронт сможет запрашивать\изменять данные

  • WhatsappProfile определяет принадлежность сообщений к пользователю, доступность и токены для работы с API WAPPI;
  • Если is_active = False, сообщения не обрабатываются.

Особенности🔗

  • Приложение не содержит webhook-представлений и не обрабатывает сообщения;
  • Вся логика находится в микросервисе.
    Подробнее см. документацию по микросервису whatsapp_service;
  • WhatsappProfile создаётся вручную через админку или в личном кабинете через фронтенд;
  • Все доступы к модели контролируются data_service.

Админка🔗

WhatsappProfile🔗

  • Поля из BaseProfile + специфичные (token, profile_id, phone_number);
  • service автоматически устанавливается как WHATSAPP, изменить его нельзя;
  • Удаление отключено (has_delete_permission = False);
  • Доступна фильтрация, поиск, отображение по номеру, имени, ID, пользователю.

WhatsappChats🔗

  • Отображается список чатов с клиентами WhatsApp
  • Поля в списке: id, user_owner, user_number, date_last_message, is_favorite, обрезанная заметка (note)
  • Фильтрация по is_favorite, user_owner и диапазону дат (DateRangeFilter)
  • Поле note отображается в укороченном виде, если превышает 100 символов
  • Встроен MessagesInline для просмотра сообщений внутри чата
  • При редактировании чата:

    • user_number, user_owner, date_last_message — только для чтения
    • note можно редактировать (если нужно)
  • Создание новых чатов через админку запрещено (has_add_permission = False)


WhatsappMessages (Inline)🔗

  • Используется только как TabularInline внутри чатов (WhatsappChats)
  • Поля: message, sender, formatted_date
  • Настроено:

    • Дата сообщения форматируется в виде: дд месяц гггг г. чч:мм:сс
  • Поля sender, date, message — только для чтения

  • Удаление и добавление сообщений через админку отключено

API🔗

Общая информация🔗

  • Вся работа с WhatsappProfile осуществляется через data_service и микросервис whatsapp_service и через API эндпоинты;
  • Входящие сообщения принимаются микросервисом;
  • Ответы на сообщения отправляются через whatsapp_service, с использованием токена и ID профиля, хранящихся здесь.

Все эндпоинты доступны по префиксу: /api/v1/whatsapp-panel/ Требуется авторизация по сессии (sessionid + CSRF).

Совет

Подробную документацию энпоинтов можете найти в разделе - API

Профили (/settings/)🔗

Метод Путь Назначение
GET /api/v1/whatsapp-panel/settings/info/ Получить список профилей (сокращённый формат)
GET /api/v1/whatsapp-panel/settings/info/<profile_id>/ Получить подробную информацию по профилю
POST /api/v1/whatsapp-panel/settings/create/ Создать новый профиль
PATCH /api/v1/whatsapp-panel/settings/<profile_id>/update/ Обновить существующий профиль
DELETE /api/v1/whatsapp-panel/settings/delete/<profile_id>/ Удалить профиль

Чаты и сообщения (/chats/, /messages/)🔗

Метод Путь Назначение
GET /api/v1/whatsapp-panel/chats/ Получить список чатов с пагинацией
GET /api/v1/whatsapp-panel/messages/<chat_id>/ Получить список сообщений конкретного чата