@warriorteam/redai-zalo-sdk 1.21.0 → 1.23.0
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/CHANGELOG.md +109 -0
- package/dist/services/promotion.service.d.ts +62 -4
- package/dist/services/promotion.service.d.ts.map +1 -1
- package/dist/services/promotion.service.js +391 -44
- package/dist/services/promotion.service.js.map +1 -1
- package/dist/types/message.d.ts +78 -22
- package/dist/types/message.d.ts.map +1 -1
- package/docs/MULTIPLE_USERS_PROMOTION.md +210 -0
- package/docs/PROMOTION_API_V3_MIGRATION.md +320 -0
- package/examples/promotion-examples.ts +407 -0
- package/package.json +18 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/types/message.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/types/message.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# Multiple Users Promotion - Gửi Promotion đến nhiều Users với Tracking
|
|
2
|
+
|
|
3
|
+
## Tổng quan
|
|
4
|
+
|
|
5
|
+
Method `sendCustomPromotionToMultipleUsers()` cho phép gửi promotion message đến nhiều user IDs cùng lúc với tính năng tracking real-time và error handling nâng cao.
|
|
6
|
+
|
|
7
|
+
## Tính năng chính
|
|
8
|
+
|
|
9
|
+
### 🚀 **Dual Sending Modes**
|
|
10
|
+
- **Sequential**: Gửi tuần tự với delay tùy chỉnh để tránh rate limit
|
|
11
|
+
- **Parallel**: Gửi song song để tối ưu tốc độ
|
|
12
|
+
|
|
13
|
+
### 📊 **Real-time Tracking**
|
|
14
|
+
- Progress callback theo thời gian thực
|
|
15
|
+
- Estimated time remaining
|
|
16
|
+
- Success/failure statistics
|
|
17
|
+
- Current user being processed
|
|
18
|
+
|
|
19
|
+
### 🛡️ **Error Handling**
|
|
20
|
+
- Error isolation - lỗi của 1 user không ảnh hưởng các user khác
|
|
21
|
+
- Continue on error option
|
|
22
|
+
- Detailed error information cho từng user
|
|
23
|
+
- Success rate calculation
|
|
24
|
+
|
|
25
|
+
### 📈 **Performance Metrics**
|
|
26
|
+
- Execution time tracking
|
|
27
|
+
- Success rate percentage
|
|
28
|
+
- Detailed results cho từng user
|
|
29
|
+
- Start/end timestamps
|
|
30
|
+
|
|
31
|
+
## Cách sử dụng
|
|
32
|
+
|
|
33
|
+
### Basic Usage
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import { PromotionService } from './services/promotion.service';
|
|
37
|
+
|
|
38
|
+
const promotionService = new PromotionService(zaloClient);
|
|
39
|
+
|
|
40
|
+
const result = await promotionService.sendCustomPromotionToMultipleUsers(
|
|
41
|
+
accessToken,
|
|
42
|
+
["user1", "user2", "user3"],
|
|
43
|
+
{
|
|
44
|
+
attachmentId: "your_attachment_id",
|
|
45
|
+
headerContent: "🎉 Khuyến mãi đặc biệt!",
|
|
46
|
+
textContent: "Ưu đãi độc quyền dành riêng cho bạn",
|
|
47
|
+
tableData: [
|
|
48
|
+
{ key: "Mã giảm giá", value: "SAVE50" },
|
|
49
|
+
{ key: "Giảm giá", value: "50%" }
|
|
50
|
+
],
|
|
51
|
+
buttons: [
|
|
52
|
+
{
|
|
53
|
+
title: "Mua ngay",
|
|
54
|
+
type: "oa.open.url",
|
|
55
|
+
payload: { url: "https://shop.example.com" }
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
console.log(`Sent to ${result.successful}/${result.total} users`);
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Advanced Usage với Tracking
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
const result = await promotionService.sendCustomPromotionToMultipleUsers(
|
|
68
|
+
accessToken,
|
|
69
|
+
userIds,
|
|
70
|
+
promotionData,
|
|
71
|
+
{
|
|
72
|
+
mode: "sequential",
|
|
73
|
+
delayMs: 2000,
|
|
74
|
+
continueOnError: true,
|
|
75
|
+
|
|
76
|
+
// Real-time progress tracking
|
|
77
|
+
onProgress: (progress) => {
|
|
78
|
+
const percent = Math.round((progress.completed / progress.total) * 100);
|
|
79
|
+
console.log(`📊 Progress: ${percent}% (${progress.completed}/${progress.total})`);
|
|
80
|
+
console.log(`✅ Success: ${progress.successful} | ❌ Failed: ${progress.failed}`);
|
|
81
|
+
|
|
82
|
+
if (progress.currentUserId) {
|
|
83
|
+
console.log(`🔄 Processing: ${progress.currentUserId}`);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (progress.estimatedTimeRemaining) {
|
|
87
|
+
const eta = Math.round(progress.estimatedTimeRemaining / 1000);
|
|
88
|
+
console.log(`⏱️ ETA: ~${eta}s`);
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
// Callback cho từng user
|
|
93
|
+
onUserComplete: (userResult) => {
|
|
94
|
+
if (userResult.success) {
|
|
95
|
+
console.log(`✅ ${userResult.userId}: ${userResult.result?.message_id}`);
|
|
96
|
+
} else {
|
|
97
|
+
console.log(`❌ ${userResult.userId}: ${userResult.error?.message}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Parallel Mode
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
const result = await promotionService.sendCustomPromotionToMultipleUsers(
|
|
108
|
+
accessToken,
|
|
109
|
+
userIds,
|
|
110
|
+
promotionData,
|
|
111
|
+
{
|
|
112
|
+
mode: "parallel", // Gửi tất cả cùng lúc
|
|
113
|
+
continueOnError: true,
|
|
114
|
+
onProgress: (progress) => {
|
|
115
|
+
console.log(`⚡ Parallel: ${progress.completed}/${progress.total}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
console.log(`⚡ Completed in ${result.executionTime}ms`);
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Options Parameters
|
|
124
|
+
|
|
125
|
+
### SendingOptions
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
interface SendingOptions {
|
|
129
|
+
mode?: "sequential" | "parallel"; // Chế độ gửi (default: "sequential")
|
|
130
|
+
delayMs?: number; // Delay giữa tin nhắn (default: 1000ms)
|
|
131
|
+
continueOnError?: boolean; // Tiếp tục khi có lỗi (default: true)
|
|
132
|
+
onProgress?: (progress: MultiplePromotionProgress) => void;
|
|
133
|
+
onUserComplete?: (result: PromotionUserResult) => void;
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Progress Tracking Interface
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
interface MultiplePromotionProgress {
|
|
141
|
+
total: number; // Tổng số users
|
|
142
|
+
completed: number; // Số users đã xử lý
|
|
143
|
+
successful: number; // Số users gửi thành công
|
|
144
|
+
failed: number; // Số users gửi thất bại
|
|
145
|
+
currentUserId: string | null; // User ID đang xử lý (sequential mode)
|
|
146
|
+
startTime: number; // Timestamp bắt đầu
|
|
147
|
+
estimatedTimeRemaining: number | null; // Thời gian còn lại (ms)
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Result Interface
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
interface MultiplePromotionResult {
|
|
155
|
+
total: number; // Tổng số users
|
|
156
|
+
successful: number; // Số users thành công
|
|
157
|
+
failed: number; // Số users thất bại
|
|
158
|
+
results: PromotionUserResult[]; // Chi tiết kết quả từng user
|
|
159
|
+
executionTime: number; // Thời gian thực hiện (ms)
|
|
160
|
+
mode: "sequential" | "parallel"; // Chế độ đã sử dụng
|
|
161
|
+
startTime: Date; // Thời gian bắt đầu
|
|
162
|
+
endTime: Date; // Thời gian kết thúc
|
|
163
|
+
successRate: number; // Tỷ lệ thành công (%)
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Best Practices
|
|
168
|
+
|
|
169
|
+
### 1. **Chọn Mode phù hợp**
|
|
170
|
+
- **Sequential**: Cho campaigns lớn, tránh rate limit
|
|
171
|
+
- **Parallel**: Cho urgent notifications, tối ưu tốc độ
|
|
172
|
+
|
|
173
|
+
### 2. **Delay Configuration**
|
|
174
|
+
- Minimum 1000ms để tránh rate limit
|
|
175
|
+
- Tăng delay nếu gặp rate limit errors
|
|
176
|
+
- Test với số lượng nhỏ trước khi scale
|
|
177
|
+
|
|
178
|
+
### 3. **Error Handling**
|
|
179
|
+
- Luôn set `continueOnError: true` cho campaigns lớn
|
|
180
|
+
- Log chi tiết errors để debug
|
|
181
|
+
- Retry failed users nếu cần
|
|
182
|
+
|
|
183
|
+
### 4. **Performance Monitoring**
|
|
184
|
+
- Sử dụng `onProgress` để monitor real-time
|
|
185
|
+
- Track success rate và adjust strategy
|
|
186
|
+
- Monitor execution time cho optimization
|
|
187
|
+
|
|
188
|
+
## Error Codes
|
|
189
|
+
|
|
190
|
+
- **2001**: Ngoài khung giờ cho phép (8:00-22:00)
|
|
191
|
+
- **2002**: User đã từ chối nhận tin truyền thông
|
|
192
|
+
- **2003**: Vượt quá giới hạn 1 tin/ngày
|
|
193
|
+
- **2004**: Template chưa được phê duyệt
|
|
194
|
+
- **2005**: Nội dung vi phạm chính sách
|
|
195
|
+
- **2006**: OA chưa có quyền gửi tin truyền thông
|
|
196
|
+
|
|
197
|
+
## Examples
|
|
198
|
+
|
|
199
|
+
Xem file `examples/promotion-examples.ts` để có ví dụ chi tiết về:
|
|
200
|
+
- Sequential sending với progress tracking
|
|
201
|
+
- Parallel sending cho tốc độ
|
|
202
|
+
- Error handling và retry logic
|
|
203
|
+
- Performance monitoring và optimization
|
|
204
|
+
|
|
205
|
+
## Rate Limits
|
|
206
|
+
|
|
207
|
+
- **Sending Time**: 8:00 - 22:00 hàng ngày
|
|
208
|
+
- **Frequency**: Tối đa 1 tin truyền thông/ngày/user
|
|
209
|
+
- **Concurrent**: Khuyến nghị sequential mode cho campaigns lớn
|
|
210
|
+
- **Delay**: Minimum 1000ms giữa các tin nhắn
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
# Zalo Promotion API v3.0 Migration Guide
|
|
2
|
+
|
|
3
|
+
## Tổng quan thay đổi
|
|
4
|
+
|
|
5
|
+
Promotion Service đã được cập nhật để tương thích với **Zalo Official Account API v3.0**. Đây là những thay đổi chính:
|
|
6
|
+
|
|
7
|
+
### 🔄 Thay đổi URL API
|
|
8
|
+
- **Cũ**: `https://openapi.zalo.me/v2.0/oa/message/promotion`
|
|
9
|
+
- **Mới**: `https://openapi.zalo.me/v3.0/oa/message/promotion`
|
|
10
|
+
|
|
11
|
+
### 🏗️ Cấu trúc Message Elements hoàn toàn mới
|
|
12
|
+
|
|
13
|
+
#### Cũ (v2.0):
|
|
14
|
+
```typescript
|
|
15
|
+
elements: [{
|
|
16
|
+
title: string;
|
|
17
|
+
subtitle?: string;
|
|
18
|
+
image_url?: string;
|
|
19
|
+
buttons?: Array<{...}>;
|
|
20
|
+
}]
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
#### Mới (v3.0):
|
|
24
|
+
```typescript
|
|
25
|
+
elements: [
|
|
26
|
+
{
|
|
27
|
+
type: "banner",
|
|
28
|
+
attachment_id: "...", // hoặc image_url
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
type: "header",
|
|
32
|
+
content: "💥💥Ưu đãi thành viên Platinum💥💥"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
type: "text",
|
|
36
|
+
align: "left",
|
|
37
|
+
content: "Nội dung chi tiết..."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
type: "table",
|
|
41
|
+
content: [
|
|
42
|
+
{ key: "Voucher", value: "VC09279222" },
|
|
43
|
+
{ key: "Hạn sử dụng", value: "30/12/2023" }
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 🎯 Các Element Types được hỗ trợ
|
|
50
|
+
|
|
51
|
+
1. **Banner Element**
|
|
52
|
+
```typescript
|
|
53
|
+
{
|
|
54
|
+
type: "banner",
|
|
55
|
+
attachment_id?: string, // ID từ API upload ảnh
|
|
56
|
+
image_url?: string // URL trực tiếp (chỉ dùng 1 trong 2)
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
2. **Header Element**
|
|
61
|
+
```typescript
|
|
62
|
+
{
|
|
63
|
+
type: "header",
|
|
64
|
+
content: string, // Tối đa 100 ký tự
|
|
65
|
+
align?: "left" | "center" | "right" // Mặc định: left
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
3. **Text Element**
|
|
70
|
+
```typescript
|
|
71
|
+
{
|
|
72
|
+
type: "text",
|
|
73
|
+
content: string, // Tối đa 1000 ký tự
|
|
74
|
+
align?: "left" | "center" | "right" // Mặc định: left
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
4. **Table Element**
|
|
79
|
+
```typescript
|
|
80
|
+
{
|
|
81
|
+
type: "table",
|
|
82
|
+
content: Array<{
|
|
83
|
+
key: string, // Tối đa 25 ký tự
|
|
84
|
+
value: string // Tối đa 100 ký tự
|
|
85
|
+
}> // Tối đa 5 phần tử
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 🔘 Cấu trúc Buttons mới
|
|
90
|
+
|
|
91
|
+
#### Cũ (v2.0):
|
|
92
|
+
```typescript
|
|
93
|
+
buttons: [{
|
|
94
|
+
type: string;
|
|
95
|
+
title: string;
|
|
96
|
+
url?: string;
|
|
97
|
+
payload?: string;
|
|
98
|
+
}]
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
#### Mới (v3.0):
|
|
102
|
+
```typescript
|
|
103
|
+
buttons: [{
|
|
104
|
+
title: string, // Tối đa 35 ký tự
|
|
105
|
+
image_icon?: string, // URL hoặc attachment_id hoặc "default"
|
|
106
|
+
type: string, // VD: "oa.open.url", "oa.query.hide"
|
|
107
|
+
payload: object | string // Tùy thuộc vào type
|
|
108
|
+
}]
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**Payload format theo type:**
|
|
112
|
+
- `oa.open.url`: `{ url: "https://..." }`
|
|
113
|
+
- `oa.query.show`: `"#callback_data"` (string)
|
|
114
|
+
- `oa.query.hide`: `"#callback_data"` (string)
|
|
115
|
+
- `oa.open.sms`: `{ content: "text", phone_code: "84xxx" }`
|
|
116
|
+
- `oa.open.phone`: `{ phone_code: "84xxx" }`
|
|
117
|
+
|
|
118
|
+
### 🌐 Hỗ trợ đa ngôn ngữ
|
|
119
|
+
|
|
120
|
+
Thêm thuộc tính `language` trong payload:
|
|
121
|
+
```typescript
|
|
122
|
+
{
|
|
123
|
+
template_type: "promotion",
|
|
124
|
+
language: "VI" | "EN", // Mặc định: VI
|
|
125
|
+
elements: [...],
|
|
126
|
+
buttons: [...]
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### 🚀 Tính năng mới: Multiple Users với Tracking
|
|
131
|
+
|
|
132
|
+
#### Gửi đến nhiều users cùng lúc
|
|
133
|
+
- **Sequential Mode**: Gửi tuần tự với delay tùy chỉnh
|
|
134
|
+
- **Parallel Mode**: Gửi song song để tối ưu tốc độ
|
|
135
|
+
- **Real-time Tracking**: Callback progress theo thời gian thực
|
|
136
|
+
- **Error Isolation**: Lỗi của 1 user không ảnh hưởng các user khác
|
|
137
|
+
- **Statistics**: Thống kê chi tiết success rate và execution time
|
|
138
|
+
|
|
139
|
+
#### Callback Tracking
|
|
140
|
+
```typescript
|
|
141
|
+
{
|
|
142
|
+
onProgress: (progress) => {
|
|
143
|
+
// Real-time progress: completed/total, success/failed
|
|
144
|
+
// Estimated time remaining, current user ID
|
|
145
|
+
},
|
|
146
|
+
onUserComplete: (userResult) => {
|
|
147
|
+
// Callback cho từng user hoàn thành
|
|
148
|
+
// Success/failure status, message ID, error details
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## 📝 Cách sử dụng mới
|
|
154
|
+
|
|
155
|
+
### 1. Gửi Promotion theo format chuẩn docs
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
import { PromotionService } from "./services/promotion.service";
|
|
159
|
+
|
|
160
|
+
const promotionService = new PromotionService(zaloClient);
|
|
161
|
+
|
|
162
|
+
// Gửi promotion message theo đúng format docs v3.0
|
|
163
|
+
await promotionService.sendCustomPromotion(
|
|
164
|
+
accessToken,
|
|
165
|
+
{ user_id: "user_id" },
|
|
166
|
+
{
|
|
167
|
+
attachmentId: "your_attachment_id",
|
|
168
|
+
headerContent: "💥💥Ưu đãi thành viên Platinum💥💥",
|
|
169
|
+
textContent: "Ưu đãi dành riêng cho khách hàng...",
|
|
170
|
+
tableData: [
|
|
171
|
+
{ key: "Voucher", value: "VC09279222" },
|
|
172
|
+
{ key: "Hạn sử dụng", value: "30/12/2023" }
|
|
173
|
+
],
|
|
174
|
+
footerText: "Áp dụng tất cả cửa hàng trên toàn quốc",
|
|
175
|
+
buttons: [
|
|
176
|
+
{
|
|
177
|
+
title: "Tham khảo chương trình",
|
|
178
|
+
type: "oa.open.url",
|
|
179
|
+
payload: { url: "https://oa.zalo.me/home" }
|
|
180
|
+
}
|
|
181
|
+
],
|
|
182
|
+
language: "VI"
|
|
183
|
+
}
|
|
184
|
+
);
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### 2. Gửi Product Promotion (đã cập nhật)
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
await promotionService.sendProductPromotion(
|
|
191
|
+
accessToken,
|
|
192
|
+
{ user_id: "user_id" },
|
|
193
|
+
{
|
|
194
|
+
title: "iPhone 15 Pro Max",
|
|
195
|
+
description: "Siêu phẩm công nghệ mới nhất...",
|
|
196
|
+
attachmentId: "product_image_id", // Thay vì imageUrl
|
|
197
|
+
originalPrice: 34990000,
|
|
198
|
+
discountPrice: 29990000,
|
|
199
|
+
discountPercent: 14,
|
|
200
|
+
validUntil: "31/12/2024",
|
|
201
|
+
productUrl: "https://example.com/product"
|
|
202
|
+
}
|
|
203
|
+
);
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### 3. Gửi Event Notification (đã cập nhật)
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
await promotionService.sendEventNotification(
|
|
210
|
+
accessToken,
|
|
211
|
+
{ user_id: "user_id" },
|
|
212
|
+
{
|
|
213
|
+
title: "Hội thảo Digital Marketing 2024",
|
|
214
|
+
description: "Khám phá xu hướng marketing...",
|
|
215
|
+
attachmentId: "event_image_id",
|
|
216
|
+
eventDate: "15/01/2024 - 9:00 AM",
|
|
217
|
+
location: "Trung tâm Hội nghị Quốc gia, Hà Nội",
|
|
218
|
+
registrationUrl: "https://example.com/register"
|
|
219
|
+
}
|
|
220
|
+
);
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### 4. Gửi Promotion đến nhiều Users với Tracking
|
|
224
|
+
|
|
225
|
+
```typescript
|
|
226
|
+
// Gửi tuần tự với tracking
|
|
227
|
+
const result = await promotionService.sendCustomPromotionToMultipleUsers(
|
|
228
|
+
accessToken,
|
|
229
|
+
["user1", "user2", "user3", "user4"],
|
|
230
|
+
{
|
|
231
|
+
attachmentId: "your_attachment_id",
|
|
232
|
+
headerContent: "🎉 Khuyến mãi đặc biệt!",
|
|
233
|
+
textContent: "Ưu đãi độc quyền dành riêng cho bạn",
|
|
234
|
+
tableData: [
|
|
235
|
+
{ key: "Mã giảm giá", value: "SAVE50" },
|
|
236
|
+
{ key: "Giảm giá", value: "50%" }
|
|
237
|
+
],
|
|
238
|
+
buttons: [
|
|
239
|
+
{
|
|
240
|
+
title: "Mua ngay",
|
|
241
|
+
type: "oa.open.url",
|
|
242
|
+
payload: { url: "https://shop.example.com" }
|
|
243
|
+
}
|
|
244
|
+
]
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
mode: "sequential", // hoặc "parallel"
|
|
248
|
+
delayMs: 2000, // Delay 2s giữa các tin
|
|
249
|
+
continueOnError: true,
|
|
250
|
+
|
|
251
|
+
// Real-time progress tracking
|
|
252
|
+
onProgress: (progress) => {
|
|
253
|
+
console.log(`Progress: ${progress.completed}/${progress.total}`);
|
|
254
|
+
console.log(`Success: ${progress.successful}, Failed: ${progress.failed}`);
|
|
255
|
+
},
|
|
256
|
+
|
|
257
|
+
// Callback cho từng user
|
|
258
|
+
onUserComplete: (userResult) => {
|
|
259
|
+
if (userResult.success) {
|
|
260
|
+
console.log(`✅ Sent to ${userResult.userId}`);
|
|
261
|
+
} else {
|
|
262
|
+
console.log(`❌ Failed to ${userResult.userId}: ${userResult.error?.message}`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
);
|
|
267
|
+
|
|
268
|
+
console.log(`📊 Final Result:`);
|
|
269
|
+
console.log(`Total: ${result.total}, Success: ${result.successful}, Failed: ${result.failed}`);
|
|
270
|
+
console.log(`Success Rate: ${result.successRate}%, Time: ${result.executionTime}ms`);
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### 5. Gửi Song Song (Parallel Mode)
|
|
274
|
+
|
|
275
|
+
```typescript
|
|
276
|
+
// Gửi song song để tối ưu tốc độ
|
|
277
|
+
const result = await promotionService.sendCustomPromotionToMultipleUsers(
|
|
278
|
+
accessToken,
|
|
279
|
+
userIds,
|
|
280
|
+
promotionData,
|
|
281
|
+
{
|
|
282
|
+
mode: "parallel", // Gửi tất cả cùng lúc
|
|
283
|
+
continueOnError: true,
|
|
284
|
+
onProgress: (progress) => {
|
|
285
|
+
console.log(`⚡ Parallel: ${progress.completed}/${progress.total}`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
);
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
## ⚠️ Breaking Changes
|
|
292
|
+
|
|
293
|
+
1. **URL API**: Phải cập nhật từ v2.0 lên v3.0
|
|
294
|
+
2. **Elements Structure**: Hoàn toàn khác, không tương thích ngược
|
|
295
|
+
3. **Buttons Payload**: Từ `string` thành `object`
|
|
296
|
+
4. **Image Handling**: Ưu tiên `attachment_id` thay vì `image_url`
|
|
297
|
+
5. **Validation**: Thêm validation cho elements và buttons
|
|
298
|
+
|
|
299
|
+
## 🔍 Validation Rules
|
|
300
|
+
|
|
301
|
+
- **Header content**: Tối đa 100 ký tự
|
|
302
|
+
- **Text content**: Tối đa 1000 ký tự mỗi đoạn, tối đa 2 đoạn text
|
|
303
|
+
- **Table**: Tối đa 5 phần tử, key ≤ 25 ký tự, value ≤ 100 ký tự
|
|
304
|
+
- **Button title**: Tối đa 35 ký tự, tối đa 4 buttons
|
|
305
|
+
- **Sending time**: Chỉ từ 8:00 - 22:00 hàng ngày
|
|
306
|
+
|
|
307
|
+
## 📚 Examples
|
|
308
|
+
|
|
309
|
+
Xem file `examples/promotion-examples.ts` để có ví dụ chi tiết về cách sử dụng tất cả các tính năng mới.
|
|
310
|
+
|
|
311
|
+
## 🚀 Migration Checklist
|
|
312
|
+
|
|
313
|
+
- [ ] Cập nhật URL API từ v2.0 lên v3.0
|
|
314
|
+
- [ ] Thay đổi cấu trúc elements theo format mới
|
|
315
|
+
- [ ] Cập nhật cấu trúc buttons với payload object
|
|
316
|
+
- [ ] Thêm support cho attachment_id
|
|
317
|
+
- [ ] Thêm language parameter
|
|
318
|
+
- [ ] Test với các element types khác nhau
|
|
319
|
+
- [ ] Kiểm tra validation rules mới
|
|
320
|
+
- [ ] Cập nhật documentation và examples
|