zaccl 3.0.17 → 4.0.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 (70) hide show
  1. package/docs/ECatCloudRecording.js.html +74 -27
  2. package/docs/ECatGroup.js.html +207 -0
  3. package/docs/ECatMeeting.js.html +76 -11
  4. package/docs/ECatUser.js.html +7 -10
  5. package/docs/ECatWebinar.js.html +6 -5
  6. package/docs/api.cloudRecording.html +371 -48
  7. package/docs/api.group.html +367 -0
  8. package/docs/api.meeting.html +437 -15
  9. package/docs/api.user.html +10 -10
  10. package/docs/api.webinar.html +5 -5
  11. package/docs/index.html +1 -1
  12. package/lib/endpoints/ECatCloudRecording.d.ts +33 -9
  13. package/lib/endpoints/ECatCloudRecording.js +73 -26
  14. package/lib/endpoints/ECatCloudRecording.js.map +1 -1
  15. package/lib/endpoints/ECatGroup.d.ts +39 -0
  16. package/lib/endpoints/ECatGroup.js +142 -0
  17. package/lib/endpoints/ECatGroup.js.map +1 -0
  18. package/lib/endpoints/ECatMeeting.d.ts +40 -10
  19. package/lib/endpoints/ECatMeeting.js +75 -10
  20. package/lib/endpoints/ECatMeeting.js.map +1 -1
  21. package/lib/endpoints/ECatUser.d.ts +5 -5
  22. package/lib/endpoints/ECatUser.js +6 -9
  23. package/lib/endpoints/ECatUser.js.map +1 -1
  24. package/lib/endpoints/ECatWebinar.d.ts +4 -4
  25. package/lib/endpoints/ECatWebinar.js +5 -4
  26. package/lib/endpoints/ECatWebinar.js.map +1 -1
  27. package/lib/index.d.ts +22 -0
  28. package/lib/index.js +19 -0
  29. package/lib/index.js.map +1 -1
  30. package/lib/shared/helpers/genVisitEndpoint.js +60 -17
  31. package/lib/shared/helpers/genVisitEndpoint.js.map +1 -1
  32. package/lib/shared/types/VisitEndpointFunc.d.ts +2 -1
  33. package/lib/types/ZoomAPI.d.ts +2 -0
  34. package/lib/types/ZoomAPI.js.map +1 -1
  35. package/lib/types/ZoomGroup.d.ts +10 -0
  36. package/lib/types/ZoomGroup.js +3 -0
  37. package/lib/types/ZoomGroup.js.map +1 -0
  38. package/lib/types/ZoomGroupMember.d.ts +12 -0
  39. package/lib/types/ZoomGroupMember.js +3 -0
  40. package/lib/types/ZoomGroupMember.js.map +1 -0
  41. package/lib/types/ZoomMeetingRecordings.d.ts +1 -0
  42. package/lib/types/ZoomMeetingTranscript.d.ts +17 -0
  43. package/lib/types/ZoomMeetingTranscript.js +3 -0
  44. package/lib/types/ZoomMeetingTranscript.js.map +1 -0
  45. package/lib/types/ZoomPastMeetingDetails.d.ts +22 -0
  46. package/lib/types/ZoomPastMeetingDetails.js +3 -0
  47. package/lib/types/ZoomPastMeetingDetails.js.map +1 -0
  48. package/lib/types/ZoomPastMeetingParticipant.d.ts +18 -0
  49. package/lib/types/ZoomPastMeetingParticipant.js +3 -0
  50. package/lib/types/ZoomPastMeetingParticipant.js.map +1 -0
  51. package/lib/types/ZoomRecordingInAccount.d.ts +22 -0
  52. package/lib/types/ZoomRecordingInAccount.js +3 -0
  53. package/lib/types/ZoomRecordingInAccount.js.map +1 -0
  54. package/package.json +2 -2
  55. package/src/endpoints/ECatCloudRecording.ts +86 -30
  56. package/src/endpoints/ECatGroup.ts +89 -0
  57. package/src/endpoints/ECatMeeting.ts +81 -10
  58. package/src/endpoints/ECatUser.ts +6 -9
  59. package/src/endpoints/ECatWebinar.ts +5 -4
  60. package/src/index.ts +53 -0
  61. package/src/shared/helpers/genVisitEndpoint.ts +123 -79
  62. package/src/shared/types/VisitEndpointFunc.ts +4 -2
  63. package/src/types/ZoomAPI.ts +2 -0
  64. package/src/types/ZoomGroup.ts +14 -0
  65. package/src/types/ZoomGroupMember.ts +20 -0
  66. package/src/types/ZoomMeetingRecordings.ts +2 -0
  67. package/src/types/ZoomMeetingTranscript.ts +28 -0
  68. package/src/types/ZoomPastMeetingDetails.ts +38 -0
  69. package/src/types/ZoomPastMeetingParticipant.ts +30 -0
  70. package/src/types/ZoomRecordingInAccount.ts +38 -0
@@ -22,10 +22,13 @@ import ZoomPollStatus from '../types/ZoomPollStatus';
22
22
  import ZoomPollQuestion from '../types/ZoomPollQuestion';
23
23
  import ZoomMeetingDetails from '../types/ZoomMeetingDetails';
24
24
  import ZoomMeetingIdAndStartTime from '../types/ZoomMeetingIdAndStartTime';
25
+ import ZoomMeetingTranscript from '../types/ZoomMeetingTranscript';
26
+ import ZoomPastMeetingParticipant from '../types/ZoomPastMeetingParticipant';
27
+ import ZoomPastMeetingDetails from '../types/ZoomPastMeetingDetails';
25
28
 
26
29
  class ECatMeeting extends EndpointCategory {
27
30
  /**
28
- * Get info on a meeting
31
+ * Get info on a meeting (Light)
29
32
  * @author Gabe Abrams
30
33
  * @author Aryan Pandey
31
34
  * @instance
@@ -36,7 +39,7 @@ class ECatMeeting extends EndpointCategory {
36
39
  * @param [opts.occurrenceId] ID for the meeting occurrence
37
40
  * @param [opts.showAllOccurrences=false] if truthy,
38
41
  * retrieves all past occurrences
39
- * @returns Zoom meeting object {@link https://marketplace.zoom.us/docs/api-reference/zoom-api/meetings/meeting#responses}
42
+ * @returns Zoom meeting object
40
43
  */
41
44
  async get(
42
45
  opts: {
@@ -78,7 +81,7 @@ class ECatMeeting extends EndpointCategory {
78
81
  }
79
82
 
80
83
  /**
81
- * Create a new meeting
84
+ * Create a new meeting (Light)
82
85
  * @author Gabe Abrams
83
86
  * @author Aryan Pandey
84
87
  * @instance
@@ -110,7 +113,7 @@ class ECatMeeting extends EndpointCategory {
110
113
  }
111
114
 
112
115
  /**
113
- * Update a meeting
116
+ * Update a meeting (Light)
114
117
  * @author Gabe Abrams
115
118
  * @author Aryan Pandey
116
119
  * @instance
@@ -154,7 +157,7 @@ class ECatMeeting extends EndpointCategory {
154
157
  }
155
158
 
156
159
  /**
157
- * Delete a meeting
160
+ * Delete a meeting (Light)
158
161
  * @author Gabe Abrams
159
162
  * @author Aryan Pandey
160
163
  * @instance
@@ -212,7 +215,7 @@ class ECatMeeting extends EndpointCategory {
212
215
  }
213
216
 
214
217
  /**
215
- * Get a list of ended meeting instances
218
+ * Get a list of ended meeting instances (Medium)
216
219
  * @author Gabe Abrams
217
220
  * @author Aryan Pandey
218
221
  * @instance
@@ -234,11 +237,12 @@ class ECatMeeting extends EndpointCategory {
234
237
  errorMap: {
235
238
  404: `We could not find a meeting with the ID ${opts.meetingId}`,
236
239
  },
240
+ itemKey: 'meetings',
237
241
  });
238
242
  }
239
243
 
240
244
  /**
241
- * Get details of a past meeting instance
245
+ * Get details of a past meeting instance (Light)
242
246
  * @author Yuen Ler Chow
243
247
  * @instance
244
248
  * @memberof api.meeting
@@ -270,7 +274,7 @@ class ECatMeeting extends EndpointCategory {
270
274
  }
271
275
 
272
276
  /**
273
- * List past poll occurrences
277
+ * List past poll occurrences (Medium)
274
278
  * @author Yuen Ler Chow
275
279
  * @instance
276
280
  * @memberof api.meeting
@@ -394,7 +398,7 @@ class ECatMeeting extends EndpointCategory {
394
398
  }
395
399
 
396
400
  /**
397
- * Get poll info
401
+ * Get poll info (Light)
398
402
  * @author Yuen Ler Chow
399
403
  * @instance
400
404
  * @memberof api.meeting
@@ -554,7 +558,7 @@ class ECatMeeting extends EndpointCategory {
554
558
  * user is added as the only alt-host. This is because Zoom doesn't give us
555
559
  * enough information to determine which user is deactivated, and thus,
556
560
  * the only way to resolve the issue is to remove all previously existing
557
- * alt-hosts.
561
+ * alt-hosts. (Light)
558
562
  * @author Gabe Abrams
559
563
  * @author Aryan Pandey
560
564
  * @instance
@@ -631,6 +635,73 @@ class ECatMeeting extends EndpointCategory {
631
635
  // return updated meeting object
632
636
  return meetingObj;
633
637
  }
638
+
639
+ /**
640
+ * Get meeting transcript (Medium)
641
+ * @author Gabe Abrams
642
+ * @instance
643
+ * @memberof api.meeting
644
+ * @method getTranscript
645
+ * @param opts object containing all arguments
646
+ * @param opts.meetingId the Zoom ID of the meeting (or UUID of a past meeting instance)
647
+ * @returns meeting transcript
648
+ */
649
+ async getTranscript(
650
+ opts: {
651
+ meetingId: number,
652
+ },
653
+ ): Promise<ZoomMeetingTranscript> {
654
+ return this.visitEndpoint({
655
+ path: `/meetings/${opts.meetingId}/transcript`,
656
+ action: 'get the meeting transcript',
657
+ method: 'GET',
658
+ errorMap: {
659
+ 400: 'Invalid meeting ID',
660
+ 403: 'You do not have permission to access the transcript for this meeting',
661
+ 404: {
662
+ 3322: 'The meeting transcript does not exist',
663
+ },
664
+ },
665
+ });
666
+ }
667
+
668
+ /**
669
+ * Get list of participants in a past meeting (Medium)
670
+ * @author Gabe Abrams
671
+ * @instance
672
+ * @memberof api.meeting
673
+ * @method listPastMeetingParticipants
674
+ * @param opts object containing all arguments
675
+ * @param opts.meetingId the Zoom UUID of the past meeting instance
676
+ * @param [opts.onNewPage] callback function that is called when a new page of results is received.
677
+ * @returns list of past meeting participants
678
+ */
679
+ async listPastMeetingParticipants(
680
+ opts: {
681
+ meetingId: string,
682
+ onNewPage?: (participants: ZoomPastMeetingParticipant[]) => void,
683
+ },
684
+ ): Promise<ZoomPastMeetingParticipant[]> {
685
+ return this.visitEndpoint({
686
+ path: `/past_meetings/${opts.meetingId}/participants`,
687
+ action: 'get the list of participants in a past meeting',
688
+ method: 'GET',
689
+ params: {
690
+ page_size: 300, // max allowed page size
691
+ },
692
+ itemKey: 'participants',
693
+ onNewPage: opts.onNewPage,
694
+ errorMap: {
695
+ 400: {
696
+ 200: 'You need a paid account to access the participant list of a past meeting.',
697
+ 12702: 'You are not allowed to access information about meetings that occurred more than 1 year ago.',
698
+ },
699
+ 404: {
700
+ 3001: 'The meeting ID is invalid or the meeting has not ended.',
701
+ },
702
+ },
703
+ });
704
+ }
634
705
  }
635
706
 
636
707
  /*------------------------------------------------------------------------*/
@@ -12,7 +12,7 @@ import ZoomUser from '../types/ZoomUser';
12
12
 
13
13
  class ECatUser extends EndpointCategory {
14
14
  /**
15
- * Retrieve a user's ZAK token
15
+ * Retrieve a user's ZAK token (Light)
16
16
  * @author Aryan Pandey
17
17
  * @instance
18
18
  * @memberof api.user
@@ -33,21 +33,18 @@ class ECatUser extends EndpointCategory {
33
33
  params: {
34
34
  type: 'zak',
35
35
  },
36
+ itemKey: 'token',
36
37
  errorMap: {
37
38
  404: {
38
39
  1001: `We could not retrieve a token for Zoom user ${opts.userId} since this user does not exist`,
39
40
  },
40
41
  },
41
- postProcessor: (body) => {
42
- // extract zak token from the response object
43
- return body.token;
44
- },
45
42
  });
46
43
  }
47
44
 
48
45
  /**
49
46
  * (Re)activate a user and promote them to a "licensed" user (unless
50
- * dontPromoteToLicensed is true)
47
+ * dontPromoteToLicensed is true) (Light)
51
48
  * @author Gabe Abrams
52
49
  * @instance
53
50
  * @memberof api.user
@@ -98,7 +95,7 @@ class ECatUser extends EndpointCategory {
98
95
  }
99
96
 
100
97
  /**
101
- * Add a webinar license to the user of interest
98
+ * Add a webinar license to the user of interest (Medium)
102
99
  * @author Gabe Abrams
103
100
  * @instance
104
101
  * @memberof api.user
@@ -136,7 +133,7 @@ class ECatUser extends EndpointCategory {
136
133
  }
137
134
 
138
135
  /**
139
- * Get a user
136
+ * Get a user (Light)
140
137
  * @author Gabe Abrams
141
138
  * @instance
142
139
  * @memberof api.user
@@ -163,7 +160,7 @@ class ECatUser extends EndpointCategory {
163
160
  }
164
161
 
165
162
  /**
166
- * Promote a user to "licensed" type
163
+ * Promote a user to "licensed" type (Light)
167
164
  * @author Gabe Abrams
168
165
  * @instance
169
166
  * @memberof api.user
@@ -13,7 +13,7 @@ import ZoomWebinar from '../types/ZoomWebinar';
13
13
 
14
14
  class ECatWebinar extends EndpointCategory {
15
15
  /**
16
- * Get info on a Webinar
16
+ * Get info on a Webinar (Light)
17
17
  * @author Gabe Abrams
18
18
  * @instance
19
19
  * @memberof api.webinar
@@ -64,7 +64,7 @@ class ECatWebinar extends EndpointCategory {
64
64
  }
65
65
 
66
66
  /**
67
- * Create a webinar
67
+ * Create a webinar (Light)
68
68
  * @author Gabe Abrams
69
69
  * @instance
70
70
  * @memberof api.webinar
@@ -101,7 +101,7 @@ class ECatWebinar extends EndpointCategory {
101
101
  }
102
102
 
103
103
  /**
104
- * Add one panelist if not already in the list
104
+ * Add one panelist if not already in the list (Medium)
105
105
  * @author Gabe Abrams
106
106
  * @instance
107
107
  * @memberof api.webinar
@@ -144,7 +144,7 @@ class ECatWebinar extends EndpointCategory {
144
144
  }
145
145
 
146
146
  /**
147
- * Get a list of panelists for a webinar
147
+ * Get a list of panelists for a webinar (Medium)
148
148
  * @author Gabe Abrams
149
149
  * @instance
150
150
  * @memberof api.webinar
@@ -171,6 +171,7 @@ class ECatWebinar extends EndpointCategory {
171
171
  3001: `Webinar ${opts.webinarId} could not be found or has expired`,
172
172
  },
173
173
  },
174
+ itemKey: 'panelists',
174
175
  });
175
176
 
176
177
  // Just keep list of panelists
package/src/index.ts CHANGED
@@ -9,6 +9,7 @@ import ECatCloudRecording from './endpoints/ECatCloudRecording';
9
9
  import ECatMeeting from './endpoints/ECatMeeting';
10
10
  import ECatUser from './endpoints/ECatUser';
11
11
  import ECatWebinar from './endpoints/ECatWebinar';
12
+ import ECatGroup from './endpoints/ECatGroup';
12
13
 
13
14
  // Import shared types
14
15
  import ZoomAPIConfig from './types/ZoomAPIConfig';
@@ -17,6 +18,29 @@ import ZACCLError from './shared/classes/ZACCLError';
17
18
  import ErrorCode from './shared/types/ErrorCode';
18
19
  import ZoomAPIConfigType from './types/ZoomAPIConfigType';
19
20
 
21
+ // Import all Zoom types
22
+ import ZoomPanelist from './types/ZoomPanelist';
23
+ import ZoomPollInfo from './types/ZoomPollInfo';
24
+ import ZoomPollOccurrence from './types/ZoomPollOccurrence';
25
+ import ZoomFileType from './types/ZoomFileType';
26
+ import ZoomPollQuestion from './types/ZoomPollQuestion';
27
+ import ZoomPollQuestionAndAnswerType from './types/ZoomPollQuestionAndAnswerType';
28
+ import ZoomPollStatus from './types/ZoomPollStatus';
29
+ import ZoomLoginMethod from './types/ZoomLoginMethod';
30
+ import ZoomPollType from './types/ZoomPollType';
31
+ import ZoomRecordingFile from './types/ZoomRecordingFile';
32
+ import ZoomRecordingType from './types/ZoomRecordingType';
33
+ import ZoomMeetingIdAndStartTime from './types/ZoomMeetingIdAndStartTime';
34
+ import ZoomRecurrenceInfo from './types/ZoomRecurrenceInfo';
35
+ import ZoomMeetingOrWebinarType from './types/ZoomMeetingOrWebinarType';
36
+ import ZoomMeetingRecordings from './types/ZoomMeetingRecordings';
37
+ import ZoomUserAnswer from './types/ZoomUserAnswer';
38
+ import ZoomMeetingTranscript from './types/ZoomMeetingTranscript';
39
+ import ZoomUsersAnswersToQuestion from './types/ZoomUsersAnswersToQuestion';
40
+ import ZoomMeetingType from './types/ZoomMeetingType';
41
+ import ZoomWebinar from './types/ZoomWebinar';
42
+ import ZoomPastMeetingParticipant from './types/ZoomPastMeetingParticipant';
43
+
20
44
  // Import shared constants
21
45
  import DEFAULT_ZOOM_HOSTNAME from './shared/constants/DEFAULT_ZOOM_HOSTNAME';
22
46
 
@@ -137,9 +161,38 @@ const initZoomAPI = (
137
161
  api.meeting = new ECatMeeting(initPack);
138
162
  api.user = new ECatUser(initPack);
139
163
  api.webinar = new ECatWebinar(initPack);
164
+ api.group = new ECatGroup(initPack);
140
165
 
141
166
  // Return api instance
142
167
  return api;
143
168
  };
144
169
 
145
170
  export default initZoomAPI;
171
+
172
+ /*----------------------------------------*/
173
+ /* ---------------- Types --------------- */
174
+ /*----------------------------------------*/
175
+
176
+ export {
177
+ ZoomPanelist,
178
+ ZoomPollInfo,
179
+ ZoomPollOccurrence,
180
+ ZoomFileType,
181
+ ZoomPollQuestion,
182
+ ZoomPollQuestionAndAnswerType,
183
+ ZoomPollStatus,
184
+ ZoomLoginMethod,
185
+ ZoomPollType,
186
+ ZoomRecordingFile,
187
+ ZoomRecordingType,
188
+ ZoomMeetingIdAndStartTime,
189
+ ZoomRecurrenceInfo,
190
+ ZoomMeetingOrWebinarType,
191
+ ZoomMeetingRecordings,
192
+ ZoomUserAnswer,
193
+ ZoomMeetingTranscript,
194
+ ZoomUsersAnswersToQuestion,
195
+ ZoomMeetingType,
196
+ ZoomWebinar,
197
+ ZoomPastMeetingParticipant,
198
+ };
@@ -28,6 +28,10 @@ const genVisitEndpoint = (zoomAPIConfig: ZoomAPIConfig): VisitEndpointFunc => {
28
28
  * @param [opts.postProcessor] function that processes the response before
29
29
  * returning
30
30
  * @param [opts.params] Parameters/args/body to send with request
31
+ * @param [opts.onNewPage] callback function that is called when a
32
+ * new page of results is received
33
+ * @param [opts.itemKey] the key in the response body where the list of items can be found
34
+ * @param [opts.onNewPage] callback function that is called when a new page of results is received
31
35
  * @returns response body
32
36
  */
33
37
  return async (
@@ -44,7 +48,8 @@ const genVisitEndpoint = (zoomAPIConfig: ZoomAPIConfig): VisitEndpointFunc => {
44
48
  )
45
49
  },
46
50
  params?: { [k: string]: any },
47
- postProcessor?: (response: any) => any,
51
+ itemKey?: string,
52
+ onNewPage?: (page: any) => void,
48
53
  },
49
54
  ): Promise<any> => {
50
55
  const {
@@ -52,101 +57,140 @@ const genVisitEndpoint = (zoomAPIConfig: ZoomAPIConfig): VisitEndpointFunc => {
52
57
  params,
53
58
  action,
54
59
  errorMap,
55
- postProcessor,
60
+ itemKey,
61
+ onNewPage,
56
62
  } = opts;
57
63
  const method = (opts.method ?? 'GET');
58
64
 
59
- /* ---------- Send Request ---------- */
60
-
61
- const { status, headers, body } = await sendZoomRequest({
62
- path,
63
- method,
64
- params,
65
- zoomAPIConfig,
66
- });
67
-
68
- /* ----------- Rate Error ----------- */
69
-
70
- if (status === 429) {
71
- // Case-insensitive header lookup
72
- const [rateLimitTypeHeader] = Object.keys(headers).filter((header) => {
73
- return (header.toLowerCase() === 'x-ratelimit-type');
65
+ // Paging state
66
+ let nextPageToken: string | undefined = undefined;
67
+ let isFirstPage = true;
68
+ let isPaginated = false; // Inferred by responses, always starts false
69
+ const allItems: any[] = [];
70
+
71
+ // Fetch page by page
72
+ while (nextPageToken || isFirstPage) {
73
+ // Don't fetch another page unless we get a token
74
+ isFirstPage = false;
75
+
76
+ /* ---------- Send Request ---------- */
77
+
78
+ const { status, headers, body } = await sendZoomRequest({
79
+ path,
80
+ method,
81
+ params: {
82
+ ...params,
83
+ next_page_token: nextPageToken,
84
+ },
85
+ zoomAPIConfig,
74
86
  });
75
87
 
76
- // Case-insensitive limit type lookup
77
- const rateLimitType = (
78
- headers[rateLimitTypeHeader]
79
- && headers[rateLimitTypeHeader].toLowerCase()
80
- );
88
+ /* ----------- Rate Error ----------- */
81
89
 
82
- if (rateLimitType === ThrottleHeader.DailyLimitHeader) {
83
- // Daily limit
84
- throw new ZACCLError({
85
- message: 'Zoom is very busy today. Please try this operation again tomorrow.',
86
- code: ErrorCode.DailyLimitError,
87
- });
88
- } else if (rateLimitType === ThrottleHeader.RateLimitHeader) {
89
- // Rate limit
90
- throw new ZACCLError({
91
- message: 'Zoom is very busy right now. Please try this operation again later.',
92
- code: ErrorCode.RateLimitError,
93
- });
94
- } else {
95
- // Unknown rate limit
96
- throw new ZACCLError({
97
- message: 'Zoom is very busy right now. Please try this operation again.',
98
- code: ErrorCode.UnknownLimitError,
90
+ if (status === 429) {
91
+ // Case-insensitive header lookup
92
+ const [rateLimitTypeHeader] = Object.keys(headers).filter((header) => {
93
+ return (header.toLowerCase() === 'x-ratelimit-type');
99
94
  });
95
+
96
+ // Case-insensitive limit type lookup
97
+ const rateLimitType = (
98
+ headers[rateLimitTypeHeader]
99
+ && headers[rateLimitTypeHeader].toLowerCase()
100
+ );
101
+
102
+ if (rateLimitType === ThrottleHeader.DailyLimitHeader) {
103
+ // Daily limit
104
+ throw new ZACCLError({
105
+ message: 'Zoom is very busy today. Please try this operation again tomorrow.',
106
+ code: ErrorCode.DailyLimitError,
107
+ });
108
+ } else if (rateLimitType === ThrottleHeader.RateLimitHeader) {
109
+ // Rate limit
110
+ throw new ZACCLError({
111
+ message: 'Zoom is very busy right now. Please try this operation again later.',
112
+ code: ErrorCode.RateLimitError,
113
+ });
114
+ } else {
115
+ // Unknown rate limit
116
+ throw new ZACCLError({
117
+ message: 'Zoom is very busy right now. Please try this operation again.',
118
+ code: ErrorCode.UnknownLimitError,
119
+ });
120
+ }
100
121
  }
101
- }
102
-
103
- /* -------- Custom Error Code ------- */
104
-
105
- if (status < 200 || status >= 300) {
106
- // A Zoom error occurred
107
-
108
- // Check status to see if its in the error map
109
- let zoomErrorMessage = 'An unknown Zoom error occurred.';
110
- if (errorMap[status]) {
111
- if (typeof errorMap[status] === 'string') {
112
- // Found the error message
113
- zoomErrorMessage = (errorMap[status] as string);
114
- } else if (body.code) {
115
- // Check for nested error message
116
- if (typeof errorMap[status][body.code] === 'string') {
117
- // Found nested error message
118
- zoomErrorMessage = errorMap[status][body.code];
119
- } else if (body.message) {
120
- // errorMap[status][code] did not return err message
121
- // so we check body
122
- if (typeof body.message === 'string') {
123
- zoomErrorMessage = body.message;
122
+
123
+ /* -------- Custom Error Code ------- */
124
+
125
+ if (status < 200 || status >= 300) {
126
+ // A Zoom error occurred
127
+
128
+ // Check status to see if its in the error map
129
+ let zoomErrorMessage = 'An unknown Zoom error occurred.';
130
+ if (errorMap[status]) {
131
+ if (typeof errorMap[status] === 'string') {
132
+ // Found the error message
133
+ zoomErrorMessage = (errorMap[status] as string);
134
+ } else if (body.code) {
135
+ // Check for nested error message
136
+ if (typeof errorMap[status][body.code] === 'string') {
137
+ // Found nested error message
138
+ zoomErrorMessage = errorMap[status][body.code];
139
+ } else if (body.message) {
140
+ // errorMap[status][code] did not return err message
141
+ // so we check body
142
+ if (typeof body.message === 'string') {
143
+ zoomErrorMessage = body.message;
144
+ }
124
145
  }
125
146
  }
147
+ } else if (body.message) {
148
+ // Error message not in the error map so check body
149
+ if (typeof body.message === 'string') {
150
+ zoomErrorMessage = body.message;
151
+ }
126
152
  }
127
- } else if (body.message) {
128
- // Error message not in the error map so check body
129
- if (typeof body.message === 'string') {
130
- zoomErrorMessage = body.message;
131
- }
153
+
154
+ const errorMessage = `We couldn't ${action} because an error occurred: ${zoomErrorMessage}`;
155
+ const errorCode = `ZOOM${status}${body.code ? `-${body.code}` : ''}`;
156
+
157
+ throw new ZACCLError({
158
+ message: errorMessage,
159
+ code: errorCode,
160
+ });
132
161
  }
133
162
 
134
- const errorMessage = `We couldn't ${action} because an error occurred: ${zoomErrorMessage}`;
135
- const errorCode = `ZOOM${status}${body.code ? `-${body.code}` : ''}`;
163
+ /* ----------- Postprocess ---------- */
136
164
 
137
- throw new ZACCLError({
138
- message: errorMessage,
139
- code: errorCode,
140
- });
141
- }
165
+ // Extract results
166
+ let results = itemKey ? body[itemKey] : body;
142
167
 
143
- /* ----- Post-process and Return ---- */
168
+ // Update next page token
169
+ nextPageToken = body.next_page_token;
170
+ if (nextPageToken) {
171
+ isPaginated = true;
172
+ }
144
173
 
145
- if (postProcessor) {
146
- return postProcessor(body);
147
- }
174
+ // End if not paginated
175
+ if (!isPaginated) {
176
+ return results;
177
+ }
178
+
179
+ /* --------- Paging Handling -------- */
180
+
181
+ // Add items to allItems if paginated
182
+ if (Array.isArray(results)) {
183
+ allItems.push(...results);
184
+ }
185
+
186
+ // Call onNewPage callback if it exists
187
+ if (onNewPage) {
188
+ onNewPage(results);
189
+ }
190
+ };
148
191
 
149
- return body;
192
+ // Return all items (if we got here, response is paginated)
193
+ return allItems;
150
194
  };
151
195
  };
152
196
 
@@ -22,8 +22,10 @@ type VisitEndpointFunc = (
22
22
  },
23
23
  // Parameters/args/body to send with request
24
24
  params?: { [k: string]: any },
25
- // Function that processes the response before returning
26
- postProcessor?: (response: any) => any,
25
+ // The key in the response body where the list of items can be found (for paginated endpoints)
26
+ itemKey?: string,
27
+ // Callback function that is called when a new page of results is received (for paginated endpoints)
28
+ onNewPage?: (items: any[]) => void,
27
29
  },
28
30
  ) => Promise<any>
29
31
  );
@@ -1,4 +1,5 @@
1
1
  import ECatCloudRecording from '../endpoints/ECatCloudRecording';
2
+ import ECatGroup from '../endpoints/ECatGroup';
2
3
  import ECatMeeting from '../endpoints/ECatMeeting';
3
4
  import ECatUser from '../endpoints/ECatUser';
4
5
  import ECatWebinar from '../endpoints/ECatWebinar';
@@ -12,6 +13,7 @@ interface ZoomAPI {
12
13
  meeting: ECatMeeting,
13
14
  user: ECatUser,
14
15
  webinar: ECatWebinar,
16
+ group: ECatGroup,
15
17
  };
16
18
 
17
19
  export default ZoomAPI;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Zoom user group
3
+ * @author Gabe Abrams
4
+ */
5
+ type ZoomGroup = {
6
+ // Unique id for the group
7
+ id: string,
8
+ // Name of the group
9
+ name: string,
10
+ // Total number of members in the group
11
+ total_members: number,
12
+ };
13
+
14
+ export default ZoomGroup;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * A single group member within a Zoom group
3
+ * @author Gabe Abrams
4
+ */
5
+ type ZoomGroupMember = {
6
+ // User's email address
7
+ email: string,
8
+ // First name of the user
9
+ first_name: string,
10
+ // Unique Identifier of the user
11
+ id: string,
12
+ // Last name of the user
13
+ last_name: string,
14
+ // User type:
15
+ // 1 - Basic
16
+ // 2 - Licensed
17
+ type: (1 | 2),
18
+ };
19
+
20
+ export default ZoomGroupMember;
@@ -32,6 +32,8 @@ type ZoomMeetingRecordings = {
32
32
  uuid: string,
33
33
  // Recording file List
34
34
  recording_files?: ZoomRecordingFile[],
35
+ // JWT download access token that can be used to download the recording files. Only included if requested
36
+ download_access_token?: string,
35
37
  };
36
38
 
37
39
  export default ZoomMeetingRecordings;