Workflow механизма пуш-уведомлений
Общая архитектура
notification.fuji.ru
- Отвечает за асинхронную обработку пушей.
- Основные файлы:
notification.service.js(логика очередей и Firebase),db.js(работа с базой данных),consumeNotifications(обработчик сообщений из RabbitMQ). - Использует RabbitMQ для очередей сообщений.
- Отправляет уведомления через Firebase.
api.fuji.ru
- Реализует API для управления уведомлениями.
- Примеры маршрутов:
GET /api/v1/notification/all: возвращает список всех уведомлений.POST /api/v1/notification/send-bulk-notification-all-devices: отправляет массовые уведомления всем устройствам.POST /api/v1/notification/device: добавляет устройство с токеном в базу данных.
- Обрабатывает запросы на массовую отправку, фильтрацию и управление токенами устройств.
admin.fuji.ru
- Предоставляет интерфейс для создания и отправки уведомлений.
- Основные компоненты:
components/Notification/Form.vue: форма для ввода заголовка и текста уведомления.components/Notification/ModalNewNotification.vue: модальное окно для создания нового уведомления.pages/notification.vue: страница, содержащая таблицу уведомлений и функции поиска.
- Пример интерфейса:
- Пользователь заполняет форму
Form.vue, указываяtitleиbody. - Нажатие кнопки отправки инициирует создание уведомления, отображаемого в таблице
notification.vue.
- Пользователь заполняет форму
Workflow: Создание и отправка пуша
Инициация в админке
- Пользователь открывает страницу уведомлений в админке (
notification.vue). - Создаёт новое уведомление через форму (
Form.vue) или модальное окно (ModalNewNotification.vue). - Вводит заголовок (
title) и текст (body) уведомления. - Отправляет данные на API через
POST /api/v1/notification/send-bulk-notification-all-devices.
API обработка
- Запрос обрабатывается в роутере
api.fuji.ru/notification/notification.router.js. - Вызов функции
sendBulkNotificationsAllDevicesотправляет уведомление во все устройства, извлекая их токены из базы данных (notification.repository.js). - Уведомление помещается в очередь RabbitMQ через
notification.service.js:- Генерируется уникальный
UUID. - Формируется сообщение в формате JSON:
{ "tokens": ["token1", "token2"], "title": "Notification Title", "body": "Notification Body", "uuid": "generated-uuid", "customerIDs": ["customer1", "customer2"] } - Сообщение отправляется в очередь с использованием метода
channel.sendToQueueи устанавливается флагpersistent: trueдля сохранности сообщений в случае сбоя RabbitMQ.
- Генерируется уникальный
Обработка очереди
- В сервисе
notification.fuji.ruзапускается обработчик очередиconsumeNotifications(RabbitMQ). - Сообщение извлекается из очереди и обрабатывается:
- Отправляется через Firebase на устройства.
- Если отправка успешна, статус уведомления обновляется на
completeв базе данных. - В случае ошибки (например, недействительный токен Firebase или потеря соединения), сообщение логируется через
CLogger. - Обработчик либо подтверждает успешное извлечение сообщения (
channel.ack), либо повторно помещает сообщение в очередь для повторной обработки (channel.nack).
Уведомление в админке
- После успешной отправки обновляется список уведомлений в админке:
- Данные запрашиваются через API (
GET /api/v1/notification/all). - Уведомление добавляется в таблицу на клиенте.
- Данные запрашиваются через API (
Вспомогательные функции и возможности
Сегментация
- Пользователи могут быть выбраны по различным критериям (например, количество заказов, средний чек, последний заказ).
- Примеры критериев:
orderCount: отбор пользователей по диапазону количества заказов. Например, от 5 до 20 заказов.averageCheck: фильтр на основе среднего чека пользователя. Например, от 500 до 1000 рублей.lastOrderDate: фильтрация по дате последнего заказа. Например, отбор пользователей, сделавших заказ за последние 30 дней.birthday: выборка пользователей, у которых день рождения приходится на заданный временной интервал.orderedProducts: фильтрация по продуктам, которые были заказаны пользователем.isSelfService: фильтрация по типу обслуживания (например, самовывоз или доставка).lastOrderTerminalId: выборка пользователей по идентификатору терминала последнего заказа.
- Реализовано в
Segmentation.vueи методах API (функцияsendBulkNotificationFilterCustomers).
Хранение данных
- Токены устройств и данные уведомлений хранятся в базе, взаимодействие реализовано через Sequelize.
- Структура базы данных:
- Таблица
notifications:id(UUID): уникальный идентификатор уведомления.title(string): заголовок уведомления.body(string): текст уведомления.status(string): статус уведомления (например,sending,complete).createdAt(timestamp): время создания уведомления.
- Таблица
devices:id(UUID): уникальный идентификатор устройства.FCMToken(string): токен устройства для Firebase.userId(UUID): идентификатор пользователя, связанного с устройством.lastMessageSentAt(timestamp): время последнего отправленного сообщения.
- Таблица
Логирование
- Все ошибки логируются через
CLogger.