@warriorteam/redai-zalo-sdk 1.18.0 → 1.20.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,162 @@ 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.20.0] - 2025-08-29
9
+
10
+ ### 🚀 NEW FEATURES
11
+
12
+ #### Broadcast Service - Gửi Tin Truyền Thông Broadcast
13
+ - **ADDED**: `BroadcastService` - Service mới để gửi tin truyền thông broadcast đến nhiều người dùng
14
+ - **ADDED**: `sendBroadcastMessage()` - API gửi broadcast với targeting criteria
15
+ - **ADDED**: `createBroadcastTarget()` - Helper tạo targeting criteria dễ dàng
16
+ - **SUPPORT**: Targeting theo tuổi, giới tính, tỉnh thành, miền, platform
17
+ - **COMPLIANCE**: Tuân thủ 100% Zalo API specification
18
+
19
+ #### Advanced Targeting System
20
+ - **AGES**: 8 nhóm tuổi (0-12, 13-17, 18-24, 25-34, 35-44, 45-54, 55-64, 65+)
21
+ - **GENDER**: 3 lựa chọn (All, Male, Female)
22
+ - **CITIES**: 63 tỉnh thành Việt Nam với mapping chính xác
23
+ - **LOCATIONS**: 3 miền (North, Central, South)
24
+ - **PLATFORMS**: 3 hệ điều hành (iOS, Android, Windows Phone)
25
+
26
+ #### Helper Methods & Constants
27
+ - **ADDED**: `getCityCodes()` - Lấy mapping tỉnh thành
28
+ - **ADDED**: `getAgeGroupCodes()` - Lấy mã nhóm tuổi
29
+ - **ADDED**: `getGenderCodes()` - Lấy mã giới tính
30
+ - **ADDED**: `getLocationCodes()` - Lấy mã miền
31
+ - **ADDED**: `getPlatformCodes()` - Lấy mã platform
32
+ - **CONSTANTS**: Đầy đủ constants cho tất cả targeting criteria
33
+
34
+ ### 📊 NEW INTERFACES
35
+
36
+ #### Broadcast Types
37
+ - **ADDED**: `BroadcastTarget` - Interface cho targeting criteria
38
+ - **ADDED**: `BroadcastRecipient` - Interface cho thông tin người nhận
39
+ - **ADDED**: `BroadcastMessage` - Interface cho tin nhắn broadcast
40
+ - **ADDED**: `BroadcastRequest` - Request payload structure
41
+ - **ADDED**: `BroadcastResponse` - Response structure với message_id
42
+ - **ADDED**: `BroadcastMessageElement` - Element structure cho article attachment
43
+
44
+ ### 🛡️ VALIDATION & ERROR HANDLING
45
+ - **VALIDATION**: Kiểm tra targeting criteria hợp lệ
46
+ - **VALIDATION**: Kiểm tra attachment_id bắt buộc
47
+ - **ERROR**: Comprehensive error messages cho từng trường hợp
48
+ - **TYPE SAFETY**: Full TypeScript support với IntelliSense
49
+
50
+ ### 📚 DOCUMENTATION & EXAMPLES
51
+
52
+ #### New Documentation
53
+ - **ADDED**: `docs/BROADCAST_SERVICE.md` - Hướng dẫn chi tiết BroadcastService
54
+ - **UPDATED**: `docs/API_REFERENCE.md` - Thêm BroadcastService methods
55
+ - **UPDATED**: `README.md` - Thêm Broadcast Service examples
56
+
57
+ #### New Examples
58
+ - **ADDED**: `examples/broadcast-example.ts` - Ví dụ sử dụng BroadcastService
59
+ - **EXAMPLES**: Targeting đơn giản và phức tạp
60
+ - **EXAMPLES**: Error handling và best practices
61
+
62
+ #### New Tests
63
+ - **ADDED**: `tests/broadcast.test.ts` - Unit tests cho BroadcastService
64
+ - **COVERAGE**: Test targeting criteria creation
65
+ - **COVERAGE**: Test broadcast message sending
66
+ - **COVERAGE**: Test validation logic
67
+
68
+ ### 🔧 SDK INTEGRATION
69
+ - **INTEGRATION**: Tích hợp BroadcastService vào main ZaloSDK class
70
+ - **ACCESS**: Sử dụng qua `zalo.broadcast`
71
+ - **EXPORT**: Export tất cả types và service từ main index
72
+
73
+ ### 📋 API SPECIFICATION COMPLIANCE
74
+ - **ENDPOINT**: `https://openapi.zalo.me/v2.0/oa/message` ✅
75
+ - **METHOD**: POST với JSON payload ✅
76
+ - **HEADERS**: access_token authentication ✅
77
+ - **TARGETING**: recipient.target với đầy đủ criteria ✅
78
+ - **MESSAGE**: Template type "media" với article attachment ✅
79
+ - **RESPONSE**: message_id, error, message structure ✅
80
+
81
+ ## [1.19.0] - 2025-08-29
82
+
83
+ ### 🚀 NEW FEATURES
84
+
85
+ #### Group Message List APIs - Gửi Danh Sách Tin Nhắn Group
86
+ - **ADDED**: `sendMessageListToGroup()` - Gửi danh sách tin nhắn tới 1 group với delay tùy chỉnh
87
+ - **ADDED**: `sendMessageListToMultipleGroups()` - Gửi danh sách tin nhắn tới nhiều groups cùng lúc
88
+ - **SUPPORT**: Hỗ trợ đầy đủ 5 loại tin nhắn group: text, image, file, sticker, mention
89
+ - **FLEXIBLE**: Delay riêng cho từng tin nhắn + delay giữa groups để tránh rate limit
90
+ - **SMART**: Tự động loại bỏ group IDs trùng lặp và validation đầy đủ
91
+
92
+ #### Real-time Progress Tracking cho Groups
93
+ - **CALLBACK**: `onProgress` callback để tracking real-time từng tin nhắn và group
94
+ - **DETAILED**: Thống kê chi tiết thành công/thất bại cho từng tin nhắn và group
95
+ - **ISOLATION**: Error của 1 tin nhắn/group không ảnh hưởng phần còn lại
96
+ - **METRICS**: Tracking thời gian thực hiện, success rate, và message statistics
97
+
98
+ #### Advanced Group Messaging Features
99
+ - **MENTION**: Hỗ trợ mention members với offset và length chính xác
100
+ - **CAPTION**: Image messages với caption tối đa 2000 ký tự
101
+ - **FILE**: File attachments với token từ upload API
102
+ - **SEQUENTIAL**: Gửi tuần tự để đảm bảo thứ tự và tránh rate limit
103
+
104
+ ### 📊 NEW INTERFACES
105
+
106
+ #### Group Message List Types
107
+ - **ADDED**: `GroupMessageItem` - Interface cho từng tin nhắn trong danh sách
108
+ - **ADDED**: `SendMessageListToGroupRequest` - Request cho single group
109
+ - **ADDED**: `SendMessageListToGroupResponse` - Response với detailed results
110
+ - **ADDED**: `SendMessageListToMultipleGroupsRequest` - Request cho multiple groups
111
+ - **ADDED**: `SendMessageListToMultipleGroupsResponse` - Response với group statistics
112
+ - **ADDED**: `GroupMessageProgressInfo` - Interface cho message progress tracking
113
+ - **ADDED**: `MultipleGroupsProgressInfo` - Interface cho multiple groups progress tracking
114
+
115
+ ### 📚 DOCUMENTATION & EXAMPLES
116
+
117
+ #### New Documentation
118
+ - **ADDED**: `docs/group-message-list-api.md` - Comprehensive guide cho Group Message List APIs
119
+ - **UPDATED**: Hướng dẫn chi tiết từng loại tin nhắn group và use cases
120
+ - **ADDED**: So sánh API cũ vs mới với feature comparison table
121
+
122
+ #### New Examples
123
+ - **ADDED**: `examples/group-message-list.ts` - Ví dụ gửi danh sách tin nhắn group
124
+ - **INCLUDED**: System notifications, marketing campaigns, meeting notifications examples
125
+ - **DEMO**: Mention messages, image captions, file attachments usage
126
+
127
+ ### 🎯 USE CASES
128
+
129
+ #### System Administration
130
+ - **MAINTENANCE**: Thông báo bảo trì hệ thống tới tất cả groups
131
+ - **ALERTS**: Emergency alerts với hình ảnh và file đính kèm
132
+ - **UPDATES**: System updates với mention admins
133
+
134
+ #### Marketing & Business
135
+ - **CAMPAIGNS**: Flash sales, khuyến mãi tới customer groups
136
+ - **PROMOTIONS**: Product launches với hình ảnh và stickers
137
+ - **ANNOUNCEMENTS**: Company announcements với professional formatting
138
+
139
+ #### Team Communication
140
+ - **MEETINGS**: Meeting notifications với mention participants
141
+ - **PROJECTS**: Project updates tới multiple team groups
142
+ - **REPORTS**: Regular reports với file attachments
143
+
144
+ ### 🔧 TECHNICAL IMPROVEMENTS
145
+
146
+ #### Enhanced Error Handling
147
+ - **ROBUST**: Comprehensive error handling cho từng tin nhắn và group
148
+ - **CONTINUE**: Tiếp tục gửi khi gặp lỗi thay vì dừng toàn bộ process
149
+ - **DETAILED**: Error messages chi tiết với context information
150
+ - **ISOLATION**: Error isolation giữa tin nhắn và giữa groups
151
+
152
+ #### Performance Optimizations
153
+ - **SEQUENTIAL**: Sequential processing để tránh overwhelming Zalo servers
154
+ - **MEMORY**: Optimized memory usage cho large group lists
155
+ - **RATE-LIMIT**: Built-in rate limiting protection với configurable delays
156
+ - **TIMEOUT**: Proper timeout handling và cleanup
157
+
158
+ #### Type Safety & Validation
159
+ - **TYPESCRIPT**: Full TypeScript support với strict typing
160
+ - **VALIDATION**: Runtime validation cho tất cả input parameters
161
+ - **INTELLISENSE**: Complete IDE support với detailed JSDoc comments
162
+ - **CONSTRAINTS**: Proper validation cho message constraints (text length, etc.)
163
+
8
164
  ## [1.18.0] - 2025-08-29
9
165
 
10
166
  ### 🚀 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,38 @@ 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
+
380
413
  ### Consultation Service (Customer Support)
381
414
 
382
415
  ```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,90 @@
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 } 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
+ //# 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,EACzB,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;CAG3D"}
@@ -0,0 +1,211 @@
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
+ exports.BroadcastService = BroadcastService;
211
+ //# 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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"}