- Unify API: lib/api.ts uses /api/v1, inbox uses /api/inbox (rewrites) - Remove localhost refs: openapi, inbox page - Add rewrites: /api/inbox|tmc -> inbox-server, /api/v1 -> FastAPI - Add stub routes: knowledge/insights, recommendations, search, log-error - Transfer from PAPA: prompts (inspection, tmc), scripts, supabase, data/tmc-requests - Fix inbox-server: ORDER BY created_at, package.json - Remove redundant app/api/inbox/files route (rewrites handle it) - knowledge/ in gitignore (large PDFs) Co-authored-by: Cursor <cursoragent@cursor.com>
6.3 KiB
Система уведомлений
Обзор
Реализована комплексная система уведомлений для отслеживания критических событий и важных изменений в системе.
Типы уведомлений
1. Критические риски
- Триггер: Риск с уровнем "Критический" и статусом "Требует внимания"
- Приоритет: Critical
- Действия: Email уведомление, звуковой сигнал, push-уведомление
2. Предстоящие аудиты
- Триггер: Аудит запланирован на ближайший месяц
- Приоритет: High (≤7 дней) / Medium (>7 дней)
- Действия: Email уведомление за месяц и за неделю до аудита
3. Истекающие документы
- Триггер: Документ истекает в течение 30 дней
- Приоритет: High (≤7 дней) / Medium (>7 дней)
- Действия: Email уведомление
4. Изменения статусов ВС
- Триггер: Статус ВС изменен (особенно на "На обслуживании")
- Приоритет: High (если "На обслуживании") / Medium
- Действия: Уведомление в интерфейсе
Компоненты
NotificationBell
Компонент иконки уведомлений в шапке приложения:
- Отображает количество непрочитанных уведомлений
- Пульсирующий индикатор для критических уведомлений
- Открывает центр уведомлений при клике
NotificationCenter
Модальное окно с списком всех уведомлений:
- Группировка по приоритету (критические сверху)
- Цветовая индикация приоритета
- Переход к связанным страницам при клике
- Автоматическое воспроизведение звука для критических уведомлений
API Endpoints
GET /api/notifications
Получение всех уведомлений для текущего пользователя.
Ответ:
{
"notifications": [
{
"id": "risk-123",
"type": "critical_risk",
"title": "Критический риск требует внимания",
"message": "Описание риска",
"priority": "critical",
"createdAt": "2025-01-22T10:00:00Z",
"read": false,
"actionUrl": "/risks?id=123"
}
],
"count": 10,
"unreadCount": 3
}
POST /api/notifications/[id]/read
Отметить уведомление как прочитанное.
POST /api/notifications/email
Отправка email уведомления.
Тело запроса:
{
"type": "critical_risk",
"userEmail": "user@example.com",
"riskTitle": "Название риска",
"aircraftRegistration": "RA-12345",
"riskId": "123"
}
Настройка
Email уведомления
Добавьте в .env.local:
EMAIL_SERVICE_ENABLED=true
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USER=your-email@example.com
SMTP_PASSWORD=your-password
EMAIL_FROM=noreply@example.com
Для использования Nodemailer:
npm install nodemailer
npm install --save-dev @types/nodemailer
Push уведомления
Добавьте в .env.local:
PUSH_NOTIFICATIONS_ENABLED=true
VAPID_EMAIL=your-email@example.com
VAPID_PRIVATE_KEY=your-private-key
И в .env (публичные переменные):
NEXT_PUBLIC_VAPID_PUBLIC_KEY=your-public-key
Для использования Web Push:
npm install web-push
Генерация VAPID ключей:
npx web-push generate-vapid-keys
Звуковые сигналы
Добавьте аудио файлы в public/sounds/:
alert-critical.mp3- для критических уведомленийalert-critical.ogg- альтернативный формат
Рекомендуемые источники:
Интеграция
Добавление NotificationBell в layout
import NotificationBell from '@/components/NotificationBell';
// В шапке приложения
<NotificationBell userId={user?.id} />
Автоматическая проверка уведомлений
Уведомления автоматически обновляются каждые 5 минут. Для более частых обновлений измените интервал в NotificationBell.tsx:
const interval = setInterval(loadNotifications, 1 * 60 * 1000); // Каждую минуту
Кастомизация
Приоритеты
Можно настроить цвета и иконки приоритетов в NotificationCenter.tsx:
const getPriorityColor = (priority: string) => {
switch (priority) {
case 'critical': return '#f44336';
case 'high': return '#ff9800';
// ...
}
};
Звуки
Для разных типов уведомлений можно использовать разные звуки:
<audio ref={audioRef} preload="auto">
<source src={`/sounds/alert-${notification.type}.mp3`} type="audio/mpeg" />
</audio>
Безопасность
- Rate limiting на всех API endpoints
- Проверка прав доступа перед отправкой email
- Валидация данных перед отправкой push-уведомлений
- Логирование всех отправленных уведомлений
Производительность
- Кэширование уведомлений на клиенте
- Пагинация для большого количества уведомлений
- Ленивая загрузка звуковых файлов
- Оптимизация запросов к БД