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).
    • Уведомление добавляется в таблицу на клиенте.

Вспомогательные функции и возможности

Сегментация

  • Пользователи могут быть выбраны по различным критериям (например, количество заказов, средний чек, последний заказ).
  • Примеры критериев:
    • 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.