@coopenomics/notifications 2025.11.8-alpha-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/rules/notifications.mdc +20 -0
- package/.env-example +2 -0
- package/README.md +218 -0
- package/build.config.ts +13 -0
- package/dist/index.cjs +3027 -0
- package/dist/index.d.cts +792 -0
- package/dist/index.d.mts +792 -0
- package/dist/index.d.ts +792 -0
- package/dist/index.mjs +3016 -0
- package/package.json +55 -0
- package/src/base/defaults.ts +66 -0
- package/src/base/workflow-builder.ts +128 -0
- package/src/index.ts +9 -0
- package/src/sync/README.md +54 -0
- package/src/sync/novu-sync.service.ts +246 -0
- package/src/sync/sync-runner.ts +154 -0
- package/src/types/index.ts +99 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/slugify/builtinReplacements.ts +2065 -0
- package/src/utils/slugify/slugify.ts +284 -0
- package/src/utils/slugify/transliterate.ts +48 -0
- package/src/workflows/approval-request/index.ts +52 -0
- package/src/workflows/approval-response/index.ts +54 -0
- package/src/workflows/decision-approved/index.ts +50 -0
- package/src/workflows/email-verification/index.ts +35 -0
- package/src/workflows/incoming-transfer/index.ts +43 -0
- package/src/workflows/index.ts +74 -0
- package/src/workflows/invite/index.ts +34 -0
- package/src/workflows/meet-ended/index.ts +51 -0
- package/src/workflows/meet-initial/index.ts +53 -0
- package/src/workflows/meet-reminder-end/index.ts +52 -0
- package/src/workflows/meet-reminder-start/index.ts +51 -0
- package/src/workflows/meet-restart/index.ts +53 -0
- package/src/workflows/meet-started/index.ts +51 -0
- package/src/workflows/new-agenda-item/index.ts +51 -0
- package/src/workflows/new-deposit-payment-request/index.ts +50 -0
- package/src/workflows/new-initial-payment-request/index.ts +50 -0
- package/src/workflows/payment-cancelled/index.ts +51 -0
- package/src/workflows/payment-paid/index.ts +50 -0
- package/src/workflows/reset-key/index.ts +36 -0
- package/src/workflows/server-provisioned/index.ts +45 -0
- package/src/workflows/welcome/index.ts +43 -0
- package/tsconfig.json +18 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
globs: notifications/src/workflows/**/*.ts
|
|
3
|
+
---
|
|
4
|
+
# Правила валидации воркфлоу
|
|
5
|
+
|
|
6
|
+
## 🚫 ID воркфлоу
|
|
7
|
+
- **Длина ID не должна превышать 32 символа**
|
|
8
|
+
- Используйте описательные, но короткие идентификаторы
|
|
9
|
+
|
|
10
|
+
## 🚫 Условия в шаблонах
|
|
11
|
+
- **Запрещено использовать JavaScript выражения в шаблонах Novu**
|
|
12
|
+
- Нельзя использовать:
|
|
13
|
+
- Тернарные операторы: `{{condition ? "text1" : "text2"}}`
|
|
14
|
+
- Логические операторы: `{{field && "text"}}`
|
|
15
|
+
- Любые другие JS конструкции
|
|
16
|
+
|
|
17
|
+
## ✅ Рекомендации
|
|
18
|
+
- Добавляйте текстовые поля в payload для условной логики
|
|
19
|
+
- Вычисляйте значения на стороне сервера перед отправкой уведомления
|
|
20
|
+
- Используйте только простые переменные: `{{payload.fieldName}}`
|
package/.env-example
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# Notifications Library - Типизированные Workflow для Novu
|
|
2
|
+
|
|
3
|
+
Библиотека для создания типизированных workflow уведомлений с использованием Zod схем и паттерна Builder.
|
|
4
|
+
|
|
5
|
+
## Особенности
|
|
6
|
+
|
|
7
|
+
- 🔒 **Типобезопасность** - Полная типизация payload с Zod
|
|
8
|
+
- 🏗️ **Builder Pattern** - Удобное создание workflow
|
|
9
|
+
- 📝 **Декларативный API** - Простое описание шагов уведомлений
|
|
10
|
+
- 🔧 **Расширяемость** - Легкое добавление новых типов workflow
|
|
11
|
+
- ⚡ **Валидация** - Автоматическая валидация данных
|
|
12
|
+
- 🏷️ **Теги и роли** - Группировка уведомлений по ролям пользователей
|
|
13
|
+
|
|
14
|
+
## Установка
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
cd components/notifications
|
|
18
|
+
pnpm install
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Быстрый старт
|
|
22
|
+
|
|
23
|
+
### 1. Создание нового workflow
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
import { z } from 'zod';
|
|
27
|
+
import { WorkflowBuilder, createEmailStep, createInAppStep } from '@coopenomics/notifications';
|
|
28
|
+
|
|
29
|
+
// Определяем схему данных
|
|
30
|
+
const myPayloadSchema = z.object({
|
|
31
|
+
userName: z.string(),
|
|
32
|
+
userEmail: z.string().email(),
|
|
33
|
+
orderTotal: z.number(),
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
type MyPayload = z.infer<typeof myPayloadSchema>;
|
|
37
|
+
|
|
38
|
+
// Создаем workflow
|
|
39
|
+
export const orderConfirmationWorkflow = WorkflowBuilder
|
|
40
|
+
.create<MyPayload>()
|
|
41
|
+
.name('Order Confirmation')
|
|
42
|
+
.workflowId('order-confirmation')
|
|
43
|
+
.description('Подтверждение заказа')
|
|
44
|
+
.payloadSchema(myPayloadSchema)
|
|
45
|
+
.addSteps([
|
|
46
|
+
createEmailStep(
|
|
47
|
+
'order-email',
|
|
48
|
+
'Заказ подтвержден - {{payload.userName}}',
|
|
49
|
+
'Здравствуйте, {{payload.userName}}! Ваш заказ на сумму {{payload.orderTotal}} подтвержден.'
|
|
50
|
+
),
|
|
51
|
+
createInAppStep(
|
|
52
|
+
'order-notification',
|
|
53
|
+
'Заказ обработан',
|
|
54
|
+
'Заказ успешно обработан и скоро будет отправлен.'
|
|
55
|
+
),
|
|
56
|
+
])
|
|
57
|
+
.build();
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 2. Регистрация workflow
|
|
61
|
+
|
|
62
|
+
Добавьте ваш workflow в `src/workflows/index.ts`:
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
import { orderConfirmationWorkflow } from './order-confirmation';
|
|
66
|
+
|
|
67
|
+
export const allWorkflows: WorkflowDefinition[] = [
|
|
68
|
+
welcomeWorkflow,
|
|
69
|
+
orderConfirmationWorkflow, // ← добавляем новый workflow
|
|
70
|
+
];
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 3. Использование в коде
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
import { orderConfirmationWorkflow } from '@coopenomics/notifications';
|
|
77
|
+
|
|
78
|
+
// Валидация данных
|
|
79
|
+
const payload = orderConfirmationWorkflow.payloadZodSchema.parse({
|
|
80
|
+
userName: 'Иван Иванов',
|
|
81
|
+
userEmail: 'ivan@example.com',
|
|
82
|
+
orderTotal: 1500,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// Данные для отправки в Novu
|
|
86
|
+
const novuData = orderConfirmationWorkflow.payloadSchema;
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Структура проекта
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
src/
|
|
93
|
+
├── types/ # Базовые типы и интерфейсы
|
|
94
|
+
├── base/ # Базовые утилиты и настройки
|
|
95
|
+
│ ├── defaults.ts # Настройки по умолчанию
|
|
96
|
+
│ └── workflow-builder.ts # Builder для создания workflow
|
|
97
|
+
└── workflows/ # Папки с workflow
|
|
98
|
+
├── welcome/ # Приветственные уведомления
|
|
99
|
+
├── order/ # Уведомления о заказах
|
|
100
|
+
└── index.ts # Экспорт всех workflow
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## API Reference
|
|
104
|
+
|
|
105
|
+
### WorkflowBuilder
|
|
106
|
+
|
|
107
|
+
Основной класс для создания workflow:
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
const workflow = WorkflowBuilder
|
|
111
|
+
.create<PayloadType>()
|
|
112
|
+
.name('Workflow Name') // Название workflow
|
|
113
|
+
.workflowId('unique-workflow-id') // Уникальный ID
|
|
114
|
+
.description('Описание workflow') // Описание (опционально)
|
|
115
|
+
.payloadSchema(zodSchema) // Zod схема для валидации
|
|
116
|
+
.addStep(step) // Добавить шаг
|
|
117
|
+
.addSteps([step1, step2]) // Добавить несколько шагов
|
|
118
|
+
.origin('external') // Источник (опционально)
|
|
119
|
+
.build(); // Собрать workflow
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Вспомогательные функции
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
// Email уведомление
|
|
126
|
+
createEmailStep(name, subject, body)
|
|
127
|
+
|
|
128
|
+
// In-app уведомление
|
|
129
|
+
createInAppStep(name, subject, body, avatar?)
|
|
130
|
+
|
|
131
|
+
// Push уведомление
|
|
132
|
+
createPushStep(name, title, body)
|
|
133
|
+
|
|
134
|
+
// SMS уведомление
|
|
135
|
+
createSmsStep(name, body)
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Типы workflow
|
|
139
|
+
|
|
140
|
+
### Email
|
|
141
|
+
- `subject` - Тема письма
|
|
142
|
+
- `body` - HTML содержимое
|
|
143
|
+
- `editorType` - 'html' | 'text'
|
|
144
|
+
|
|
145
|
+
### In-App
|
|
146
|
+
- `subject` - Заголовок уведомления
|
|
147
|
+
- `body` - Текст уведомления
|
|
148
|
+
- `avatar` - URL аватара (опционально)
|
|
149
|
+
|
|
150
|
+
### Push
|
|
151
|
+
- `subject` - Заголовок push-уведомления
|
|
152
|
+
- `body` - Текст push-уведомления
|
|
153
|
+
|
|
154
|
+
### SMS
|
|
155
|
+
- `body` - Текст SMS
|
|
156
|
+
|
|
157
|
+
## Шаблонизация
|
|
158
|
+
|
|
159
|
+
Используйте Handlebars синтаксис для динамических данных:
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
// Простая подстановка
|
|
163
|
+
"Привет, {{payload.userName}}!"
|
|
164
|
+
|
|
165
|
+
// Условные блоки
|
|
166
|
+
"{{#payload.age}}Ваш возраст: {{payload.age}}{{/payload.age}}"
|
|
167
|
+
|
|
168
|
+
// Вложенные объекты
|
|
169
|
+
"{{payload.order.total}} руб."
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Теги и роли
|
|
173
|
+
|
|
174
|
+
Библиотека поддерживает группировку уведомлений по ролям пользователей с помощью тегов. Теги позволяют фильтровать уведомления в UI компонентах.
|
|
175
|
+
|
|
176
|
+
### Добавление тегов к workflow
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
export const newAgendaItemWorkflow = WorkflowBuilder
|
|
180
|
+
.create<NewAgendaItemPayload>()
|
|
181
|
+
.name('Новый вопрос на повестке')
|
|
182
|
+
.workflowId('new-agenda-item')
|
|
183
|
+
.description('Уведомление о новом вопросе на повестке')
|
|
184
|
+
.payloadSchema(newAgendaItemPayloadSchema)
|
|
185
|
+
.tags(['chairman', 'member']) // Теги для ролей пользователей
|
|
186
|
+
.addSteps([
|
|
187
|
+
// ... шаги
|
|
188
|
+
])
|
|
189
|
+
.build();
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Использование в компонентах
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
// Создание табов для фильтрации по ролям
|
|
196
|
+
const tabs = [
|
|
197
|
+
{
|
|
198
|
+
label: 'Все уведомления',
|
|
199
|
+
filter: {
|
|
200
|
+
tags: [userRole.value], // Фильтр по роли пользователя
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
];
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Доступные роли
|
|
207
|
+
|
|
208
|
+
- `chairman` - Председатель совета
|
|
209
|
+
- `member` - Член совета
|
|
210
|
+
- `user` - Обычный пользователь
|
|
211
|
+
|
|
212
|
+
## Сборка
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
pnpm build
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
Результат сборки будет в папке `dist/`.
|