Профили 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>/ | Получить список сообщений конкретного чата |