@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,83 @@
1
+ import { ZaloClient } from "../clients/zalo-client";
2
+ import { VideoUploadResponse, VideoStatusResponse } from "../types/article";
3
+ /**
4
+ * Service for handling Zalo Official Account Video Upload APIs
5
+ *
6
+ * CONDITIONS FOR USING ZALO VIDEO UPLOAD:
7
+ *
8
+ * 1. GENERAL CONDITIONS:
9
+ * - OA must have permission to upload videos
10
+ * - Access token must have "manage_article" scope
11
+ * - OA must have active status and be verified
12
+ *
13
+ * 2. VIDEO FILE REQUIREMENTS:
14
+ * - File formats: MP4, AVI only
15
+ * - Maximum file size: 50MB
16
+ * - Video processing: asynchronous, use token to check status
17
+ * - Processing time: varies based on video size and quality
18
+ *
19
+ * 3. UPLOAD PROCESS:
20
+ * - Step 1: Upload video file and get token
21
+ * - Step 2: Use token to check processing status
22
+ * - Step 3: Get video_id when processing is complete
23
+ * - Step 4: Use video_id in article creation
24
+ *
25
+ * 4. STATUS CODES:
26
+ * - 1: Upload successful, processing started
27
+ * - 2: Processing in progress
28
+ * - 3: Processing completed successfully
29
+ * - 4: Processing failed
30
+ */
31
+ export declare class VideoUploadService {
32
+ private readonly client;
33
+ private readonly apiUrl;
34
+ constructor(client: ZaloClient);
35
+ /**
36
+ * Upload video file for article
37
+ * @param accessToken OA access token
38
+ * @param file Video file (Buffer or File)
39
+ * @param filename Original filename (optional, will be generated if not provided)
40
+ * @returns Token for tracking upload progress
41
+ */
42
+ uploadVideo(accessToken: string, file: Buffer | File, filename?: string): Promise<VideoUploadResponse>;
43
+ /**
44
+ * Check video upload status
45
+ * @param accessToken OA access token
46
+ * @param token Token from video upload response
47
+ * @returns Video status information
48
+ */
49
+ checkVideoStatus(accessToken: string, token: string): Promise<VideoStatusResponse>;
50
+ /**
51
+ * Wait for video upload completion with polling
52
+ * @param accessToken OA access token
53
+ * @param token Token from video upload response
54
+ * @param maxWaitTime Maximum wait time in milliseconds (default: 5 minutes)
55
+ * @param pollInterval Polling interval in milliseconds (default: 5 seconds)
56
+ * @returns Final video status when completed
57
+ */
58
+ waitForUploadCompletion(accessToken: string, token: string, maxWaitTime?: number, // 5 minutes
59
+ pollInterval?: number): Promise<VideoStatusResponse>;
60
+ /**
61
+ * Upload video from URL
62
+ * @param accessToken OA access token
63
+ * @param videoUrl URL of the video to upload
64
+ * @returns Token for tracking upload progress
65
+ */
66
+ uploadVideoFromUrl(accessToken: string, videoUrl: string): Promise<VideoUploadResponse>;
67
+ /**
68
+ * Get video information by video ID
69
+ * @param accessToken OA access token
70
+ * @param videoId Video ID
71
+ * @returns Video information
72
+ */
73
+ getVideoInfo(accessToken: string, videoId: string): Promise<any>;
74
+ /**
75
+ * Validate video file
76
+ */
77
+ private validateVideoFile;
78
+ private getMimeTypeFromFilename;
79
+ private extractFilenameFromUrl;
80
+ private sleep;
81
+ private handleVideoUploadError;
82
+ }
83
+ //# sourceMappingURL=video-upload.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-upload.service.d.ts","sourceRoot":"","sources":["../../src/services/video-upload.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EAEpB,MAAM,kBAAkB,CAAC;AAG1B;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,kBAAkB;IAGjB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;gBAE5B,MAAM,EAAE,UAAU;IAE/C;;;;;;OAMG;IACG,WAAW,CACf,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,CAAC;IAsC/B;;;;;OAKG;IACG,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,mBAAmB,CAAC;IAoB/B;;;;;;;OAOG;IACG,uBAAuB,CAC3B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,WAAW,GAAE,MAAsB,EAAE,YAAY;IACjD,YAAY,GAAE,MAAiB,GAC9B,OAAO,CAAC,mBAAmB,CAAC;IA8C/B;;;;;OAKG;IACG,kBAAkB,CACtB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,mBAAmB,CAAC;IAmC/B;;;;;OAKG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAsBtE;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyDzB,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,sBAAsB;CAoB/B"}
@@ -0,0 +1,267 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VideoUploadService = void 0;
4
+ const article_1 = require("../types/article");
5
+ const common_1 = require("../types/common");
6
+ /**
7
+ * Service for handling Zalo Official Account Video Upload APIs
8
+ *
9
+ * CONDITIONS FOR USING ZALO VIDEO UPLOAD:
10
+ *
11
+ * 1. GENERAL CONDITIONS:
12
+ * - OA must have permission to upload videos
13
+ * - Access token must have "manage_article" scope
14
+ * - OA must have active status and be verified
15
+ *
16
+ * 2. VIDEO FILE REQUIREMENTS:
17
+ * - File formats: MP4, AVI only
18
+ * - Maximum file size: 50MB
19
+ * - Video processing: asynchronous, use token to check status
20
+ * - Processing time: varies based on video size and quality
21
+ *
22
+ * 3. UPLOAD PROCESS:
23
+ * - Step 1: Upload video file and get token
24
+ * - Step 2: Use token to check processing status
25
+ * - Step 3: Get video_id when processing is complete
26
+ * - Step 4: Use video_id in article creation
27
+ *
28
+ * 4. STATUS CODES:
29
+ * - 1: Upload successful, processing started
30
+ * - 2: Processing in progress
31
+ * - 3: Processing completed successfully
32
+ * - 4: Processing failed
33
+ */
34
+ class VideoUploadService {
35
+ constructor(client) {
36
+ this.client = client;
37
+ this.apiUrl = "https://openapi.zalo.me/v2.0";
38
+ }
39
+ /**
40
+ * Upload video file for article
41
+ * @param accessToken OA access token
42
+ * @param file Video file (Buffer or File)
43
+ * @param filename Original filename (optional, will be generated if not provided)
44
+ * @returns Token for tracking upload progress
45
+ */
46
+ async uploadVideo(accessToken, file, filename) {
47
+ try {
48
+ // Validate file
49
+ this.validateVideoFile(file, filename);
50
+ // Create FormData for upload
51
+ const formData = new FormData();
52
+ if (Buffer.isBuffer(file)) {
53
+ // Handle Buffer input - create a new ArrayBuffer to ensure compatibility
54
+ const actualFilename = filename || "video.mp4";
55
+ const arrayBuffer = new ArrayBuffer(file.length);
56
+ const uint8Array = new Uint8Array(arrayBuffer);
57
+ file.copy(uint8Array);
58
+ const blob = new Blob([uint8Array], {
59
+ type: this.getMimeTypeFromFilename(actualFilename),
60
+ });
61
+ formData.append("file", blob, actualFilename);
62
+ }
63
+ else {
64
+ // Handle File input
65
+ const actualFilename = file.name || filename || "video.mp4";
66
+ formData.append("file", file, actualFilename);
67
+ }
68
+ const response = await this.client.apiPostFormData(`${this.apiUrl}/article/upload_video/preparevideo`, accessToken, formData);
69
+ return response.data;
70
+ }
71
+ catch (error) {
72
+ throw this.handleVideoUploadError(error, "Failed to upload video");
73
+ }
74
+ }
75
+ /**
76
+ * Check video upload status
77
+ * @param accessToken OA access token
78
+ * @param token Token from video upload response
79
+ * @returns Video status information
80
+ */
81
+ async checkVideoStatus(accessToken, token) {
82
+ try {
83
+ if (!token || token.trim() === "") {
84
+ throw new common_1.ZaloSDKError("Token cannot be empty", -1);
85
+ }
86
+ const params = new URLSearchParams();
87
+ params.append("token", token);
88
+ const response = await this.client.apiGet(`${this.apiUrl}/article/upload_video/verify?${params.toString()}`, accessToken);
89
+ return response.data;
90
+ }
91
+ catch (error) {
92
+ throw this.handleVideoUploadError(error, "Failed to check video status");
93
+ }
94
+ }
95
+ /**
96
+ * Wait for video upload completion with polling
97
+ * @param accessToken OA access token
98
+ * @param token Token from video upload response
99
+ * @param maxWaitTime Maximum wait time in milliseconds (default: 5 minutes)
100
+ * @param pollInterval Polling interval in milliseconds (default: 5 seconds)
101
+ * @returns Final video status when completed
102
+ */
103
+ async waitForUploadCompletion(accessToken, token, maxWaitTime = 5 * 60 * 1000, // 5 minutes
104
+ pollInterval = 5 * 1000 // 5 seconds
105
+ ) {
106
+ const startTime = Date.now();
107
+ while (Date.now() - startTime < maxWaitTime) {
108
+ try {
109
+ const status = await this.checkVideoStatus(accessToken, token);
110
+ // Status 3 = Processing completed successfully
111
+ if (status.status === 3 && status.video_id) {
112
+ return status;
113
+ }
114
+ // Status 4 = Processing failed
115
+ if (status.status === 4) {
116
+ throw new common_1.ZaloSDKError(`Video processing failed: ${status.status_message}`, status.convert_error_code);
117
+ }
118
+ // Continue polling for status 1 (uploaded) or 2 (processing)
119
+ if (status.status === 1 || status.status === 2) {
120
+ await this.sleep(pollInterval);
121
+ continue;
122
+ }
123
+ // Unknown status
124
+ throw new common_1.ZaloSDKError(`Unknown video processing status: ${status.status}`, -1);
125
+ }
126
+ catch (error) {
127
+ if (error instanceof common_1.ZaloSDKError) {
128
+ throw error;
129
+ }
130
+ // Continue polling on network errors
131
+ await this.sleep(pollInterval);
132
+ }
133
+ }
134
+ throw new common_1.ZaloSDKError(`Video processing timeout after ${maxWaitTime / 1000} seconds`, -1);
135
+ }
136
+ /**
137
+ * Upload video from URL
138
+ * @param accessToken OA access token
139
+ * @param videoUrl URL of the video to upload
140
+ * @returns Token for tracking upload progress
141
+ */
142
+ async uploadVideoFromUrl(accessToken, videoUrl) {
143
+ try {
144
+ if (!videoUrl || videoUrl.trim() === "") {
145
+ throw new common_1.ZaloSDKError("Video URL cannot be empty", -1);
146
+ }
147
+ // Validate URL format
148
+ try {
149
+ new URL(videoUrl);
150
+ }
151
+ catch {
152
+ throw new common_1.ZaloSDKError("Invalid video URL format", -1);
153
+ }
154
+ // Download video from URL
155
+ const response = await fetch(videoUrl);
156
+ if (!response.ok) {
157
+ throw new common_1.ZaloSDKError(`Failed to download video from URL: ${response.statusText}`, -1);
158
+ }
159
+ const videoBuffer = Buffer.from(await response.arrayBuffer());
160
+ const filename = this.extractFilenameFromUrl(videoUrl) || "video.mp4";
161
+ // Upload the downloaded video
162
+ return await this.uploadVideo(accessToken, videoBuffer, filename);
163
+ }
164
+ catch (error) {
165
+ throw this.handleVideoUploadError(error, "Failed to upload video from URL");
166
+ }
167
+ }
168
+ /**
169
+ * Get video information by video ID
170
+ * @param accessToken OA access token
171
+ * @param videoId Video ID
172
+ * @returns Video information
173
+ */
174
+ async getVideoInfo(accessToken, videoId) {
175
+ try {
176
+ if (!videoId || videoId.trim() === "") {
177
+ throw new common_1.ZaloSDKError("Video ID cannot be empty", -1);
178
+ }
179
+ const params = new URLSearchParams();
180
+ params.append("video_id", videoId);
181
+ const response = await this.client.apiGet(`${this.apiUrl}/article/video/info?${params.toString()}`, accessToken);
182
+ return response;
183
+ }
184
+ catch (error) {
185
+ throw this.handleVideoUploadError(error, "Failed to get video info");
186
+ }
187
+ }
188
+ // ==================== VALIDATION METHODS ====================
189
+ /**
190
+ * Validate video file
191
+ */
192
+ validateVideoFile(file, filename) {
193
+ if (!file) {
194
+ throw new common_1.ZaloSDKError("Video file cannot be empty", -1);
195
+ }
196
+ let fileSize;
197
+ let fileName;
198
+ let mimeType;
199
+ if (Buffer.isBuffer(file)) {
200
+ fileSize = file.length;
201
+ fileName = filename || "video.mp4";
202
+ mimeType = this.getMimeTypeFromFilename(fileName);
203
+ }
204
+ else {
205
+ // Handle File input with proper type casting
206
+ const fileObj = file;
207
+ fileSize = fileObj.size;
208
+ fileName = fileObj.name || filename || "video.mp4";
209
+ mimeType = fileObj.type || this.getMimeTypeFromFilename(fileName);
210
+ }
211
+ // Check file size (50MB)
212
+ if (fileSize > article_1.VIDEO_CONSTRAINTS.maxSize) {
213
+ throw new common_1.ZaloSDKError(`Video file size exceeds ${article_1.VIDEO_CONSTRAINTS.maxSize / (1024 * 1024)}MB limit`, -1);
214
+ }
215
+ // Check file extension
216
+ const fileExtension = fileName
217
+ .toLowerCase()
218
+ .substring(fileName.lastIndexOf("."));
219
+ if (!article_1.VIDEO_CONSTRAINTS.allowedExtensions.includes(fileExtension)) {
220
+ throw new common_1.ZaloSDKError(`Unsupported video format. Only ${article_1.VIDEO_CONSTRAINTS.allowedExtensions.join(", ")} are supported`, -1);
221
+ }
222
+ // Check MIME type
223
+ if (!article_1.VIDEO_CONSTRAINTS.allowedMimeTypes.includes(mimeType)) {
224
+ throw new common_1.ZaloSDKError(`Unsupported video MIME type. Only ${article_1.VIDEO_CONSTRAINTS.allowedMimeTypes.join(", ")} are supported`, -1);
225
+ }
226
+ }
227
+ // ==================== HELPER METHODS ====================
228
+ getMimeTypeFromFilename(filename) {
229
+ const extension = filename
230
+ .toLowerCase()
231
+ .substring(filename.lastIndexOf("."));
232
+ switch (extension) {
233
+ case ".mp4":
234
+ return "video/mp4";
235
+ case ".avi":
236
+ return "video/x-msvideo";
237
+ default:
238
+ return "video/mp4"; // Default fallback
239
+ }
240
+ }
241
+ extractFilenameFromUrl(url) {
242
+ try {
243
+ const urlObj = new URL(url);
244
+ const pathname = urlObj.pathname;
245
+ const filename = pathname.substring(pathname.lastIndexOf("/") + 1);
246
+ return filename || null;
247
+ }
248
+ catch {
249
+ return null;
250
+ }
251
+ }
252
+ sleep(ms) {
253
+ return new Promise((resolve) => setTimeout(resolve, ms));
254
+ }
255
+ handleVideoUploadError(error, defaultMessage) {
256
+ if (error instanceof common_1.ZaloSDKError) {
257
+ return error;
258
+ }
259
+ if (error.response?.data) {
260
+ const errorData = error.response.data;
261
+ return new common_1.ZaloSDKError(`${defaultMessage}: ${errorData.message || errorData.error || "Unknown error"}`, errorData.error || -1, errorData);
262
+ }
263
+ return new common_1.ZaloSDKError(`${defaultMessage}: ${error.message || "Unknown error"}`, -1, error);
264
+ }
265
+ }
266
+ exports.VideoUploadService = VideoUploadService;
267
+ //# sourceMappingURL=video-upload.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-upload.service.js","sourceRoot":"","sources":["../../src/services/video-upload.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ import { ZaloClient } from "../clients/zalo-client";
2
+ import { ZNSMessage, ZNSSendResult, ZNSTemplate, ZNSTemplateList, ZNSCreateTemplateRequest, ZNSUpdateTemplateRequest, ZNSUploadImageResult, ZNSHashPhoneMessage, ZNSDevModeMessage, ZNSRsaMessage, ZNSJourneyMessage, ZNSMessageStatusInfo, ZNSQuotaInfo } from "../types/zns";
3
+ /**
4
+ * Service for Zalo Notification Service (ZNS)
5
+ *
6
+ * Requirements for using ZNS API:
7
+ * - Official Account must be approved and have ZNS sending permission
8
+ * - Valid Official Account access token
9
+ * - ZNS template must be approved before use
10
+ * - Recipient phone number must be in correct format and valid
11
+ * - Template data must match defined parameters
12
+ * - Comply with message quantity limits according to service package
13
+ *
14
+ * Reference: https://developers.zalo.me/docs/zalo-notification-service/
15
+ */
16
+ export declare class ZNSService {
17
+ private readonly client;
18
+ private readonly znsApiUrl;
19
+ private readonly templateApiUrl;
20
+ constructor(client: ZaloClient);
21
+ /**
22
+ * Send ZNS message
23
+ * @param accessToken OA access token
24
+ * @param message ZNS message data
25
+ * @returns Send result
26
+ */
27
+ sendMessage(accessToken: string, message: ZNSMessage): Promise<ZNSSendResult>;
28
+ /**
29
+ * Send ZNS message with phone hash
30
+ * @param accessToken OA access token
31
+ * @param message ZNS message with hashed phone
32
+ * @returns Send result
33
+ */
34
+ sendHashPhoneMessage(accessToken: string, message: ZNSHashPhoneMessage): Promise<ZNSSendResult>;
35
+ /**
36
+ * Send ZNS message in development mode
37
+ * @param accessToken OA access token
38
+ * @param message ZNS dev mode message
39
+ * @returns Send result
40
+ */
41
+ sendDevModeMessage(accessToken: string, message: ZNSDevModeMessage): Promise<ZNSSendResult>;
42
+ /**
43
+ * Send ZNS message with RSA encryption
44
+ * @param accessToken OA access token
45
+ * @param message ZNS RSA message
46
+ * @returns Send result
47
+ */
48
+ sendRsaMessage(accessToken: string, message: ZNSRsaMessage): Promise<ZNSSendResult>;
49
+ /**
50
+ * Send ZNS journey message
51
+ * @param accessToken OA access token
52
+ * @param message ZNS journey message
53
+ * @returns Send result
54
+ */
55
+ sendJourneyMessage(accessToken: string, message: ZNSJourneyMessage): Promise<ZNSSendResult>;
56
+ /**
57
+ * Get ZNS message status
58
+ * @param accessToken OA access token
59
+ * @param messageId Message ID
60
+ * @returns Message status info
61
+ */
62
+ getMessageStatus(accessToken: string, messageId: string): Promise<ZNSMessageStatusInfo>;
63
+ /**
64
+ * Get ZNS quota information
65
+ * @param accessToken OA access token
66
+ * @returns Quota information
67
+ */
68
+ getQuotaInfo(accessToken: string): Promise<ZNSQuotaInfo>;
69
+ /**
70
+ * Get ZNS template list
71
+ * @param accessToken OA access token
72
+ * @param offset Offset for pagination
73
+ * @param limit Limit for pagination
74
+ * @returns Template list
75
+ */
76
+ getTemplateList(accessToken: string, offset?: number, limit?: number): Promise<ZNSTemplateList>;
77
+ /**
78
+ * Get ZNS template details
79
+ * @param accessToken OA access token
80
+ * @param templateId Template ID
81
+ * @returns Template details
82
+ */
83
+ getTemplateDetails(accessToken: string, templateId: string): Promise<ZNSTemplate>;
84
+ /**
85
+ * Create ZNS template
86
+ * @param accessToken OA access token
87
+ * @param templateData Template creation data
88
+ * @returns Created template
89
+ */
90
+ createTemplate(accessToken: string, templateData: ZNSCreateTemplateRequest): Promise<ZNSTemplate>;
91
+ /**
92
+ * Update ZNS template
93
+ * @param accessToken OA access token
94
+ * @param templateData Template update data
95
+ * @returns Updated template
96
+ */
97
+ updateTemplate(accessToken: string, templateData: ZNSUpdateTemplateRequest): Promise<ZNSTemplate>;
98
+ /**
99
+ * Delete ZNS template
100
+ * @param accessToken OA access token
101
+ * @param templateId Template ID
102
+ * @returns Deletion result
103
+ */
104
+ deleteTemplate(accessToken: string, templateId: string): Promise<{
105
+ success: boolean;
106
+ }>;
107
+ /**
108
+ * Upload image for ZNS template
109
+ * @param accessToken OA access token
110
+ * @param imageFile Image file
111
+ * @returns Upload result
112
+ */
113
+ uploadImage(accessToken: string, imageFile: Buffer | NodeJS.ReadableStream, filename?: string): Promise<ZNSUploadImageResult>;
114
+ private handleZNSError;
115
+ }
116
+ //# sourceMappingURL=zns.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zns.service.d.ts","sourceRoot":"","sources":["../../src/services/zns.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EACL,UAAU,EACV,aAAa,EACb,WAAW,EACX,eAAe,EACf,wBAAwB,EACxB,wBAAwB,EACxB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACb,MAAM,cAAc,CAAC;AAEtB;;;;;;;;;;;;GAYG;AACH,qBAAa,UAAU;IAIT,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8C;IACxE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+C;gBAEjD,MAAM,EAAE,UAAU;IAE/C;;;;;OAKG;IACG,WAAW,CACf,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,aAAa,CAAC;IAczB;;;;;OAKG;IACG,oBAAoB,CACxB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC;IAczB;;;;;OAKG;IACG,kBAAkB,CACtB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,aAAa,CAAC;IAczB;;;;;OAKG;IACG,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,aAAa,CAAC;IAczB;;;;;OAKG;IACG,kBAAkB,CACtB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,aAAa,CAAC;IAczB;;;;;OAKG;IACG,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,oBAAoB,CAAC;IAgBhC;;;;OAIG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAa9D;;;;;;OAMG;IACG,eAAe,CACnB,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,MAAU,EAClB,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,eAAe,CAAC;IAiB3B;;;;;OAKG;IACG,kBAAkB,CACtB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC;IAgBvB;;;;;OAKG;IACG,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,wBAAwB,GACrC,OAAO,CAAC,WAAW,CAAC;IAcvB;;;;;OAKG;IACG,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,wBAAwB,GACrC,OAAO,CAAC,WAAW,CAAC;IAcvB;;;;;OAKG;IACG,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAchC;;;;;OAKG;IACG,WAAW,CACf,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,cAAc,EACzC,QAAQ,GAAE,MAAoB,GAC7B,OAAO,CAAC,oBAAoB,CAAC;IAehC,OAAO,CAAC,cAAc;CAWvB"}