Уведомления
Три канала — in-app, browser push, Telegram
Модуль: src/lib/notifications/. WebSockets в проекте не используются — осознанное решение.
Каналы
| Канал | Механика | Код |
|---|---|---|
| In-app | Записи в таблице Notification, клиент опрашивает раз в 30 секунд (useNotifications) | create.ts |
| Browser Push | Web Push API + Service Worker (public/sw.js), работает при закрытой вкладке. Подписки в PushSubscription | push.ts, vapid.ts |
| Telegram | Bot API, личные сообщения пользователям с заполненным telegramId | telegram.ts |
Как отправлять
Используй хелперы, а не каналы напрямую:
import { notifyMonsterTeam } from "@/lib/notifications/create";
// Уведомить команду (in-app + push + telegram автоматически)
await notifyMonsterTeam({
type: "TASK_CREATED",
message: "Новая задача от клиента",
entityType: "task",
entityId: task.id,
});Также есть notify() (конкретный пользователь) и notifyTaskCompanyClients() (клиенты компании задачи).
Типы событий
NotificationType: TASK_CREATED, TASK_STATUS_CHANGED, REFERENCE_UPLOADED, CONTENT_UPLOADED, REVISION_REQUESTED, CONTENT_RETURNED_TO_REVIEW, CONTENT_APPROVED, SYSTEM.
Push: настройка
- Сгенерировать VAPID-ключи:
npx tsx scripts/generate-vapid-keys.ts→ в env. - Браузер регистрирует Service Worker и подписывается (
usePushNotifications,useAutoRequestPush). - Подписка сохраняется через
POST /api/push/subscribe.
API
GET /api/notifications— список (пагинация, фильтры);POST /api/notifications/[id]/read,POST /api/notifications/read-all;GET /api/push/vapid-key,POST /api/push/subscribe,POST /api/push/unsubscribe.
Страница истории для команды: /team/notifications.