7.2 KiB
7.2 KiB
Улучшение системы оповещений
Дата: 2026-05-18
Проблемы
- Дублирование кода входа в Telegram — настройка
authCodeDuplicateне работает, т.к.resolveAuthCodeTargetsимпортирован, но не вызывается в диспетчере уведомлений. - Двойное уведомление о новом заказе —
order:createdиorder:created:adminоба проходят черезresolveAdminNotificationTargets('order:created'), что даёт 2 одинаковых оповещения админу. - Пропущен
PAIDв русских лейблах статусов — вtelegram-templates.jsиemail-templates.jsнет ключаPAID. - Текст оповещений слишком краткий — нет подсказок о следующих действиях для пользователя и админа.
Решения
1. Дублирование кода входа (гибридный подход)
- Письмо с кодом входа уходит мгновенно через прямой вызов
sendLoginCodeEmailвissueEmailCode(без изменений). - В
dispatchNotificationдляAUTH_CODE_REQUESTEDиспользуется отдельный резолверresolveAuthCodeTargetsвместо общихresolveUserNotificationTargets/resolveAdminNotificationTargets. resolveAuthCodeTargetsуже правильно реализован: отправляет email пользователю, а Telegram — только еслиpayload.isAdmin === trueи включена настройкаauthCodeDuplicate.
Изменяемые файлы:
server/src/index.js— добавить условие вdispatchNotificationдляAUTH_CODE_REQUESTED
2. Двойное уведомление о новом заказе
- Удалить
ORDER_CREATEDизadminEventFieldMapвpreferences.js. - Админ получает уведомление о новом заказе только через событие
'order:created:admin'.
Изменяемые файлы:
server/src/lib/notifications/preferences.js— удалить[ORDER_CREATED]: "newOrder"изadminEventFieldMap
3. Добавление PAID в лейблы статусов
PAID: 'Оплачен'вtelegram-templates.jsиemail-templates.js.
Изменяемые файлы:
server/src/lib/notifications/templates/telegram-templates.jsserver/src/lib/notifications/templates/email-templates.js
4. Расширение текста оповещений
4a. Пользователь: Заказ создан
В событие ORDER_CREATED передаётся deliveryType:
deliveryType === 'pickup'→ "Ваш заказ №XXX успешно создан. Товаров: X | Сумма: XXX ₽. Ожидает оплаты."deliveryType === 'delivery'→ "Ваш заказ №XXX успешно создан. Товаров: X | Сумма: XXX ₽. Оплата будет доступна после уточнения стоимости доставки."
Изменяемые файлы:
server/src/routes/user-orders.js— добавитьdeliveryTypeв payload событияORDER_CREATEDserver/src/lib/notifications/templates/telegram-templates.js— обновитьrenderOrderCreatedTgserver/src/lib/notifications/templates/email-templates.js— обновитьrenderOrderCreatedEmail
4b. Новое событие: deliveryFeeAdjusted
При корректировке стоимости доставки (PATCH /api/admin/orders/:id/delivery-fee) отправлять пользователю уведомление:
- Текст: "Стоимость доставки скорректирована. Ожидает оплаты."
Событие: 'order:deliveryFeeAdjusted' — добавляется в NOTIFICATION_EVENTS.
Изменяемые файлы:
shared/constants/notification-events.js— добавитьDELIVERY_FEE_ADJUSTEDshared/constants/notification-events.d.ts— добавить'order:deliveryFeeAdjusted'server/src/lib/notifications/preferences.js— добавитьDELIVERY_FEE_ADJUSTEDвuserEventFieldMapserver/src/routes/api/admin-orders.js— emitDELIVERY_FEE_ADJUSTEDпосле обновленияserver/src/routes/user/notifications.js— добавить поле в APIclient/src/pages/me/ui/sections/NotificationsPage.tsx— добавить переключательserver/src/lib/notifications/templates/telegram-templates.js— новый рендерерserver/src/lib/notifications/templates/email-templates.js— новый рендерерserver/src/lib/notifications/channels/telegram-channel.js— зарегистрировать шаблонserver/src/lib/notifications/channels/email-channel.js— зарегистрировать шаблонserver/src/index.js— подписаться на событие
Также нужно добавить миграцию Prisma для поля deliveryFeeAdjusted в NotificationPreference.
4c. Админ: Новый заказ
В событие 'order:created:admin' передаётся deliveryType:
deliveryType === 'delivery'→ добавить "Скорректируйте стоимость доставки"deliveryType === 'pickup'→ как сейчас
Изменяемые файлы:
server/src/routes/user-orders.js— добавитьdeliveryTypeв payload'order:created:admin'server/src/lib/notifications/templates/telegram-templates.js— обновитьrenderAdminOrderCreatedTgserver/src/lib/notifications/templates/email-templates.js— обновитьrenderAdminOrderCreatedEmail
Схема данных
NotificationPreference (добавить поле)
model NotificationPreference {
id String @id @default(cuid())
userId String @unique
globalEnabled Boolean @default(true)
orderCreated Boolean @default(true)
orderStatusChanged Boolean @default(true)
orderMessageReceived Boolean @default(true)
paymentStatusChanged Boolean @default(true)
deliveryFeeAdjusted Boolean @default(true) // НОВОЕ
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
Обработка ошибок
- Если при delivery-fee эмите не указан
userId— событие не отправляется. - Если рендерер не найден для события —
telegram-channel.jsиemail-channel.jsлогируют warning (существующее поведение).
Тестирование
server/src/lib/notifications/__tests__/preferences.test.js— добавить тест дляresolveAuthCodeTargetsв контекстеdispatchNotification- Проверить, что после удаления
ORDER_CREATEDизadminEventFieldMapадмин не получает дубликат