klg-asutk-app/docs/NOTIFICATIONS.md
Yuriy 0150aba4f5 Consolidation: KLG ASUTK + PAPA integration
- 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>
2026-02-08 17:18:31 +03:00

6.3 KiB
Raw Blame History

Система уведомлений

Обзор

Реализована комплексная система уведомлений для отслеживания критических событий и важных изменений в системе.

Типы уведомлений

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-уведомлений
  • Логирование всех отправленных уведомлений

Производительность

  • Кэширование уведомлений на клиенте
  • Пагинация для большого количества уведомлений
  • Ленивая загрузка звуковых файлов
  • Оптимизация запросов к БД