265 lines
8.8 KiB
Markdown
265 lines
8.8 KiB
Markdown
# Тестовая отправка Push-уведомлений
|
||
|
||
## Что добавлено
|
||
|
||
В админ-панели теперь есть кнопка **"🧪 Тест Push-уведомления"** с подробным логированием всего процесса отправки.
|
||
|
||
### Backend endpoint
|
||
|
||
**POST** `/api/notifications/test-push`
|
||
|
||
- ✅ Требует авторизацию (Bearer token)
|
||
- ✅ Требует права администратора (`isAdmin: true`)
|
||
- ✅ Подробное логирование каждого шага
|
||
|
||
### Frontend кнопка
|
||
|
||
Расположена в **Админ-панели** (правый верхний угол).
|
||
|
||
## Логирование
|
||
|
||
### Backend логи (консоль сервера)
|
||
|
||
```
|
||
🧪 [TEST PUSH] Запрос от пользователя: { userId: 1, username: 'admin' }
|
||
✅ [TEST PUSH] Пользователь является админом, продолжаем...
|
||
📊 [TEST PUSH] Найдено подписок для пользователя 1: 2
|
||
📱 Подписка 1: { id: 123, endpoint: 'https://fcm.googleapis...', userAgent: 'Mozilla/5.0...', ... }
|
||
📱 Подписка 2: { id: 124, endpoint: 'https://fcm.googleapis...', userAgent: 'Chrome...', ... }
|
||
📝 [TEST PUSH] Создаём тестовое уведомление в БД...
|
||
✅ [TEST PUSH] Уведомление создано в БД: 456
|
||
📤 [TEST PUSH] Отправляем Push-уведомление...
|
||
✅ [TEST PUSH] Push-уведомление успешно отправлено!
|
||
```
|
||
|
||
### Frontend логи (консоль браузера)
|
||
|
||
```
|
||
🧪 [FRONTEND] Начинаем тестовую отправку Push-уведомления...
|
||
📝 [FRONTEND] Токен найден: Да
|
||
📤 [FRONTEND] Отправляем запрос на: https://ospab.host:5000/api/notifications/test-push
|
||
✅ [FRONTEND] Ответ от сервера: { success: true, message: '...', data: { notificationId: 456, subscriptionsCount: 2 } }
|
||
📊 [FRONTEND] Детали: { notificationId: 456, subscriptionsCount: 2 }
|
||
```
|
||
|
||
## Как использовать
|
||
|
||
### 1. Включите Push-уведомления
|
||
|
||
1. Перейдите в **Дашборд → Уведомления**
|
||
2. Нажмите **"Включить уведомления"** (синяя кнопка)
|
||
3. Разрешите уведомления в браузере
|
||
4. Дождитесь сообщения **"Push-уведомления успешно подключены!"**
|
||
|
||
### 2. Откройте админ-панель
|
||
|
||
1. Перейдите в **Дашборд → Админ-панель** (👑 иконка в сайдбаре)
|
||
2. В правом верхнем углу увидите кнопку **"🧪 Тест Push-уведомления"**
|
||
|
||
### 3. Нажмите кнопку
|
||
|
||
1. Откройте **DevTools → Console** (F12)
|
||
2. Нажмите **"🧪 Тест Push-уведомления"**
|
||
3. Следите за логами в консоли браузера
|
||
|
||
### 4. Проверьте сервер
|
||
|
||
Откройте консоль сервера (SSH):
|
||
```bash
|
||
pm2 logs ospab-backend --lines 50
|
||
```
|
||
|
||
Увидите подробные логи с эмодзи-маркерами.
|
||
|
||
### 5. Проверьте результат
|
||
|
||
Через несколько секунд должно прийти Push-уведомление:
|
||
- **Заголовок:** 🧪 Тестовое уведомление
|
||
- **Текст:** Это тестовое Push-уведомление. Если вы его видите — всё работает отлично!
|
||
- **Иконка:** /logo192.png
|
||
- **Клик:** Перенаправляет на /dashboard/notifications
|
||
|
||
## Возможные ошибки
|
||
|
||
### ❌ "У вас нет прав администратора" (403)
|
||
|
||
**Причина:** Пользователь не является администратором.
|
||
|
||
**Решение:**
|
||
```sql
|
||
UPDATE User SET isAdmin = 1 WHERE id = YOUR_USER_ID;
|
||
```
|
||
|
||
### ❌ "У вас нет активных Push-подписок" (400)
|
||
|
||
**Причина:** Push-уведомления не включены.
|
||
|
||
**Решение:**
|
||
1. Перейдите в **Дашборд → Уведомления**
|
||
2. Нажмите **"Включить уведомления"**
|
||
3. Разрешите в браузере
|
||
4. Попробуйте снова
|
||
|
||
### ❌ "Уведомление создано в БД, но ошибка при отправке Push" (500)
|
||
|
||
**Причины:**
|
||
1. Неправильные VAPID ключи
|
||
2. Подписка устарела
|
||
3. Проблема с web-push библиотекой
|
||
|
||
**Решение:**
|
||
|
||
**Проверьте VAPID ключи:**
|
||
```bash
|
||
cd /var/www/ospab-host/backend
|
||
cat .env | grep VAPID
|
||
```
|
||
|
||
Должны быть заполнены:
|
||
```
|
||
VAPID_PUBLIC_KEY=BPtLNi3TY1ifUWTkgZrhxoEH6ihDgknFcgzc3xzFQg07PeuJ1TsJDQZqA32VqlxUo03g_mG0yKCKqADb4r5fnsM
|
||
VAPID_PRIVATE_KEY=5uEJBxEzCLhcMBPyGEw_GDx9JDneb6poZiX8f3b0zNE
|
||
VAPID_SUBJECT=mailto:support@ospab.host
|
||
```
|
||
|
||
**Пересоздайте подписку:**
|
||
1. Удалите старую: `DELETE FROM PushSubscription WHERE userId = YOUR_USER_ID;`
|
||
2. Перейдите в **Дашборд → Уведомления**
|
||
3. Включите уведомления заново
|
||
|
||
### ❌ 410 Gone - Подписка устарела
|
||
|
||
**Причина:** Push подписка больше недействительна (браузер её отозвал).
|
||
|
||
**Решение:** Сервис автоматически удаляет устаревшие подписки. Пересоздайте подписку (см. выше).
|
||
|
||
## Диагностика проблем
|
||
|
||
### Проверка подписок в БД
|
||
|
||
```sql
|
||
SELECT
|
||
ps.id,
|
||
ps.userId,
|
||
ps.endpoint,
|
||
ps.userAgent,
|
||
ps.createdAt,
|
||
ps.lastUsed,
|
||
u.username
|
||
FROM PushSubscription ps
|
||
JOIN User u ON ps.userId = u.id
|
||
ORDER BY ps.createdAt DESC;
|
||
```
|
||
|
||
### Проверка уведомлений в БД
|
||
|
||
```sql
|
||
SELECT * FROM Notification
|
||
WHERE type = 'test'
|
||
ORDER BY createdAt DESC
|
||
LIMIT 10;
|
||
```
|
||
|
||
### Проверка Service Worker
|
||
|
||
1. Откройте сайт в браузере
|
||
2. DevTools (F12) → Application → Service Workers
|
||
3. Должен быть зарегистрирован `/service-worker.js` со статусом **Activated**
|
||
|
||
### Проверка VAPID ключа через API
|
||
|
||
```bash
|
||
curl https://ospab.host:5000/api/notifications/vapid-key \
|
||
-H "Authorization: Bearer YOUR_TOKEN"
|
||
```
|
||
|
||
Должен вернуть:
|
||
```json
|
||
{
|
||
"success": true,
|
||
"publicKey": "BPtLNi3TY1ifUWTkgZrhxoEH6ihDgknFcgzc3xzFQg07PeuJ1TsJDQZqA32VqlxUo03g_mG0yKCKqADb4r5fnsM"
|
||
}
|
||
```
|
||
|
||
## Что логируется
|
||
|
||
### Backend
|
||
|
||
| Эмодзи | Описание |
|
||
|--------|----------|
|
||
| 🧪 | Начало тестовой отправки |
|
||
| ✅ | Успешный этап |
|
||
| ❌ | Ошибка |
|
||
| 📊 | Статистика/данные |
|
||
| 📱 | Информация о подписке |
|
||
| 📝 | Создание записи |
|
||
| 📤 | Отправка |
|
||
| ⚠️ | Предупреждение |
|
||
|
||
### Frontend
|
||
|
||
| Эмодзи | Описание |
|
||
|--------|----------|
|
||
| 🧪 | Начало процесса |
|
||
| 📝 | Проверка данных |
|
||
| 📤 | Отправка запроса |
|
||
| ✅ | Успешный ответ |
|
||
| ❌ | Ошибка |
|
||
| 📊 | Детали ответа |
|
||
| 📋 | Детали ошибки |
|
||
|
||
## Ручная отправка через код
|
||
|
||
Если нужно отправить тестовое уведомление программно:
|
||
|
||
```typescript
|
||
import { sendPushNotification } from './modules/notification/push.service';
|
||
|
||
// В любом месте backend кода
|
||
await sendPushNotification(userId, {
|
||
title: 'Заголовок',
|
||
body: 'Текст уведомления',
|
||
icon: '/logo192.png',
|
||
badge: '/favicon.svg',
|
||
data: {
|
||
notificationId: 123,
|
||
actionUrl: '/dashboard'
|
||
}
|
||
});
|
||
```
|
||
|
||
## Файлы изменены
|
||
|
||
1. ✅ `backend/src/modules/notification/notification.controller.ts`
|
||
- Добавлен `testPushNotification()` с подробным логированием
|
||
|
||
2. ✅ `backend/src/modules/notification/notification.routes.ts`
|
||
- Добавлен роут `POST /api/notifications/test-push`
|
||
|
||
3. ✅ `frontend/src/pages/dashboard/admin.tsx`
|
||
- Добавлена кнопка тестовой отправки
|
||
- Добавлен `handleTestPushNotification()` с логированием
|
||
- Состояние `testingPush` для индикации загрузки
|
||
|
||
## Деплой
|
||
|
||
```bash
|
||
# Backend
|
||
cd /var/www/ospab-host/backend
|
||
npm run build
|
||
pm2 restart ospab-backend
|
||
|
||
# Frontend
|
||
cd /var/www/ospab-host/frontend
|
||
npm run build
|
||
# Скопируйте dist/ в web root
|
||
|
||
# Проверка логов
|
||
pm2 logs ospab-backend --lines 100
|
||
```
|
||
|
||
---
|
||
|
||
**Статус:** ✅ Готово к тестированию
|
||
**Дата:** 2025-11-01
|