@warriorteam/redai-zalo-sdk 1.19.0 → 1.21.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.
@@ -0,0 +1,361 @@
1
+ "use strict";
2
+ /**
3
+ * Broadcast Service for Zalo Official Account
4
+ *
5
+ * Gửi tin Truyền thông Broadcast đến nhiều người dùng dựa trên tiêu chí targeting
6
+ * API: https://openapi.zalo.me/v2.0/oa/message
7
+ *
8
+ * TÍNH NĂNG:
9
+ * 1. GỬI TIN BROADCAST:
10
+ * - Gửi tin nhắn đến nhiều người dùng cùng lúc
11
+ * - Targeting theo tuổi, giới tính, địa điểm, platform
12
+ * - Chỉ hỗ trợ template type "media" với article attachment
13
+ *
14
+ * 2. TARGETING CRITERIA:
15
+ * - Ages: Nhóm tuổi (0-12, 13-17, 18-24, 25-34, 35-44, 45-54, 55-64, 65+)
16
+ * - Gender: Giới tính (All, Male, Female)
17
+ * - Cities: Tỉnh thành cụ thể (63 tỉnh thành Việt Nam)
18
+ * - Locations: Miền (Bắc, Trung, Nam)
19
+ * - Platform: Hệ điều hành (iOS, Android, Windows Phone)
20
+ *
21
+ * 3. GIỚI HẠN:
22
+ * - Chỉ gửi được article attachment
23
+ * - Cần có quyền broadcast từ Zalo
24
+ * - Tuân thủ chính sách spam và nội dung
25
+ *
26
+ * LỖI THƯỜNG GẶP:
27
+ * - 3001: Không có quyền gửi broadcast
28
+ * - 3002: Article attachment không tồn tại
29
+ * - 3003: Targeting criteria không hợp lệ
30
+ * - 3004: Vượt quá giới hạn broadcast
31
+ * - 3005: Nội dung vi phạm chính sách
32
+ */
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ exports.BroadcastService = void 0;
35
+ const common_1 = require("../types/common");
36
+ const broadcast_1 = require("../types/broadcast");
37
+ class BroadcastService {
38
+ constructor(client) {
39
+ this.client = client;
40
+ // Zalo API endpoint for broadcast messages
41
+ this.broadcastApiUrl = "https://openapi.zalo.me/v2.0/oa/message";
42
+ }
43
+ /**
44
+ * Gửi tin nhắn broadcast đến nhiều người dùng
45
+ * @param accessToken Access token của Official Account
46
+ * @param recipient Thông tin targeting người nhận
47
+ * @param attachmentId ID của article attachment
48
+ * @returns Thông tin tin nhắn broadcast đã gửi
49
+ */
50
+ async sendBroadcastMessage(accessToken, recipient, attachmentId) {
51
+ try {
52
+ // Validate input parameters
53
+ this.validateBroadcastRequest(recipient, attachmentId);
54
+ // Build broadcast message
55
+ const message = {
56
+ attachment: {
57
+ type: "template",
58
+ payload: {
59
+ template_type: "media",
60
+ elements: [
61
+ {
62
+ media_type: "article",
63
+ attachment_id: attachmentId
64
+ }
65
+ ]
66
+ }
67
+ }
68
+ };
69
+ // Build request
70
+ const request = {
71
+ recipient,
72
+ message
73
+ };
74
+ // Send broadcast request
75
+ const result = await this.client.apiPost(this.broadcastApiUrl, accessToken, request);
76
+ if (result.error !== 0) {
77
+ throw new common_1.ZaloSDKError(result.message || "Failed to send broadcast message", result.error, result);
78
+ }
79
+ if (!result.data) {
80
+ throw new common_1.ZaloSDKError("No broadcast response data received", -1);
81
+ }
82
+ return result.data;
83
+ }
84
+ catch (error) {
85
+ if (error instanceof common_1.ZaloSDKError) {
86
+ throw error;
87
+ }
88
+ throw new common_1.ZaloSDKError(`Failed to send broadcast message: ${error.message}`, -1, error);
89
+ }
90
+ }
91
+ /**
92
+ * Tạo broadcast target với các tiêu chí targeting
93
+ * @param criteria Các tiêu chí targeting
94
+ * @returns BroadcastTarget object
95
+ */
96
+ createBroadcastTarget(criteria) {
97
+ const target = {};
98
+ // Convert ages to comma-separated string
99
+ if (criteria.ages && criteria.ages.length > 0) {
100
+ const ageCodes = criteria.ages.map(age => {
101
+ const code = broadcast_1.BROADCAST_AGE_CODES[age];
102
+ if (!code) {
103
+ throw new common_1.ZaloSDKError(`Invalid age group: ${age}`, -1);
104
+ }
105
+ return code;
106
+ });
107
+ target.ages = ageCodes.join(",");
108
+ }
109
+ // Convert gender
110
+ if (criteria.gender) {
111
+ const genderCode = broadcast_1.BROADCAST_GENDER_CODES[criteria.gender];
112
+ if (!genderCode) {
113
+ throw new common_1.ZaloSDKError(`Invalid gender: ${criteria.gender}`, -1);
114
+ }
115
+ target.gender = genderCode;
116
+ }
117
+ // Convert cities to comma-separated string
118
+ if (criteria.cities && criteria.cities.length > 0) {
119
+ const cityCodes = criteria.cities.map(city => {
120
+ const code = broadcast_1.BROADCAST_CITY_CODES[city];
121
+ if (!code) {
122
+ throw new common_1.ZaloSDKError(`Invalid city: ${city}`, -1);
123
+ }
124
+ return code;
125
+ });
126
+ target.cities = cityCodes.join(",");
127
+ }
128
+ // Convert locations to comma-separated string
129
+ if (criteria.locations && criteria.locations.length > 0) {
130
+ const locationCodes = criteria.locations.map(location => {
131
+ const code = broadcast_1.BROADCAST_LOCATION_CODES[location];
132
+ if (!code) {
133
+ throw new common_1.ZaloSDKError(`Invalid location: ${location}`, -1);
134
+ }
135
+ return code;
136
+ });
137
+ target.locations = locationCodes.join(",");
138
+ }
139
+ // Convert platforms to comma-separated string
140
+ if (criteria.platforms && criteria.platforms.length > 0) {
141
+ const platformCodes = criteria.platforms.map(platform => {
142
+ const code = broadcast_1.BROADCAST_PLATFORM_CODES[platform];
143
+ if (!code) {
144
+ throw new common_1.ZaloSDKError(`Invalid platform: ${platform}`, -1);
145
+ }
146
+ return code;
147
+ });
148
+ target.platform = platformCodes.join(",");
149
+ }
150
+ return target;
151
+ }
152
+ /**
153
+ * Validate broadcast request parameters
154
+ * @param recipient Broadcast recipient
155
+ * @param attachmentId Article attachment ID
156
+ */
157
+ validateBroadcastRequest(recipient, attachmentId) {
158
+ // Validate recipient
159
+ if (!recipient || !recipient.target) {
160
+ throw new common_1.ZaloSDKError("Recipient target is required for broadcast", -1);
161
+ }
162
+ // Validate attachment ID
163
+ if (!attachmentId || attachmentId.trim().length === 0) {
164
+ throw new common_1.ZaloSDKError("Article attachment ID is required", -1);
165
+ }
166
+ // Validate target has at least one criteria
167
+ const target = recipient.target;
168
+ const hasTargeting = target.ages || target.gender || target.cities ||
169
+ target.locations || target.platform;
170
+ if (!hasTargeting) {
171
+ throw new common_1.ZaloSDKError("At least one targeting criteria is required (ages, gender, cities, locations, or platform)", -1);
172
+ }
173
+ }
174
+ /**
175
+ * Get available city codes for targeting
176
+ * @returns Object mapping city names to codes
177
+ */
178
+ getCityCodes() {
179
+ return broadcast_1.BROADCAST_CITY_CODES;
180
+ }
181
+ /**
182
+ * Get available age group codes for targeting
183
+ * @returns Object mapping age groups to codes
184
+ */
185
+ getAgeGroupCodes() {
186
+ return broadcast_1.BROADCAST_AGE_CODES;
187
+ }
188
+ /**
189
+ * Get available gender codes for targeting
190
+ * @returns Object mapping genders to codes
191
+ */
192
+ getGenderCodes() {
193
+ return broadcast_1.BROADCAST_GENDER_CODES;
194
+ }
195
+ /**
196
+ * Get available location codes for targeting
197
+ * @returns Object mapping locations to codes
198
+ */
199
+ getLocationCodes() {
200
+ return broadcast_1.BROADCAST_LOCATION_CODES;
201
+ }
202
+ /**
203
+ * Get available platform codes for targeting
204
+ * @returns Object mapping platforms to codes
205
+ */
206
+ getPlatformCodes() {
207
+ return broadcast_1.BROADCAST_PLATFORM_CODES;
208
+ }
209
+ /**
210
+ * Gửi nhiều tin nhắn broadcast với nhiều attachment IDs
211
+ * @param accessToken Access token của Official Account
212
+ * @param recipient Thông tin targeting người nhận
213
+ * @param attachmentIds Danh sách các article attachment IDs
214
+ * @param options Tùy chọn gửi (delay giữa các tin, parallel/sequential)
215
+ * @returns Danh sách kết quả gửi broadcast
216
+ */
217
+ async sendMultipleBroadcastMessages(accessToken, recipient, attachmentIds, options) {
218
+ try {
219
+ // Validate input
220
+ if (!attachmentIds || attachmentIds.length === 0) {
221
+ throw new common_1.ZaloSDKError("At least one attachment ID is required", -1);
222
+ }
223
+ // Remove duplicates
224
+ const uniqueAttachmentIds = [...new Set(attachmentIds)];
225
+ const startTime = Date.now();
226
+ const results = [];
227
+ const mode = options?.mode || 'sequential';
228
+ const delay = options?.delay || 0;
229
+ if (mode === 'parallel') {
230
+ // Gửi song song tất cả
231
+ const promises = uniqueAttachmentIds.map(async (attachmentId, index) => {
232
+ try {
233
+ const result = await this.sendBroadcastMessage(accessToken, recipient, attachmentId);
234
+ const messageResult = {
235
+ attachmentId,
236
+ success: true,
237
+ messageId: result.data.message_id,
238
+ error: null,
239
+ sentAt: new Date()
240
+ };
241
+ // Report progress
242
+ if (options?.onProgress) {
243
+ options.onProgress({
244
+ total: uniqueAttachmentIds.length,
245
+ completed: index + 1,
246
+ successful: results.filter(r => r.success).length + 1,
247
+ failed: results.filter(r => !r.success).length,
248
+ currentAttachmentId: attachmentId,
249
+ isCompleted: index === uniqueAttachmentIds.length - 1
250
+ });
251
+ }
252
+ return messageResult;
253
+ }
254
+ catch (error) {
255
+ const messageResult = {
256
+ attachmentId,
257
+ success: false,
258
+ messageId: null,
259
+ error: error instanceof common_1.ZaloSDKError ? error : new common_1.ZaloSDKError(error.message, -1),
260
+ sentAt: new Date()
261
+ };
262
+ // Report progress
263
+ if (options?.onProgress) {
264
+ options.onProgress({
265
+ total: uniqueAttachmentIds.length,
266
+ completed: index + 1,
267
+ successful: results.filter(r => r.success).length,
268
+ failed: results.filter(r => !r.success).length + 1,
269
+ currentAttachmentId: attachmentId,
270
+ isCompleted: index === uniqueAttachmentIds.length - 1
271
+ });
272
+ }
273
+ return messageResult;
274
+ }
275
+ });
276
+ const parallelResults = await Promise.all(promises);
277
+ results.push(...parallelResults);
278
+ }
279
+ else {
280
+ // Gửi tuần tự
281
+ for (let i = 0; i < uniqueAttachmentIds.length; i++) {
282
+ const attachmentId = uniqueAttachmentIds[i];
283
+ try {
284
+ const result = await this.sendBroadcastMessage(accessToken, recipient, attachmentId);
285
+ const messageResult = {
286
+ attachmentId,
287
+ success: true,
288
+ messageId: result.data.message_id,
289
+ error: null,
290
+ sentAt: new Date()
291
+ };
292
+ results.push(messageResult);
293
+ // Report progress
294
+ if (options?.onProgress) {
295
+ options.onProgress({
296
+ total: uniqueAttachmentIds.length,
297
+ completed: i + 1,
298
+ successful: results.filter(r => r.success).length,
299
+ failed: results.filter(r => !r.success).length,
300
+ currentAttachmentId: attachmentId,
301
+ isCompleted: i === uniqueAttachmentIds.length - 1
302
+ });
303
+ }
304
+ }
305
+ catch (error) {
306
+ const messageResult = {
307
+ attachmentId,
308
+ success: false,
309
+ messageId: null,
310
+ error: error instanceof common_1.ZaloSDKError ? error : new common_1.ZaloSDKError(error.message, -1),
311
+ sentAt: new Date()
312
+ };
313
+ results.push(messageResult);
314
+ // Report progress
315
+ if (options?.onProgress) {
316
+ options.onProgress({
317
+ total: uniqueAttachmentIds.length,
318
+ completed: i + 1,
319
+ successful: results.filter(r => r.success).length,
320
+ failed: results.filter(r => !r.success).length,
321
+ currentAttachmentId: attachmentId,
322
+ isCompleted: i === uniqueAttachmentIds.length - 1
323
+ });
324
+ }
325
+ }
326
+ // Delay before next message (except for last one)
327
+ if (delay > 0 && i < uniqueAttachmentIds.length - 1) {
328
+ await this.sleep(delay);
329
+ }
330
+ }
331
+ }
332
+ const totalDuration = Date.now() - startTime;
333
+ const successful = results.filter(r => r.success).length;
334
+ const failed = results.filter(r => !r.success).length;
335
+ return {
336
+ totalMessages: uniqueAttachmentIds.length,
337
+ successfulMessages: successful,
338
+ failedMessages: failed,
339
+ results,
340
+ totalDuration,
341
+ mode,
342
+ targetCriteria: recipient.target
343
+ };
344
+ }
345
+ catch (error) {
346
+ if (error instanceof common_1.ZaloSDKError) {
347
+ throw error;
348
+ }
349
+ throw new common_1.ZaloSDKError(`Failed to send multiple broadcast messages: ${error.message}`, -1, error);
350
+ }
351
+ }
352
+ /**
353
+ * Sleep utility for delays
354
+ * @param ms Milliseconds to sleep
355
+ */
356
+ sleep(ms) {
357
+ return new Promise(resolve => setTimeout(resolve, ms));
358
+ }
359
+ }
360
+ exports.BroadcastService = BroadcastService;
361
+ //# sourceMappingURL=broadcast.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broadcast.service.js","sourceRoot":"","sources":["../../src/services/broadcast.service.ts"],"names":[],"mappings":"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"}