@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.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,135 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.21.0] - 2025-08-29
9
+
10
+ ### 🚀 NEW FEATURES
11
+
12
+ #### Enhanced Broadcast Service - Multiple Messages Support
13
+ - **ADDED**: `sendMultipleBroadcastMessages()` - Gửi nhiều broadcast messages với nhiều attachment IDs
14
+ - **MODES**: Hỗ trợ 2 chế độ gửi: `sequential` (tuần tự) và `parallel` (song song)
15
+ - **DELAY**: Tùy chỉnh delay giữa các tin nhắn cho sequential mode
16
+ - **PROGRESS**: Real-time progress tracking với callback `onProgress`
17
+ - **RESILIENT**: Error isolation - lỗi của 1 tin không ảnh hưởng các tin khác
18
+ - **SMART**: Tự động loại bỏ attachment IDs trùng lặp
19
+
20
+ #### Advanced Campaign Management
21
+ - **SEQUENTIAL**: Gửi tuần tự với delay tùy chỉnh để tránh rate limit
22
+ - **PARALLEL**: Gửi song song để tối ưu tốc độ
23
+ - **MONITORING**: Theo dõi real-time số tin thành công/thất bại
24
+ - **STATISTICS**: Thống kê chi tiết thời gian thực hiện và success rate
25
+
26
+ ### 📊 NEW INTERFACES
27
+
28
+ #### Multiple Broadcast Types
29
+ - **ADDED**: `BroadcastMessageResult` - Kết quả từng tin nhắn broadcast
30
+ - **ADDED**: `MultipleBroadcastProgress` - Interface cho progress tracking
31
+ - **ADDED**: `MultipleBroadcastResult` - Kết quả tổng thể campaign
32
+ - **ENHANCED**: Progress callback với detailed metrics
33
+
34
+ ### 🛡️ ENHANCED ERROR HANDLING
35
+ - **ISOLATION**: Lỗi của 1 attachment không làm dừng campaign
36
+ - **DETAILED**: Chi tiết lỗi cho từng tin nhắn riêng biệt
37
+ - **VALIDATION**: Kiểm tra attachment IDs array không rỗng
38
+ - **DEDUPLICATION**: Tự động loại bỏ attachment IDs trùng lặp
39
+
40
+ ### 📚 UPDATED DOCUMENTATION & EXAMPLES
41
+
42
+ #### Enhanced Documentation
43
+ - **UPDATED**: `docs/BROADCAST_SERVICE.md` - Thêm multiple messages examples
44
+ - **UPDATED**: `docs/API_REFERENCE.md` - Thêm sendMultipleBroadcastMessages method
45
+ - **UPDATED**: `README.md` - Thêm ví dụ multiple broadcast
46
+
47
+ #### Enhanced Examples
48
+ - **UPDATED**: `examples/broadcast-example.ts` - Thêm sequential và parallel examples
49
+ - **EXAMPLES**: Progress tracking và error handling
50
+ - **EXAMPLES**: Campaign management với statistics
51
+
52
+ #### Enhanced Tests
53
+ - **UPDATED**: `tests/broadcast.test.ts` - Comprehensive tests cho multiple messages
54
+ - **COVERAGE**: Test sequential và parallel modes
55
+ - **COVERAGE**: Test progress callback và error handling
56
+ - **COVERAGE**: Test duplicate removal và validation
57
+
58
+ ### 🔧 API ENHANCEMENTS
59
+ - **FLEXIBLE**: Chọn mode phù hợp với use case (sequential vs parallel)
60
+ - **CONFIGURABLE**: Delay tùy chỉnh cho rate limiting
61
+ - **OBSERVABLE**: Progress tracking cho campaign monitoring
62
+ - **ROBUST**: Comprehensive error handling và validation
63
+
64
+ ## [1.20.0] - 2025-08-29
65
+
66
+ ### 🚀 NEW FEATURES
67
+
68
+ #### Broadcast Service - Gửi Tin Truyền Thông Broadcast
69
+ - **ADDED**: `BroadcastService` - Service mới để gửi tin truyền thông broadcast đến nhiều người dùng
70
+ - **ADDED**: `sendBroadcastMessage()` - API gửi broadcast với targeting criteria
71
+ - **ADDED**: `createBroadcastTarget()` - Helper tạo targeting criteria dễ dàng
72
+ - **SUPPORT**: Targeting theo tuổi, giới tính, tỉnh thành, miền, platform
73
+ - **COMPLIANCE**: Tuân thủ 100% Zalo API specification
74
+
75
+ #### Advanced Targeting System
76
+ - **AGES**: 8 nhóm tuổi (0-12, 13-17, 18-24, 25-34, 35-44, 45-54, 55-64, 65+)
77
+ - **GENDER**: 3 lựa chọn (All, Male, Female)
78
+ - **CITIES**: 63 tỉnh thành Việt Nam với mapping chính xác
79
+ - **LOCATIONS**: 3 miền (North, Central, South)
80
+ - **PLATFORMS**: 3 hệ điều hành (iOS, Android, Windows Phone)
81
+
82
+ #### Helper Methods & Constants
83
+ - **ADDED**: `getCityCodes()` - Lấy mapping tỉnh thành
84
+ - **ADDED**: `getAgeGroupCodes()` - Lấy mã nhóm tuổi
85
+ - **ADDED**: `getGenderCodes()` - Lấy mã giới tính
86
+ - **ADDED**: `getLocationCodes()` - Lấy mã miền
87
+ - **ADDED**: `getPlatformCodes()` - Lấy mã platform
88
+ - **CONSTANTS**: Đầy đủ constants cho tất cả targeting criteria
89
+
90
+ ### 📊 NEW INTERFACES
91
+
92
+ #### Broadcast Types
93
+ - **ADDED**: `BroadcastTarget` - Interface cho targeting criteria
94
+ - **ADDED**: `BroadcastRecipient` - Interface cho thông tin người nhận
95
+ - **ADDED**: `BroadcastMessage` - Interface cho tin nhắn broadcast
96
+ - **ADDED**: `BroadcastRequest` - Request payload structure
97
+ - **ADDED**: `BroadcastResponse` - Response structure với message_id
98
+ - **ADDED**: `BroadcastMessageElement` - Element structure cho article attachment
99
+
100
+ ### 🛡️ VALIDATION & ERROR HANDLING
101
+ - **VALIDATION**: Kiểm tra targeting criteria hợp lệ
102
+ - **VALIDATION**: Kiểm tra attachment_id bắt buộc
103
+ - **ERROR**: Comprehensive error messages cho từng trường hợp
104
+ - **TYPE SAFETY**: Full TypeScript support với IntelliSense
105
+
106
+ ### 📚 DOCUMENTATION & EXAMPLES
107
+
108
+ #### New Documentation
109
+ - **ADDED**: `docs/BROADCAST_SERVICE.md` - Hướng dẫn chi tiết BroadcastService
110
+ - **UPDATED**: `docs/API_REFERENCE.md` - Thêm BroadcastService methods
111
+ - **UPDATED**: `README.md` - Thêm Broadcast Service examples
112
+
113
+ #### New Examples
114
+ - **ADDED**: `examples/broadcast-example.ts` - Ví dụ sử dụng BroadcastService
115
+ - **EXAMPLES**: Targeting đơn giản và phức tạp
116
+ - **EXAMPLES**: Error handling và best practices
117
+
118
+ #### New Tests
119
+ - **ADDED**: `tests/broadcast.test.ts` - Unit tests cho BroadcastService
120
+ - **COVERAGE**: Test targeting criteria creation
121
+ - **COVERAGE**: Test broadcast message sending
122
+ - **COVERAGE**: Test validation logic
123
+
124
+ ### 🔧 SDK INTEGRATION
125
+ - **INTEGRATION**: Tích hợp BroadcastService vào main ZaloSDK class
126
+ - **ACCESS**: Sử dụng qua `zalo.broadcast`
127
+ - **EXPORT**: Export tất cả types và service từ main index
128
+
129
+ ### 📋 API SPECIFICATION COMPLIANCE
130
+ - **ENDPOINT**: `https://openapi.zalo.me/v2.0/oa/message` ✅
131
+ - **METHOD**: POST với JSON payload ✅
132
+ - **HEADERS**: access_token authentication ✅
133
+ - **TARGETING**: recipient.target với đầy đủ criteria ✅
134
+ - **MESSAGE**: Template type "media" với article attachment ✅
135
+ - **RESPONSE**: message_id, error, message structure ✅
136
+
8
137
  ## [1.19.0] - 2025-08-29
9
138
 
10
139
  ### 🚀 NEW FEATURES
package/README.md CHANGED
@@ -4,6 +4,7 @@ A comprehensive TypeScript/JavaScript SDK for Zalo APIs, providing easy-to-use i
4
4
 
5
5
  - **Official Account (OA) API** - Manage your Zalo Official Account
6
6
  - **Consultation Service** - Send customer support messages within 48-hour window
7
+ - **Broadcast Service** - Send mass communication messages with targeting criteria
7
8
  - **Zalo Notification Service (ZNS)** - Send template-based notification messages
8
9
  - **Social API** - Access user social information and authentication
9
10
  - **Group Message Framework (GMF)** - Send messages to Zalo groups
@@ -377,6 +378,56 @@ For support and questions:
377
378
  - Create an issue on GitHub
378
379
  - Contact RedAI team
379
380
 
381
+ ### Broadcast Service (Mass Communication)
382
+
383
+ ```typescript
384
+ // Create targeting criteria
385
+ const target = zalo.broadcast.createBroadcastTarget({
386
+ gender: "FEMALE", // Target female users
387
+ ages: ["18-24", "25-34"], // Age 18-34
388
+ cities: ["Hồ Chí Minh", "Hà Nội"], // Ho Chi Minh City and Hanoi
389
+ platforms: ["ANDROID", "IOS"] // Android and iOS users
390
+ });
391
+
392
+ // Send broadcast message
393
+ const result = await zalo.broadcast.sendBroadcastMessage(
394
+ accessToken,
395
+ { target },
396
+ "article-attachment-id"
397
+ );
398
+
399
+ console.log("Broadcast sent:", result.data.message_id);
400
+
401
+ // Simple city targeting
402
+ const hcmTarget = zalo.broadcast.createBroadcastTarget({
403
+ cities: ["Hồ Chí Minh"]
404
+ });
405
+
406
+ await zalo.broadcast.sendBroadcastMessage(
407
+ accessToken,
408
+ { target: hcmTarget },
409
+ "article-id"
410
+ );
411
+
412
+ // Send multiple broadcast messages
413
+ const attachmentIds = ["article-1", "article-2", "article-3"];
414
+
415
+ const multipleResult = await zalo.broadcast.sendMultipleBroadcastMessages(
416
+ accessToken,
417
+ { target: hcmTarget },
418
+ attachmentIds,
419
+ {
420
+ mode: 'sequential',
421
+ delay: 2000, // 2 seconds between messages
422
+ onProgress: (progress) => {
423
+ console.log(`Progress: ${progress.completed}/${progress.total}`);
424
+ }
425
+ }
426
+ );
427
+
428
+ console.log(`Sent ${multipleResult.successfulMessages}/${multipleResult.totalMessages} messages`);
429
+ ```
430
+
380
431
  ### Consultation Service (Customer Support)
381
432
 
382
433
  ```typescript
package/dist/index.d.ts CHANGED
@@ -14,6 +14,7 @@ export * from "./types/oa";
14
14
  export * from "./types/user";
15
15
  export * from "./types/zns";
16
16
  export * from "./types/article";
17
+ export * from "./types/broadcast";
17
18
  export * from "./constants/zns.constants";
18
19
  export type { BaseMessage, TextMessage, ImageMessage, FileMessage, StickerMessage, TemplateMessage as MessageTemplateMessage, ReactionMessage as MessageReactionMessage, Message, MessageRecipient, SendMessageRequest, SendMessageResponse, UploadFileResponse, MessageStatus, MessageEvent, ConsultationTextMessage, ConsultationImageMessage, ConsultationFileMessage, ConsultationStickerMessage, ConsultationQuoteMessage, ConsultationRequestInfoMessage, TransactionMessage, PromotionMessage, AnonymousTextMessage, AnonymousImageMessage, AnonymousFileMessage, AnonymousStickerMessage, MiniAppMessage, ExtendedMessage, } from "./types/message";
19
20
  export * from "./types/webhook";
@@ -36,6 +37,7 @@ export { TransactionService } from "./services/transaction.service";
36
37
  export { PromotionService } from "./services/promotion.service";
37
38
  export { GeneralMessageService } from "./services/general-message.service";
38
39
  export { MessageManagementService, UploadFileResult, UploadImageResult, MessageQuotaInfo, ConversationMessage, Conversation, MessagePagination } from "./services/message-management.service";
40
+ export { BroadcastService } from "./services/broadcast.service";
39
41
  export { ZaloSDK } from "./zalo-sdk";
40
42
  export { ZaloSDK as default } from "./zalo-sdk";
41
43
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -24,7 +24,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
24
24
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
25
25
  };
26
26
  Object.defineProperty(exports, "__esModule", { value: true });
27
- exports.default = exports.ZaloSDK = exports.MessageManagementService = exports.GeneralMessageService = exports.PromotionService = exports.TransactionService = exports.ConsultationService = exports.VideoUploadService = exports.ArticleService = exports.GroupManagementService = exports.GroupMessageService = exports.ZNSService = exports.UserService = exports.OAService = exports.AuthService = exports.ZaloClient = exports.BaseClient = exports.getMessageDirection = exports.isOAToGroupMessageEvent = exports.isOAToUserMessageEvent = exports.isGroupMessageEvent = exports.isUserMessageEvent = exports.isFromPersonal = exports.isFromGroup = exports.isOASendGroupGifEvent = exports.isOASendGroupStickerEvent = exports.isOASendGroupFileEvent = exports.isOASendGroupImageEvent = exports.isOASendGroupTextEvent = exports.isOASendGifEvent = exports.isOASendStickerEvent = exports.isOASendFileEvent = exports.isOASendImageEvent = exports.isOASendTextEvent = exports.isUserGroupMessageEvent = exports.isUserSendGroupFileEvent = exports.isUserSendGroupAudioEvent = exports.isUserSendGroupVideoEvent = exports.isUserSendGroupImageEvent = exports.isUserSendGroupTextEvent = void 0;
27
+ exports.default = exports.ZaloSDK = exports.BroadcastService = exports.MessageManagementService = exports.GeneralMessageService = exports.PromotionService = exports.TransactionService = exports.ConsultationService = exports.VideoUploadService = exports.ArticleService = exports.GroupManagementService = exports.GroupMessageService = exports.ZNSService = exports.UserService = exports.OAService = exports.AuthService = exports.ZaloClient = exports.BaseClient = exports.getMessageDirection = exports.isOAToGroupMessageEvent = exports.isOAToUserMessageEvent = exports.isGroupMessageEvent = exports.isUserMessageEvent = exports.isFromPersonal = exports.isFromGroup = exports.isOASendGroupGifEvent = exports.isOASendGroupStickerEvent = exports.isOASendGroupFileEvent = exports.isOASendGroupImageEvent = exports.isOASendGroupTextEvent = exports.isOASendGifEvent = exports.isOASendStickerEvent = exports.isOASendFileEvent = exports.isOASendImageEvent = exports.isOASendTextEvent = exports.isUserGroupMessageEvent = exports.isUserSendGroupFileEvent = exports.isUserSendGroupAudioEvent = exports.isUserSendGroupVideoEvent = exports.isUserSendGroupImageEvent = exports.isUserSendGroupTextEvent = void 0;
28
28
  // Export types
29
29
  __exportStar(require("./types/common"), exports);
30
30
  __exportStar(require("./types/auth"), exports);
@@ -32,6 +32,7 @@ __exportStar(require("./types/oa"), exports);
32
32
  __exportStar(require("./types/user"), exports);
33
33
  __exportStar(require("./types/zns"), exports);
34
34
  __exportStar(require("./types/article"), exports);
35
+ __exportStar(require("./types/broadcast"), exports);
35
36
  // Export ZNS constants and helpers
36
37
  __exportStar(require("./constants/zns.constants"), exports);
37
38
  // Export webhook types (avoiding conflicts with message and group types)
@@ -98,6 +99,8 @@ var general_message_service_1 = require("./services/general-message.service");
98
99
  Object.defineProperty(exports, "GeneralMessageService", { enumerable: true, get: function () { return general_message_service_1.GeneralMessageService; } });
99
100
  var message_management_service_1 = require("./services/message-management.service");
100
101
  Object.defineProperty(exports, "MessageManagementService", { enumerable: true, get: function () { return message_management_service_1.MessageManagementService; } });
102
+ var broadcast_service_1 = require("./services/broadcast.service");
103
+ Object.defineProperty(exports, "BroadcastService", { enumerable: true, get: function () { return broadcast_service_1.BroadcastService; } });
101
104
  // Export main SDK class
102
105
  var zalo_sdk_1 = require("./zalo-sdk");
103
106
  Object.defineProperty(exports, "ZaloSDK", { enumerable: true, get: function () { return zalo_sdk_1.ZaloSDK; } });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;;;;;;;;;;;;AAEH,eAAe;AACf,iDAA+B;AAC/B,+CAA6B;AAC7B,6CAA2B;AAC3B,+CAA6B;AAC7B,8CAA4B;AAC5B,kDAAgC;AAEhC,mCAAmC;AACnC,4DAA0C;AAkC1C,yEAAyE;AACzE,kDAAgC;AAEhC,yEAAyE;AACzE,mDAoB6B;AAlB3B,uHAAA,wBAAwB,OAAA;AACxB,wHAAA,yBAAyB,OAAA;AACzB,wHAAA,yBAAyB,OAAA;AACzB,wHAAA,yBAAyB,OAAA;AACzB,uHAAA,wBAAwB,OAAA;AACxB,sHAAA,uBAAuB,OAAA;AACvB,gHAAA,iBAAiB,OAAA;AACjB,iHAAA,kBAAkB,OAAA;AAClB,gHAAA,iBAAiB,OAAA;AACjB,mHAAA,oBAAoB,OAAA;AACpB,+GAAA,gBAAgB,OAAA;AAChB,qHAAA,sBAAsB,OAAA;AACtB,sHAAA,uBAAuB,OAAA;AACvB,qHAAA,sBAAsB,OAAA;AACtB,wHAAA,yBAAyB,OAAA;AACzB,oHAAA,qBAAqB,OAAA;AACrB,0GAAA,WAAW,OAAA;AACX,6GAAA,cAAc,OAAA;AAEhB,kCAAkC;AAClC,2CAMyB;AALvB,6GAAA,kBAAkB,OAAA;AAClB,8GAAA,mBAAmB,OAAA;AACnB,iHAAA,sBAAsB,OAAA;AACtB,kHAAA,uBAAuB,OAAA;AACvB,8GAAA,mBAAmB,OAAA;AAoFrB,iBAAiB;AACjB,qDAAmD;AAA1C,yGAAA,UAAU,OAAA;AACnB,qDAAmD;AAA1C,yGAAA,UAAU,OAAA;AAEnB,kBAAkB;AAClB,wDAAsD;AAA7C,2GAAA,WAAW,OAAA;AACpB,oDAAkD;AAAzC,uGAAA,SAAS,OAAA;AAClB,2GAA2G;AAC3G,wDAAsD;AAA7C,2GAAA,WAAW,OAAA;AACpB,+DAA+D;AAC/D,sDAAoD;AAA3C,yGAAA,UAAU,OAAA;AACnB,0EAAuE;AAA9D,4HAAA,mBAAmB,OAAA;AAC5B,gFAA6E;AAApE,kIAAA,sBAAsB,OAAA;AAC/B,8DAA4D;AAAnD,iHAAA,cAAc,OAAA;AACvB,wEAAqE;AAA5D,0HAAA,kBAAkB,OAAA;AAE3B,iDAAiD;AACjD,wEAAsE;AAA7D,2HAAA,mBAAmB,OAAA;AAC5B,sEAAoE;AAA3D,yHAAA,kBAAkB,OAAA;AAC3B,kEAAgE;AAAvD,qHAAA,gBAAgB,OAAA;AACzB,8EAA2E;AAAlE,gIAAA,qBAAqB,OAAA;AAC9B,oFAQ+C;AAP7C,sIAAA,wBAAwB,OAAA;AAS1B,wBAAwB;AACxB,uCAAqC;AAA5B,mGAAA,OAAO,OAAA;AAEhB,iBAAiB;AACjB,uCAAgD;AAAvC,mGAAA,OAAO,OAAW"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;;;;;;;;;;;;AAEH,eAAe;AACf,iDAA+B;AAC/B,+CAA6B;AAC7B,6CAA2B;AAC3B,+CAA6B;AAC7B,8CAA4B;AAC5B,kDAAgC;AAChC,oDAAkC;AAElC,mCAAmC;AACnC,4DAA0C;AAkC1C,yEAAyE;AACzE,kDAAgC;AAEhC,yEAAyE;AACzE,mDAoB6B;AAlB3B,uHAAA,wBAAwB,OAAA;AACxB,wHAAA,yBAAyB,OAAA;AACzB,wHAAA,yBAAyB,OAAA;AACzB,wHAAA,yBAAyB,OAAA;AACzB,uHAAA,wBAAwB,OAAA;AACxB,sHAAA,uBAAuB,OAAA;AACvB,gHAAA,iBAAiB,OAAA;AACjB,iHAAA,kBAAkB,OAAA;AAClB,gHAAA,iBAAiB,OAAA;AACjB,mHAAA,oBAAoB,OAAA;AACpB,+GAAA,gBAAgB,OAAA;AAChB,qHAAA,sBAAsB,OAAA;AACtB,sHAAA,uBAAuB,OAAA;AACvB,qHAAA,sBAAsB,OAAA;AACtB,wHAAA,yBAAyB,OAAA;AACzB,oHAAA,qBAAqB,OAAA;AACrB,0GAAA,WAAW,OAAA;AACX,6GAAA,cAAc,OAAA;AAEhB,kCAAkC;AAClC,2CAMyB;AALvB,6GAAA,kBAAkB,OAAA;AAClB,8GAAA,mBAAmB,OAAA;AACnB,iHAAA,sBAAsB,OAAA;AACtB,kHAAA,uBAAuB,OAAA;AACvB,8GAAA,mBAAmB,OAAA;AAoFrB,iBAAiB;AACjB,qDAAmD;AAA1C,yGAAA,UAAU,OAAA;AACnB,qDAAmD;AAA1C,yGAAA,UAAU,OAAA;AAEnB,kBAAkB;AAClB,wDAAsD;AAA7C,2GAAA,WAAW,OAAA;AACpB,oDAAkD;AAAzC,uGAAA,SAAS,OAAA;AAClB,2GAA2G;AAC3G,wDAAsD;AAA7C,2GAAA,WAAW,OAAA;AACpB,+DAA+D;AAC/D,sDAAoD;AAA3C,yGAAA,UAAU,OAAA;AACnB,0EAAuE;AAA9D,4HAAA,mBAAmB,OAAA;AAC5B,gFAA6E;AAApE,kIAAA,sBAAsB,OAAA;AAC/B,8DAA4D;AAAnD,iHAAA,cAAc,OAAA;AACvB,wEAAqE;AAA5D,0HAAA,kBAAkB,OAAA;AAE3B,iDAAiD;AACjD,wEAAsE;AAA7D,2HAAA,mBAAmB,OAAA;AAC5B,sEAAoE;AAA3D,yHAAA,kBAAkB,OAAA;AAC3B,kEAAgE;AAAvD,qHAAA,gBAAgB,OAAA;AACzB,8EAA2E;AAAlE,gIAAA,qBAAqB,OAAA;AAC9B,oFAQ+C;AAP7C,sIAAA,wBAAwB,OAAA;AAQ1B,kEAAgE;AAAvD,qHAAA,gBAAgB,OAAA;AAEzB,wBAAwB;AACxB,uCAAqC;AAA5B,mGAAA,OAAO,OAAA;AAEhB,iBAAiB;AACjB,uCAAgD;AAAvC,mGAAA,OAAO,OAAW"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Broadcast Service for Zalo Official Account
3
+ *
4
+ * Gửi tin Truyền thông Broadcast đến nhiều người dùng dựa trên tiêu chí targeting
5
+ * API: https://openapi.zalo.me/v2.0/oa/message
6
+ *
7
+ * TÍNH NĂNG:
8
+ * 1. GỬI TIN BROADCAST:
9
+ * - Gửi tin nhắn đến nhiều người dùng cùng lúc
10
+ * - Targeting theo tuổi, giới tính, địa điểm, platform
11
+ * - Chỉ hỗ trợ template type "media" với article attachment
12
+ *
13
+ * 2. TARGETING CRITERIA:
14
+ * - Ages: Nhóm tuổi (0-12, 13-17, 18-24, 25-34, 35-44, 45-54, 55-64, 65+)
15
+ * - Gender: Giới tính (All, Male, Female)
16
+ * - Cities: Tỉnh thành cụ thể (63 tỉnh thành Việt Nam)
17
+ * - Locations: Miền (Bắc, Trung, Nam)
18
+ * - Platform: Hệ điều hành (iOS, Android, Windows Phone)
19
+ *
20
+ * 3. GIỚI HẠN:
21
+ * - Chỉ gửi được article attachment
22
+ * - Cần có quyền broadcast từ Zalo
23
+ * - Tuân thủ chính sách spam và nội dung
24
+ *
25
+ * LỖI THƯỜNG GẶP:
26
+ * - 3001: Không có quyền gửi broadcast
27
+ * - 3002: Article attachment không tồn tại
28
+ * - 3003: Targeting criteria không hợp lệ
29
+ * - 3004: Vượt quá giới hạn broadcast
30
+ * - 3005: Nội dung vi phạm chính sách
31
+ */
32
+ import { ZaloClient } from '../clients/zalo-client';
33
+ import { BroadcastResponse, BroadcastTarget, BroadcastRecipient, BROADCAST_CITY_CODES, BROADCAST_AGE_CODES, BROADCAST_GENDER_CODES, BROADCAST_LOCATION_CODES, BROADCAST_PLATFORM_CODES, MultipleBroadcastResult, MultipleBroadcastProgress } from '../types/broadcast';
34
+ export declare class BroadcastService {
35
+ private readonly client;
36
+ private readonly broadcastApiUrl;
37
+ constructor(client: ZaloClient);
38
+ /**
39
+ * Gửi tin nhắn broadcast đến nhiều người dùng
40
+ * @param accessToken Access token của Official Account
41
+ * @param recipient Thông tin targeting người nhận
42
+ * @param attachmentId ID của article attachment
43
+ * @returns Thông tin tin nhắn broadcast đã gửi
44
+ */
45
+ sendBroadcastMessage(accessToken: string, recipient: BroadcastRecipient, attachmentId: string): Promise<BroadcastResponse>;
46
+ /**
47
+ * Tạo broadcast target với các tiêu chí targeting
48
+ * @param criteria Các tiêu chí targeting
49
+ * @returns BroadcastTarget object
50
+ */
51
+ createBroadcastTarget(criteria: {
52
+ ages?: string[];
53
+ gender?: "ALL" | "MALE" | "FEMALE";
54
+ cities?: string[];
55
+ locations?: ("NORTH" | "CENTRAL" | "SOUTH")[];
56
+ platforms?: ("IOS" | "ANDROID" | "WINDOWS_PHONE")[];
57
+ }): BroadcastTarget;
58
+ /**
59
+ * Validate broadcast request parameters
60
+ * @param recipient Broadcast recipient
61
+ * @param attachmentId Article attachment ID
62
+ */
63
+ private validateBroadcastRequest;
64
+ /**
65
+ * Get available city codes for targeting
66
+ * @returns Object mapping city names to codes
67
+ */
68
+ getCityCodes(): typeof BROADCAST_CITY_CODES;
69
+ /**
70
+ * Get available age group codes for targeting
71
+ * @returns Object mapping age groups to codes
72
+ */
73
+ getAgeGroupCodes(): typeof BROADCAST_AGE_CODES;
74
+ /**
75
+ * Get available gender codes for targeting
76
+ * @returns Object mapping genders to codes
77
+ */
78
+ getGenderCodes(): typeof BROADCAST_GENDER_CODES;
79
+ /**
80
+ * Get available location codes for targeting
81
+ * @returns Object mapping locations to codes
82
+ */
83
+ getLocationCodes(): typeof BROADCAST_LOCATION_CODES;
84
+ /**
85
+ * Get available platform codes for targeting
86
+ * @returns Object mapping platforms to codes
87
+ */
88
+ getPlatformCodes(): typeof BROADCAST_PLATFORM_CODES;
89
+ /**
90
+ * Gửi nhiều tin nhắn broadcast với nhiều attachment IDs
91
+ * @param accessToken Access token của Official Account
92
+ * @param recipient Thông tin targeting người nhận
93
+ * @param attachmentIds Danh sách các article attachment IDs
94
+ * @param options Tùy chọn gửi (delay giữa các tin, parallel/sequential)
95
+ * @returns Danh sách kết quả gửi broadcast
96
+ */
97
+ sendMultipleBroadcastMessages(accessToken: string, recipient: BroadcastRecipient, attachmentIds: string[], options?: {
98
+ delay?: number;
99
+ mode?: 'parallel' | 'sequential';
100
+ onProgress?: (progress: MultipleBroadcastProgress) => void;
101
+ }): Promise<MultipleBroadcastResult>;
102
+ /**
103
+ * Sleep utility for delays
104
+ * @param ms Milliseconds to sleep
105
+ */
106
+ private sleep;
107
+ }
108
+ //# sourceMappingURL=broadcast.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broadcast.service.d.ts","sourceRoot":"","sources":["../../src/services/broadcast.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAEL,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAGlB,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,EACxB,uBAAuB,EACvB,yBAAyB,EAE1B,MAAM,oBAAoB,CAAC;AAE5B,qBAAa,gBAAgB;IAIf,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6C;gBAEhD,MAAM,EAAE,UAAU;IAE/C;;;;;;OAMG;IACU,oBAAoB,CAC/B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,kBAAkB,EAC7B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,iBAAiB,CAAC;IA2D7B;;;;OAIG;IACI,qBAAqB,CAAC,QAAQ,EAAE;QACrC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;QACnC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,SAAS,CAAC,EAAE,CAAC,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;QAC9C,SAAS,CAAC,EAAE,CAAC,KAAK,GAAG,SAAS,GAAG,eAAe,CAAC,EAAE,CAAC;KACrD,GAAG,eAAe;IA+DnB;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IA2BhC;;;OAGG;IACI,YAAY,IAAI,OAAO,oBAAoB;IAIlD;;;OAGG;IACI,gBAAgB,IAAI,OAAO,mBAAmB;IAIrD;;;OAGG;IACI,cAAc,IAAI,OAAO,sBAAsB;IAItD;;;OAGG;IACI,gBAAgB,IAAI,OAAO,wBAAwB;IAI1D;;;OAGG;IACI,gBAAgB,IAAI,OAAO,wBAAwB;IAI1D;;;;;;;OAOG;IACU,6BAA6B,CACxC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,kBAAkB,EAC7B,aAAa,EAAE,MAAM,EAAE,EACvB,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;QACjC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,yBAAyB,KAAK,IAAI,CAAC;KAC5D,GACA,OAAO,CAAC,uBAAuB,CAAC;IAqKnC;;;OAGG;IACH,OAAO,CAAC,KAAK;CAGd"}