- Remove hardcoded database credentials from all scripts - Remove hardcoded Legacy API tokens from backend scripts - Remove hardcoded MQTT credentials from mqtt-test.js - Update backend/.env.example with DB_HOST, DB_USER, DB_PASSWORD, DB_NAME - Update backend/.env.example with LEGACY_API_TOKEN and MQTT credentials - Add dotenv config to all scripts requiring credentials - Create comprehensive documentation: - scripts/README.md - Root scripts usage - backend/scripts/README.md - Backend scripts documentation - MQTT_TESTING.md - MQTT testing guide - SECURITY_CREDENTIALS_CLEANUP.md - Security changes summary All scripts now read credentials from backend/.env instead of hardcoded values. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
8.1 KiB
8.1 KiB
PRD — WellNuo Push Notifications System
Цель
Полноценная система push-уведомлений от IoT датчиков через MQTT с настройками по типам алертов и ролям пользователей.
Контекст проекта
- Mobile App: Expo 54 (React Native) с expo-router
- Backend: Express.js на Node.js (PM2: wellnuo-api)
- API URL: https://wellnuo.smartlaunchhub.com/api
- MQTT: mqtt.eluxnetworks.net:1883 (уже подключен, работает)
- БД: PostgreSQL на eluxnetworks.net
Текущий статус
- ✅ MQTT подключен к брокеру, получает сообщения
- ✅ Таблица
mqtt_alertsсоздана - ✅ API
/api/push-tokensсуществует - ✅ API
/api/notification-settingsсуществует - ❌
expo-notificationsне установлен - ❌ Push токены не регистрируются (0 в БД)
- ❌ Настройки не используются при отправке
User Flow
| # | Кто | Действие | API/Система | Результат |
|---|---|---|---|---|
| 1 | User | Логин в приложение | POST /api/auth/verify-otp | JWT токен |
| 2 | App | Запрос разрешения push | expo-notifications | Expo Push Token |
| 3 | App | Регистрация токена | POST /api/push-tokens | Токен в БД |
| 4 | Sensor | Отправка алерта | MQTT /well_{id} | Сообщение |
| 5 | Backend | Получение MQTT | mqtt.js service | Парсинг алерта |
| 6 | Backend | Поиск пользователей | SQL JOIN | Список с токенами |
| 7 | Backend | Проверка настроек | notification_settings | Фильтрация |
| 8 | Backend | Отправка push | expo-server-sdk | Push на устройство |
| 9 | User | Получение push | iOS/Android | Уведомление |
Задачи
@worker1 — Backend (API, MQTT)
Файлы: backend/src/services/mqtt.js, backend/src/routes/notification-settings.js
-
@worker1 [TASK-1] Улучшить sendPushNotifications с проверкой настроек
- Файл:
backend/src/services/mqtt.js - Что сделать:
- Перед отправкой push проверять notification_settings пользователя
- Фильтровать по типу алерта (emergency_alerts, activity_alerts, low_battery)
- Проверять quiet_hours (если включены и текущее время в диапазоне — не отправлять non-critical)
- Результат: Push отправляется только если настройки разрешают
- Файл:
-
@worker1 [TASK-2] Добавить notification_history таблицу и логирование
- Файл: SQL миграция +
backend/src/services/mqtt.js - Что сделать:
- Создать таблицу notification_history (user_id, beneficiary_id, alert_type, channel, status, skip_reason, created_at)
- Логировать каждую попытку отправки (sent/skipped/failed)
- Результат: История всех уведомлений в БД
- Файл: SQL миграция +
-
@worker1 [TASK-3] API для получения истории алертов
- Файл:
backend/src/routes/mqtt.js - Что сделать:
- GET /api/mqtt/alerts/history — история из notification_history
- Фильтры: beneficiary_id, date_from, date_to, status
- Результат: Можно посмотреть историю уведомлений
- Файл:
-
@worker1 [TASK-4] Деплой backend изменений
- Команда:
rsync backend/ → server + pm2 restart wellnuo-api - Результат: Изменения на проде
- Команда:
@worker2 — Mobile App (Push, UI)
Файлы: app/, services/, package.json
-
@worker2 [TASK-5] Установить expo-notifications
- Файл:
package.json - Команда:
npx expo install expo-notifications - Результат: Пакет установлен
- Файл:
-
@worker2 [TASK-6] Создать сервис pushNotifications.ts
- Файл:
services/pushNotifications.ts - Что сделать:
- registerForPushNotificationsAsync() — запрос разрешения + получение Expo Push Token
- registerTokenOnServer(token) — отправка на POST /api/push-tokens
- unregisterToken() — удаление при logout
- Результат: Сервис для работы с push токенами
- Файл:
-
@worker2 [TASK-7] Интеграция при логине
- Файл:
app/(auth)/verify-otp.tsxилиcontexts/AuthContext.tsx - Что сделать:
- После успешного логина вызывать registerForPushNotificationsAsync()
- Отправлять токен на сервер
- Результат: Push токен регистрируется автоматически
- Файл:
-
@worker2 [TASK-8] Обработка входящих push уведомлений
- Файл:
app/_layout.tsx - Что сделать:
- Настроить notification listeners
- При тапе на push — навигация к соответствующему экрану
- Результат: Push уведомления работают в foreground/background
- Файл:
-
@worker2 [TASK-9] UI настроек уведомлений
- Файл:
app/(tabs)/profile/notifications.tsx - Что сделать:
- Загружать текущие настройки GET /api/notification-settings
- Переключатели для: Emergency Alerts, Activity Alerts, Low Battery, Daily Summary
- Quiet Hours: toggle + time pickers (start/end)
- Сохранение через PATCH /api/notification-settings
- Результат: Пользователь может настроить уведомления
- Файл:
Как проверить
После @worker1 (Backend)
# Отправить тестовый алерт
node mqtt-test.js send "Test alert from PRD"
# Проверить логи
ssh root@91.98.205.156 "pm2 logs wellnuo-api --lines 20 | grep MQTT"
# Проверить notification_history
PGPASSWORD='W31153Rg31' psql -h eluxnetworks.net -U sergei -d wellnuo_app \
-c "SELECT * FROM notification_history ORDER BY created_at DESC LIMIT 5;"
После @worker2 (Mobile)
- Запустить приложение на симуляторе:
expo-sim 8081 - Залогиниться
- Проверить что токен появился в БД:
PGPASSWORD='W31153Rg31' psql -h eluxnetworks.net -U sergei -d wellnuo_app \ -c "SELECT * FROM push_tokens;" - Отправить тестовый алерт
- Убедиться что push пришёл
Чеклист верификации
Функциональность
- Push токен регистрируется при логине
- MQTT алерты сохраняются в mqtt_alerts
- Push отправляется с учётом настроек
- Notification history записывается
- UI настроек работает
Код
- Нет TypeScript ошибок
- Backend деплоится без ошибок
- App собирается без ошибок
Распределение файлов (проверка на конфликты)
| Worker | Файлы | Конфликт? |
|---|---|---|
| @worker1 | backend/src/services/mqtt.js |
— |
| @worker1 | backend/src/routes/mqtt.js |
— |
| @worker1 | backend/src/routes/notification-settings.js |
— |
| @worker2 | services/pushNotifications.ts (новый) |
— |
| @worker2 | app/(auth)/verify-otp.tsx |
— |
| @worker2 | app/_layout.tsx |
— |
| @worker2 | app/(tabs)/profile/notifications.tsx |
— |
| @worker2 | package.json |
— |
Пересечений нет ✅
Минимальный балл: 8/10