@warriorteam/redai-zalo-sdk 1.1.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.
Files changed (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +448 -0
  3. package/dist/clients/base-client.d.ts +67 -0
  4. package/dist/clients/base-client.d.ts.map +1 -0
  5. package/dist/clients/base-client.js +297 -0
  6. package/dist/clients/base-client.js.map +1 -0
  7. package/dist/clients/zalo-client.d.ts +131 -0
  8. package/dist/clients/zalo-client.d.ts.map +1 -0
  9. package/dist/clients/zalo-client.js +215 -0
  10. package/dist/clients/zalo-client.js.map +1 -0
  11. package/dist/index.d.ts +40 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +82 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/services/article.service.d.ts +144 -0
  16. package/dist/services/article.service.d.ts.map +1 -0
  17. package/dist/services/article.service.js +518 -0
  18. package/dist/services/article.service.js.map +1 -0
  19. package/dist/services/auth.service.d.ts +55 -0
  20. package/dist/services/auth.service.d.ts.map +1 -0
  21. package/dist/services/auth.service.js +269 -0
  22. package/dist/services/auth.service.js.map +1 -0
  23. package/dist/services/consultation.service.d.ts +73 -0
  24. package/dist/services/consultation.service.d.ts.map +1 -0
  25. package/dist/services/consultation.service.js +208 -0
  26. package/dist/services/consultation.service.js.map +1 -0
  27. package/dist/services/general-message.service.d.ts +85 -0
  28. package/dist/services/general-message.service.d.ts.map +1 -0
  29. package/dist/services/general-message.service.js +248 -0
  30. package/dist/services/general-message.service.js.map +1 -0
  31. package/dist/services/group-management.service.d.ts +220 -0
  32. package/dist/services/group-management.service.d.ts.map +1 -0
  33. package/dist/services/group-management.service.js +562 -0
  34. package/dist/services/group-management.service.js.map +1 -0
  35. package/dist/services/group-message.service.d.ts +102 -0
  36. package/dist/services/group-message.service.d.ts.map +1 -0
  37. package/dist/services/group-message.service.js +233 -0
  38. package/dist/services/group-message.service.js.map +1 -0
  39. package/dist/services/message-management.service.d.ts +135 -0
  40. package/dist/services/message-management.service.d.ts.map +1 -0
  41. package/dist/services/message-management.service.js +237 -0
  42. package/dist/services/message-management.service.js.map +1 -0
  43. package/dist/services/oa.service.d.ts +67 -0
  44. package/dist/services/oa.service.d.ts.map +1 -0
  45. package/dist/services/oa.service.js +223 -0
  46. package/dist/services/oa.service.js.map +1 -0
  47. package/dist/services/promotion.service.d.ts +114 -0
  48. package/dist/services/promotion.service.d.ts.map +1 -0
  49. package/dist/services/promotion.service.js +247 -0
  50. package/dist/services/promotion.service.js.map +1 -0
  51. package/dist/services/tag.service.d.ts +144 -0
  52. package/dist/services/tag.service.d.ts.map +1 -0
  53. package/dist/services/tag.service.js +184 -0
  54. package/dist/services/tag.service.js.map +1 -0
  55. package/dist/services/transaction.service.d.ts +110 -0
  56. package/dist/services/transaction.service.d.ts.map +1 -0
  57. package/dist/services/transaction.service.js +231 -0
  58. package/dist/services/transaction.service.js.map +1 -0
  59. package/dist/services/user-management.service.d.ts +117 -0
  60. package/dist/services/user-management.service.d.ts.map +1 -0
  61. package/dist/services/user-management.service.js +239 -0
  62. package/dist/services/user-management.service.js.map +1 -0
  63. package/dist/services/user.service.d.ts +84 -0
  64. package/dist/services/user.service.d.ts.map +1 -0
  65. package/dist/services/user.service.js +323 -0
  66. package/dist/services/user.service.js.map +1 -0
  67. package/dist/services/video-upload.service.d.ts +83 -0
  68. package/dist/services/video-upload.service.d.ts.map +1 -0
  69. package/dist/services/video-upload.service.js +267 -0
  70. package/dist/services/video-upload.service.js.map +1 -0
  71. package/dist/services/zns.service.d.ts +116 -0
  72. package/dist/services/zns.service.d.ts.map +1 -0
  73. package/dist/services/zns.service.js +234 -0
  74. package/dist/services/zns.service.js.map +1 -0
  75. package/dist/types/article.d.ts +352 -0
  76. package/dist/types/article.d.ts.map +1 -0
  77. package/dist/types/article.js +70 -0
  78. package/dist/types/article.js.map +1 -0
  79. package/dist/types/auth.d.ts +233 -0
  80. package/dist/types/auth.d.ts.map +1 -0
  81. package/dist/types/auth.js +39 -0
  82. package/dist/types/auth.js.map +1 -0
  83. package/dist/types/common.d.ts +237 -0
  84. package/dist/types/common.d.ts.map +1 -0
  85. package/dist/types/common.js +42 -0
  86. package/dist/types/common.js.map +1 -0
  87. package/dist/types/group.d.ts +523 -0
  88. package/dist/types/group.d.ts.map +1 -0
  89. package/dist/types/group.js +6 -0
  90. package/dist/types/group.js.map +1 -0
  91. package/dist/types/message.d.ts +333 -0
  92. package/dist/types/message.d.ts.map +1 -0
  93. package/dist/types/message.js +17 -0
  94. package/dist/types/message.js.map +1 -0
  95. package/dist/types/oa.d.ts +285 -0
  96. package/dist/types/oa.d.ts.map +1 -0
  97. package/dist/types/oa.js +25 -0
  98. package/dist/types/oa.js.map +1 -0
  99. package/dist/types/social.d.ts +427 -0
  100. package/dist/types/social.d.ts.map +1 -0
  101. package/dist/types/social.js +6 -0
  102. package/dist/types/social.js.map +1 -0
  103. package/dist/types/user-management.d.ts +280 -0
  104. package/dist/types/user-management.d.ts.map +1 -0
  105. package/dist/types/user-management.js +6 -0
  106. package/dist/types/user-management.js.map +1 -0
  107. package/dist/types/user.d.ts +365 -0
  108. package/dist/types/user.d.ts.map +1 -0
  109. package/dist/types/user.js +17 -0
  110. package/dist/types/user.js.map +1 -0
  111. package/dist/types/webhook.d.ts +1972 -0
  112. package/dist/types/webhook.d.ts.map +1 -0
  113. package/dist/types/webhook.js +419 -0
  114. package/dist/types/webhook.js.map +1 -0
  115. package/dist/types/zns.d.ts +277 -0
  116. package/dist/types/zns.d.ts.map +1 -0
  117. package/dist/types/zns.js +6 -0
  118. package/dist/types/zns.js.map +1 -0
  119. package/dist/zalo-sdk.d.ts +228 -0
  120. package/dist/zalo-sdk.d.ts.map +1 -0
  121. package/dist/zalo-sdk.js +307 -0
  122. package/dist/zalo-sdk.js.map +1 -0
  123. package/package.json +59 -0
@@ -0,0 +1,247 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PromotionService = void 0;
4
+ const common_1 = require("../types/common");
5
+ /**
6
+ * Service xử lý các API tin nhắn truyền thông/quảng cáo của Zalo Official Account
7
+ *
8
+ * ĐIỀU KIỆN GỬI TIN TRUYỀN THÔNG:
9
+ *
10
+ * 1. THỜI GIAN GỬI:
11
+ * - Chỉ được gửi trong khung giờ từ 8:00 - 22:00 hàng ngày
12
+ * - Không được gửi vào các ngày lễ, tết theo quy định
13
+ *
14
+ * 2. NỘI DUNG TIN NHẮN:
15
+ * - Phải là nội dung quảng cáo, khuyến mãi, tin tức
16
+ * - Không được chứa nội dung vi phạm pháp luật
17
+ * - Phải tuân thủ quy định về quảng cáo của Việt Nam
18
+ *
19
+ * 3. TẦN SUẤT GỬI:
20
+ * - Tối đa 1 tin nhắn truyền thông/ngày cho mỗi người dùng
21
+ * - Người dùng có thể từ chối nhận tin truyền thông
22
+ *
23
+ * 4. ĐỊNH DẠNG:
24
+ * - Phải sử dụng template được Zalo phê duyệt trước
25
+ * - Template phải tuân thủ format chuẩn của tin truyền thông
26
+ *
27
+ * 5. NGƯỜI DÙNG:
28
+ * - Người dùng phải đã follow OA
29
+ * - Người dùng không được block OA
30
+ * - Người dùng không được từ chối nhận tin truyền thông
31
+ *
32
+ * 6. OFFICIAL ACCOUNT:
33
+ * - OA phải được xác minh (verified)
34
+ * - OA phải có quyền gửi tin truyền thông được Zalo cấp phép
35
+ * - OA không được vi phạm chính sách về quảng cáo
36
+ *
37
+ * LỖI THƯỜNG GẶP:
38
+ * - 2001: Ngoài khung giờ cho phép (8:00-22:00)
39
+ * - 2002: Người dùng đã từ chối nhận tin truyền thông
40
+ * - 2003: Vượt quá giới hạn 1 tin/ngày
41
+ * - 2004: Template chưa được phê duyệt
42
+ * - 2005: Nội dung vi phạm chính sách quảng cáo
43
+ * - 2006: OA chưa có quyền gửi tin truyền thông
44
+ */
45
+ class PromotionService {
46
+ constructor(client) {
47
+ this.client = client;
48
+ this.promotionApiUrl = "https://openapi.zalo.me/v2.0/oa/message/promotion";
49
+ }
50
+ /**
51
+ * Gửi tin nhắn truyền thông/quảng cáo
52
+ * @param accessToken Access token của Official Account
53
+ * @param recipient Thông tin người nhận
54
+ * @param message Nội dung tin nhắn truyền thông
55
+ * @returns Thông tin tin nhắn đã gửi
56
+ */
57
+ async sendPromotionMessage(accessToken, recipient, message) {
58
+ try {
59
+ // Validate promotion message
60
+ this.validatePromotionMessage(message);
61
+ // Check sending time (8:00 - 22:00)
62
+ this.validateSendingTime();
63
+ const request = {
64
+ recipient,
65
+ message,
66
+ };
67
+ const result = await this.client.apiPost(this.promotionApiUrl, accessToken, request);
68
+ if (result.error !== 0) {
69
+ throw new common_1.ZaloSDKError(result.message || "Failed to send promotion message", result.error, result);
70
+ }
71
+ if (!result.data) {
72
+ throw new common_1.ZaloSDKError("No response data received", -1);
73
+ }
74
+ return result.data;
75
+ }
76
+ catch (error) {
77
+ if (error instanceof common_1.ZaloSDKError) {
78
+ throw error;
79
+ }
80
+ throw new common_1.ZaloSDKError(`Failed to send promotion message: ${error.message}`, -1, error);
81
+ }
82
+ }
83
+ /**
84
+ * Gửi tin nhắn khuyến mãi sản phẩm
85
+ * @param accessToken Access token của Official Account
86
+ * @param recipient Thông tin người nhận
87
+ * @param promotionInfo Thông tin khuyến mãi
88
+ * @returns Thông tin tin nhắn đã gửi
89
+ */
90
+ async sendProductPromotion(accessToken, recipient, promotionInfo) {
91
+ try {
92
+ const message = {
93
+ type: "promotion",
94
+ attachment: {
95
+ type: "template",
96
+ payload: {
97
+ template_type: "promotion",
98
+ elements: [
99
+ {
100
+ title: promotionInfo.title,
101
+ subtitle: promotionInfo.description,
102
+ image_url: promotionInfo.imageUrl,
103
+ default_action: {
104
+ type: "web_url",
105
+ url: promotionInfo.productUrl,
106
+ },
107
+ buttons: [
108
+ {
109
+ type: "web_url",
110
+ title: "Mua ngay",
111
+ url: promotionInfo.productUrl,
112
+ },
113
+ {
114
+ type: "postback",
115
+ title: "Xem thêm",
116
+ payload: `VIEW_PRODUCT_${Date.now()}`,
117
+ },
118
+ ],
119
+ },
120
+ ],
121
+ },
122
+ },
123
+ };
124
+ return this.sendPromotionMessage(accessToken, recipient, message);
125
+ }
126
+ catch (error) {
127
+ throw new common_1.ZaloSDKError(`Failed to send product promotion: ${error.message}`, -1, error);
128
+ }
129
+ }
130
+ /**
131
+ * Gửi tin nhắn thông báo sự kiện
132
+ * @param accessToken Access token của Official Account
133
+ * @param recipient Thông tin người nhận
134
+ * @param eventInfo Thông tin sự kiện
135
+ * @returns Thông tin tin nhắn đã gửi
136
+ */
137
+ async sendEventNotification(accessToken, recipient, eventInfo) {
138
+ try {
139
+ const message = {
140
+ type: "promotion",
141
+ attachment: {
142
+ type: "template",
143
+ payload: {
144
+ template_type: "promotion",
145
+ elements: [
146
+ {
147
+ title: eventInfo.title,
148
+ subtitle: `${eventInfo.description}\n📅 ${eventInfo.eventDate}\n📍 ${eventInfo.location}`,
149
+ image_url: eventInfo.imageUrl,
150
+ default_action: {
151
+ type: "web_url",
152
+ url: eventInfo.registrationUrl,
153
+ },
154
+ buttons: [
155
+ {
156
+ type: "web_url",
157
+ title: "Đăng ký tham gia",
158
+ url: eventInfo.registrationUrl,
159
+ },
160
+ {
161
+ type: "postback",
162
+ title: "Chia sẻ",
163
+ payload: `SHARE_EVENT_${Date.now()}`,
164
+ },
165
+ ],
166
+ },
167
+ ],
168
+ },
169
+ },
170
+ };
171
+ return this.sendPromotionMessage(accessToken, recipient, message);
172
+ }
173
+ catch (error) {
174
+ throw new common_1.ZaloSDKError(`Failed to send event notification: ${error.message}`, -1, error);
175
+ }
176
+ }
177
+ /**
178
+ * Gửi tin nhắn newsletter
179
+ * @param accessToken Access token của Official Account
180
+ * @param recipient Thông tin người nhận
181
+ * @param newsletterInfo Thông tin newsletter
182
+ * @returns Thông tin tin nhắn đã gửi
183
+ */
184
+ async sendNewsletter(accessToken, recipient, newsletterInfo) {
185
+ try {
186
+ const message = {
187
+ type: "promotion",
188
+ attachment: {
189
+ type: "template",
190
+ payload: {
191
+ template_type: "promotion",
192
+ elements: [
193
+ {
194
+ title: newsletterInfo.title,
195
+ subtitle: newsletterInfo.summary,
196
+ image_url: newsletterInfo.imageUrl,
197
+ buttons: [
198
+ {
199
+ type: "web_url",
200
+ title: "Đọc toàn bộ",
201
+ url: newsletterInfo.articles[0]?.url || "#",
202
+ },
203
+ {
204
+ type: "web_url",
205
+ title: "Hủy đăng ký",
206
+ url: newsletterInfo.unsubscribeUrl,
207
+ },
208
+ ],
209
+ },
210
+ ],
211
+ },
212
+ },
213
+ };
214
+ return this.sendPromotionMessage(accessToken, recipient, message);
215
+ }
216
+ catch (error) {
217
+ throw new common_1.ZaloSDKError(`Failed to send newsletter: ${error.message}`, -1, error);
218
+ }
219
+ }
220
+ /**
221
+ * Validate promotion message format
222
+ * @param message Promotion message to validate
223
+ */
224
+ validatePromotionMessage(message) {
225
+ if (!message.attachment) {
226
+ throw new common_1.ZaloSDKError("Promotion message must have attachment", -1);
227
+ }
228
+ if (!message.attachment.payload) {
229
+ throw new common_1.ZaloSDKError("Promotion message attachment must have payload", -1);
230
+ }
231
+ if (message.attachment.payload.template_type !== "promotion") {
232
+ throw new common_1.ZaloSDKError("Promotion message must use promotion template type", -1);
233
+ }
234
+ }
235
+ /**
236
+ * Validate sending time (8:00 - 22:00)
237
+ */
238
+ validateSendingTime() {
239
+ const now = new Date();
240
+ const hour = now.getHours();
241
+ if (hour < 8 || hour >= 22) {
242
+ throw new common_1.ZaloSDKError("Tin nhắn truyền thông chỉ được gửi trong khung giờ từ 8:00 - 22:00", 2001);
243
+ }
244
+ }
245
+ }
246
+ exports.PromotionService = PromotionService;
247
+ //# sourceMappingURL=promotion.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promotion.service.js","sourceRoot":"","sources":["../../src/services/promotion.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ import { ZaloClient } from "../clients/zalo-client";
2
+ /**
3
+ * Service for managing Zalo OA user tags
4
+ * Provides comprehensive tag management capabilities
5
+ */
6
+ export declare class TagService {
7
+ private readonly client;
8
+ private readonly apiUrl;
9
+ constructor(client: ZaloClient);
10
+ /**
11
+ * Get all tags of the OA
12
+ * @param accessToken OA access token
13
+ * @returns List of all tags
14
+ */
15
+ getAllTags(accessToken: string): Promise<{
16
+ error: number;
17
+ message: string;
18
+ data?: Array<{
19
+ tag_name: string;
20
+ tag_id?: string;
21
+ user_count?: number;
22
+ }>;
23
+ }>;
24
+ /**
25
+ * Get tags of a specific user
26
+ * @param accessToken OA access token
27
+ * @param userId User ID
28
+ * @returns User's tags
29
+ */
30
+ getUserTags(accessToken: string, userId: string): Promise<{
31
+ error: number;
32
+ message: string;
33
+ data?: Array<{
34
+ tag_name: string;
35
+ tag_id?: string;
36
+ }>;
37
+ }>;
38
+ /**
39
+ * Create a new tag
40
+ * @param accessToken OA access token
41
+ * @param tagName Tag name
42
+ * @returns Created tag information
43
+ */
44
+ createTag(accessToken: string, tagName: string): Promise<{
45
+ error: number;
46
+ message: string;
47
+ data?: {
48
+ tag_name: string;
49
+ tag_id?: string;
50
+ };
51
+ }>;
52
+ /**
53
+ * Delete a tag
54
+ * @param accessToken OA access token
55
+ * @param tagName Tag name to delete
56
+ * @returns Deletion result
57
+ */
58
+ deleteTag(accessToken: string, tagName: string): Promise<{
59
+ error: number;
60
+ message: string;
61
+ }>;
62
+ /**
63
+ * Tag a user with specific tags
64
+ * @param accessToken OA access token
65
+ * @param userId User ID
66
+ * @param tagNames Array of tag names
67
+ * @returns Tagging result
68
+ */
69
+ tagUser(accessToken: string, userId: string, tagNames: string[]): Promise<{
70
+ error: number;
71
+ message: string;
72
+ }>;
73
+ /**
74
+ * Remove tags from a user
75
+ * @param accessToken OA access token
76
+ * @param userId User ID
77
+ * @param tagNames Array of tag names to remove
78
+ * @returns Untagging result
79
+ */
80
+ untagUser(accessToken: string, userId: string, tagNames: string[]): Promise<{
81
+ error: number;
82
+ message: string;
83
+ }>;
84
+ /**
85
+ * Get users by tag
86
+ * @param accessToken OA access token
87
+ * @param tagName Tag name
88
+ * @param offset Offset for pagination
89
+ * @param count Number of users to retrieve
90
+ * @returns Users with the specified tag
91
+ */
92
+ getUsersByTag(accessToken: string, tagName: string, offset?: number, count?: number): Promise<{
93
+ error: number;
94
+ message: string;
95
+ data?: {
96
+ users: Array<{
97
+ user_id: string;
98
+ user_id_by_app?: string;
99
+ display_name: string;
100
+ avatar?: string;
101
+ user_is_follower: boolean;
102
+ }>;
103
+ total: number;
104
+ };
105
+ }>;
106
+ /**
107
+ * Bulk tag multiple users
108
+ * @param accessToken OA access token
109
+ * @param userIds Array of user IDs
110
+ * @param tagNames Array of tag names
111
+ * @returns Bulk tagging result
112
+ */
113
+ bulkTagUsers(accessToken: string, userIds: string[], tagNames: string[]): Promise<{
114
+ error: number;
115
+ message: string;
116
+ data?: {
117
+ successful_users: string[];
118
+ failed_users: Array<{
119
+ user_id: string;
120
+ error: string;
121
+ }>;
122
+ };
123
+ }>;
124
+ /**
125
+ * Bulk untag multiple users
126
+ * @param accessToken OA access token
127
+ * @param userIds Array of user IDs
128
+ * @param tagNames Array of tag names to remove
129
+ * @returns Bulk untagging result
130
+ */
131
+ bulkUntagUsers(accessToken: string, userIds: string[], tagNames: string[]): Promise<{
132
+ error: number;
133
+ message: string;
134
+ data?: {
135
+ successful_users: string[];
136
+ failed_users: Array<{
137
+ user_id: string;
138
+ error: string;
139
+ }>;
140
+ };
141
+ }>;
142
+ private handleTagError;
143
+ }
144
+ //# sourceMappingURL=tag.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag.service.d.ts","sourceRoot":"","sources":["../../src/services/tag.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TagService = void 0;
4
+ /**
5
+ * Service for managing Zalo OA user tags
6
+ * Provides comprehensive tag management capabilities
7
+ */
8
+ class TagService {
9
+ constructor(client) {
10
+ this.client = client;
11
+ this.apiUrl = "https://openapi.zalo.me/v3.0/oa";
12
+ }
13
+ /**
14
+ * Get all tags of the OA
15
+ * @param accessToken OA access token
16
+ * @returns List of all tags
17
+ */
18
+ async getAllTags(accessToken) {
19
+ try {
20
+ const response = await this.client.apiGet(`${this.apiUrl}/tag/gettagsofoa`, accessToken);
21
+ return response;
22
+ }
23
+ catch (error) {
24
+ throw this.handleTagError(error, "Failed to get all tags");
25
+ }
26
+ }
27
+ /**
28
+ * Get tags of a specific user
29
+ * @param accessToken OA access token
30
+ * @param userId User ID
31
+ * @returns User's tags
32
+ */
33
+ async getUserTags(accessToken, userId) {
34
+ try {
35
+ const response = await this.client.apiGet(`${this.apiUrl}/tag/gettagsofuser`, accessToken, {
36
+ user_id: userId,
37
+ });
38
+ return response;
39
+ }
40
+ catch (error) {
41
+ throw this.handleTagError(error, "Failed to get user tags");
42
+ }
43
+ }
44
+ /**
45
+ * Create a new tag
46
+ * @param accessToken OA access token
47
+ * @param tagName Tag name
48
+ * @returns Created tag information
49
+ */
50
+ async createTag(accessToken, tagName) {
51
+ try {
52
+ const response = await this.client.apiPost(`${this.apiUrl}/tag/create`, accessToken, {
53
+ tag_name: tagName,
54
+ });
55
+ return response;
56
+ }
57
+ catch (error) {
58
+ throw this.handleTagError(error, "Failed to create tag");
59
+ }
60
+ }
61
+ /**
62
+ * Delete a tag
63
+ * @param accessToken OA access token
64
+ * @param tagName Tag name to delete
65
+ * @returns Deletion result
66
+ */
67
+ async deleteTag(accessToken, tagName) {
68
+ try {
69
+ const response = await this.client.apiPost(`${this.apiUrl}/tag/delete`, accessToken, {
70
+ tag_name: tagName,
71
+ });
72
+ return response;
73
+ }
74
+ catch (error) {
75
+ throw this.handleTagError(error, "Failed to delete tag");
76
+ }
77
+ }
78
+ /**
79
+ * Tag a user with specific tags
80
+ * @param accessToken OA access token
81
+ * @param userId User ID
82
+ * @param tagNames Array of tag names
83
+ * @returns Tagging result
84
+ */
85
+ async tagUser(accessToken, userId, tagNames) {
86
+ try {
87
+ const response = await this.client.apiPost(`${this.apiUrl}/tag/taguser`, accessToken, {
88
+ user_id: userId,
89
+ tag_names: tagNames,
90
+ });
91
+ return response;
92
+ }
93
+ catch (error) {
94
+ throw this.handleTagError(error, "Failed to tag user");
95
+ }
96
+ }
97
+ /**
98
+ * Remove tags from a user
99
+ * @param accessToken OA access token
100
+ * @param userId User ID
101
+ * @param tagNames Array of tag names to remove
102
+ * @returns Untagging result
103
+ */
104
+ async untagUser(accessToken, userId, tagNames) {
105
+ try {
106
+ const response = await this.client.apiPost(`${this.apiUrl}/tag/rmtaguser`, accessToken, {
107
+ user_id: userId,
108
+ tag_names: tagNames,
109
+ });
110
+ return response;
111
+ }
112
+ catch (error) {
113
+ throw this.handleTagError(error, "Failed to untag user");
114
+ }
115
+ }
116
+ /**
117
+ * Get users by tag
118
+ * @param accessToken OA access token
119
+ * @param tagName Tag name
120
+ * @param offset Offset for pagination
121
+ * @param count Number of users to retrieve
122
+ * @returns Users with the specified tag
123
+ */
124
+ async getUsersByTag(accessToken, tagName, offset = 0, count = 50) {
125
+ try {
126
+ const response = await this.client.apiGet(`${this.apiUrl}/tag/getusersoftag`, accessToken, {
127
+ tag_name: tagName,
128
+ offset,
129
+ count,
130
+ });
131
+ return response;
132
+ }
133
+ catch (error) {
134
+ throw this.handleTagError(error, "Failed to get users by tag");
135
+ }
136
+ }
137
+ /**
138
+ * Bulk tag multiple users
139
+ * @param accessToken OA access token
140
+ * @param userIds Array of user IDs
141
+ * @param tagNames Array of tag names
142
+ * @returns Bulk tagging result
143
+ */
144
+ async bulkTagUsers(accessToken, userIds, tagNames) {
145
+ try {
146
+ const response = await this.client.apiPost(`${this.apiUrl}/tag/bulktagusers`, accessToken, {
147
+ user_ids: userIds,
148
+ tag_names: tagNames,
149
+ });
150
+ return response;
151
+ }
152
+ catch (error) {
153
+ throw this.handleTagError(error, "Failed to bulk tag users");
154
+ }
155
+ }
156
+ /**
157
+ * Bulk untag multiple users
158
+ * @param accessToken OA access token
159
+ * @param userIds Array of user IDs
160
+ * @param tagNames Array of tag names to remove
161
+ * @returns Bulk untagging result
162
+ */
163
+ async bulkUntagUsers(accessToken, userIds, tagNames) {
164
+ try {
165
+ const response = await this.client.apiPost(`${this.apiUrl}/tag/bulkuntagusers`, accessToken, {
166
+ user_ids: userIds,
167
+ tag_names: tagNames,
168
+ });
169
+ return response;
170
+ }
171
+ catch (error) {
172
+ throw this.handleTagError(error, "Failed to bulk untag users");
173
+ }
174
+ }
175
+ handleTagError(error, defaultMessage) {
176
+ if (error.response?.data) {
177
+ const errorData = error.response.data;
178
+ return new Error(`${defaultMessage}: ${errorData.message || errorData.error || "Unknown error"}`);
179
+ }
180
+ return new Error(`${defaultMessage}: ${error.message || "Unknown error"}`);
181
+ }
182
+ }
183
+ exports.TagService = TagService;
184
+ //# sourceMappingURL=tag.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag.service.js","sourceRoot":"","sources":["../../src/services/tag.service.ts"],"names":[],"mappings":"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"}