10 KiB
Implementation Summary: Web Push Notification Service
Обзор реализации
Создан полноценный сервис для web-push уведомлений на базе NestJS с интеграцией NOVU. Сервис предоставляет все необходимые компоненты для работы с push уведомлениями без использования Firebase.
Архитектура и компоненты
🗂️ База данных (TypeORM + PostgreSQL)
Entity: PushSubscription
- Хранение push подписок пользователей
- Автоматическое управление активностью подписок
- Индексы для оптимизации запросов
- UUID в качестве первичного ключа
- Поддержка множественных подписок на пользователя
Поля:
id: UUID подпискиuserId: Идентификатор пользователяendpoint: URL endpoint для push уведомленийp256dhKey,authKey: Ключи шифрованияuserAgent: Информация о браузереisActive: Статус активности подпискиcreatedAt,updatedAt: Временные метки
🔧 Сервисы
WebPushService
Основной сервис для работы с web-push:
- VAPID управление: Автогенерация и настройка VAPID ключей
- Управление подписками: Создание, обновление, деактивация
- Отправка уведомлений: Поддержка всех стандартных полей web-push
- Автоочистка: Удаление недействительных подписок
- Статистика: Мониторинг активности подписок
Ключевые методы:
- getVapidPublicKey(): string
- saveSubscription(userId, subscription, userAgent?)
- sendNotificationToUser(userId, payload)
- sendNotificationToAll(payload)
- getSubscriptionStats()
- cleanupInactiveSubscriptions(days)
NovuWebPushService
Сервис интеграции с NOVU:
- Workflow интеграция: Создание NOVU workflows с push поддержкой
- Webhook обработка: Автоматическая отправка при NOVU событиях
- Template обработка: Поддержка переменных в уведомлениях
- Fallback отправка: Дублирование через web-push API
CleanupService
Автоматизированное обслуживание:
- Cron задачи: Автоочистка каждый день в 2:00 AM
- Статистика: Еженедельные отчеты по воскресеньям
- Ручное управление: API для принудительной очистки
🎮 Контроллеры
PushController (/api/push)
Основной API для управления push уведомлениями:
Endpoints:
GET /vapid-public-key- Получение VAPID ключаPOST /subscribe- Подписка на уведомленияDELETE /unsubscribe- ОтпискаPOST /send- Отправка уведомленияGET /subscriptions/:userId- Подписки пользователяPOST /test/:userId- Тестовое уведомлениеGET /stats- Статистика подписокDELETE /cleanup- Очистка старых подписок
NovuWebhookController (/api/novu)
API для интеграции с NOVU:
Endpoints:
POST /webhook/push- Webhook для NOVU событийPOST /subscribe- Подписка через NOVUGET /integration/config- Конфигурация интеграцииPOST /test- Тест интеграцииPOST /workflow/create- Создание workflow
📦 Модули
WebPushModule
Объединяет все компоненты web-push функциональности:
- Импорт TypeORM сущностей
- Регистрация всех сервисов и контроллеров
- Экспорт основных сервисов для использования в других модулях
AppModule (обновлен)
- Добавлена конфигурация TypeORM для PostgreSQL
- Интеграция WebPushModule
- Настройки подключения к БД через переменные окружения
Возможности и функционал
✨ Web Push Features
-
Полная поддержка Web Push API:
- Title, body, icon, badge, image
- Actions (кнопки в уведомлении)
- Custom data payload
- TTL, urgency, topic settings
-
VAPID аутентификация:
- Автогенерация ключей при первом запуске
- Безопасная передача публичного ключа клиентам
- Настройка subject для идентификации
-
Управление подписками:
- Множественные подписки на пользователя
- Автоматическая деактивация недействительных endpoint'ов
- Поддержка различных браузеров и устройств
🔗 NOVU Integration
-
Webhook интеграция:
- Автоматическая обработка NOVU событий
- Поддержка template переменных
- Валидация входящих данных
-
Workflow создание:
- Программное создание workflows с push поддержкой
- Определение payload схем
- Настройка preferences
-
Dual отправка:
- Через NOVU систему
- Прямая отправка как fallback
📊 Мониторинг и обслуживание
-
Автоматизация:
- Ежедневная очистка неактивных подписок
- Еженедельная статистика
- Автоматическая деактивация недоступных endpoint'ов
-
Статистика:
- Общее количество подписок
- Активные/неактивные подписки
- Уникальные пользователи
- Процент активности
-
Логирование:
- Детальные логи всех операций
- Разные уровни важности
- Трекинг ошибок отправки
Настройка и деплой
Переменные окружения
# Основные настройки
PORT=3000
CORS_ORIGIN=*
# NOVU
NOVU_API_KEY=your_api_key
NOVU_API_URL=https://api.novu.co
# VAPID (генерируются автоматически)
VAPID_PUBLIC_KEY=
VAPID_PRIVATE_KEY=
VAPID_SUBJECT=mailto:admin@coopenomics.io
# PostgreSQL
DB_HOST=localhost
DB_PORT=5432
DB_USERNAME=postgres
DB_PASSWORD=postgres
DB_DATABASE=notificator
DB_SYNCHRONIZE=true
DB_LOGGING=false
DB_SSL=false
Развертывание
- База данных: Создать PostgreSQL базу
notificator - Переменные: Настроить .env файл
- Запуск:
pnpm install && pnpm build && pnpm start:prod - VAPID ключи: При первом запуске будут сгенерированы автоматически
Интеграция с фронтендом
Service Worker
// Обработка push событий
self.addEventListener('push', function(event) {
const payload = JSON.parse(event.data.text());
const options = {
body: payload.body,
icon: payload.icon,
badge: payload.badge,
actions: payload.actions,
data: payload.data
};
event.waitUntil(
self.registration.showNotification(payload.title, options)
);
});
Подписка
// Получение VAPID ключа и подписка
const { publicKey } = await fetch('/api/push/vapid-public-key').then(r => r.json());
const registration = await navigator.serviceWorker.register('/sw.js');
const subscription = await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: publicKey
});
// Отправка подписки на сервер
await fetch('/api/push/subscribe', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ userId: 'user123', subscription })
});
Безопасность и производительность
Безопасность
- ✅ VAPID аутентификация
- ✅ Валидация всех входящих данных
- ✅ Автоматическая очистка недействительных подписок
- ✅ CORS настройки
- ✅ Webhook подпись валидация (готов к настройке)
Производительность
- ✅ Индексы БД для быстрых запросов
- ✅ Batch отправка уведомлений
- ✅ Автоматическая очистка старых данных
- ✅ Connection pooling для БД
- ✅ Graceful error handling
Результат
Создан production-ready сервис web-push уведомлений со следующими возможностями:
🎯 Для разработчиков:
- Простое REST API для интеграции
- TypeScript типизация
- Подробная документация
- Тестовые скрипты
🎯 Для пользователей:
- Кроссплатформенные push уведомления
- Поддержка rich notifications
- Быстрая доставка
- Надежная работа
🎯 Для администраторов:
- Автоматическое обслуживание
- Подробная статистика
- Гибкая настройка
- Мониторинг производительности
🎯 Для NOVU интеграции:
- Webhook поддержка
- Workflow создание
- Template processing
- Fallback механизмы
Сервис готов к использованию в production среде и может масштабироваться в зависимости от нагрузки.