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.
- package/docs/ECatCloudRecording.js.html +74 -27
- package/docs/ECatGroup.js.html +207 -0
- package/docs/ECatMeeting.js.html +76 -11
- package/docs/ECatUser.js.html +7 -10
- package/docs/ECatWebinar.js.html +6 -5
- package/docs/api.cloudRecording.html +371 -48
- package/docs/api.group.html +367 -0
- package/docs/api.meeting.html +437 -15
- package/docs/api.user.html +10 -10
- package/docs/api.webinar.html +5 -5
- package/docs/index.html +1 -1
- package/lib/endpoints/ECatCloudRecording.d.ts +33 -9
- package/lib/endpoints/ECatCloudRecording.js +73 -26
- package/lib/endpoints/ECatCloudRecording.js.map +1 -1
- package/lib/endpoints/ECatGroup.d.ts +39 -0
- package/lib/endpoints/ECatGroup.js +142 -0
- package/lib/endpoints/ECatGroup.js.map +1 -0
- package/lib/endpoints/ECatMeeting.d.ts +40 -10
- package/lib/endpoints/ECatMeeting.js +75 -10
- package/lib/endpoints/ECatMeeting.js.map +1 -1
- package/lib/endpoints/ECatUser.d.ts +5 -5
- package/lib/endpoints/ECatUser.js +6 -9
- package/lib/endpoints/ECatUser.js.map +1 -1
- package/lib/endpoints/ECatWebinar.d.ts +4 -4
- package/lib/endpoints/ECatWebinar.js +5 -4
- package/lib/endpoints/ECatWebinar.js.map +1 -1
- package/lib/index.d.ts +22 -0
- package/lib/index.js +19 -0
- package/lib/index.js.map +1 -1
- package/lib/shared/helpers/genVisitEndpoint.js +60 -17
- package/lib/shared/helpers/genVisitEndpoint.js.map +1 -1
- package/lib/shared/types/VisitEndpointFunc.d.ts +2 -1
- package/lib/types/ZoomAPI.d.ts +2 -0
- package/lib/types/ZoomAPI.js.map +1 -1
- package/lib/types/ZoomGroup.d.ts +10 -0
- package/lib/types/ZoomGroup.js +3 -0
- package/lib/types/ZoomGroup.js.map +1 -0
- package/lib/types/ZoomGroupMember.d.ts +12 -0
- package/lib/types/ZoomGroupMember.js +3 -0
- package/lib/types/ZoomGroupMember.js.map +1 -0
- package/lib/types/ZoomMeetingRecordings.d.ts +1 -0
- package/lib/types/ZoomMeetingTranscript.d.ts +17 -0
- package/lib/types/ZoomMeetingTranscript.js +3 -0
- package/lib/types/ZoomMeetingTranscript.js.map +1 -0
- package/lib/types/ZoomPastMeetingDetails.d.ts +22 -0
- package/lib/types/ZoomPastMeetingDetails.js +3 -0
- package/lib/types/ZoomPastMeetingDetails.js.map +1 -0
- package/lib/types/ZoomPastMeetingParticipant.d.ts +18 -0
- package/lib/types/ZoomPastMeetingParticipant.js +3 -0
- package/lib/types/ZoomPastMeetingParticipant.js.map +1 -0
- package/lib/types/ZoomRecordingInAccount.d.ts +22 -0
- package/lib/types/ZoomRecordingInAccount.js +3 -0
- package/lib/types/ZoomRecordingInAccount.js.map +1 -0
- package/package.json +2 -2
- package/src/endpoints/ECatCloudRecording.ts +86 -30
- package/src/endpoints/ECatGroup.ts +89 -0
- package/src/endpoints/ECatMeeting.ts +81 -10
- package/src/endpoints/ECatUser.ts +6 -9
- package/src/endpoints/ECatWebinar.ts +5 -4
- package/src/index.ts +53 -0
- package/src/shared/helpers/genVisitEndpoint.ts +123 -79
- package/src/shared/types/VisitEndpointFunc.ts +4 -2
- package/src/types/ZoomAPI.ts +2 -0
- package/src/types/ZoomGroup.ts +14 -0
- package/src/types/ZoomGroupMember.ts +20 -0
- package/src/types/ZoomMeetingRecordings.ts +2 -0
- package/src/types/ZoomMeetingTranscript.ts +28 -0
- package/src/types/ZoomPastMeetingDetails.ts +38 -0
- package/src/types/ZoomPastMeetingParticipant.ts +30 -0
- 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
|
|
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
|
-
|
|
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
|
-
|
|
60
|
+
itemKey,
|
|
61
|
+
onNewPage,
|
|
56
62
|
} = opts;
|
|
57
63
|
const method = (opts.method ?? 'GET');
|
|
58
64
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
const
|
|
73
|
-
|
|
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
|
-
|
|
77
|
-
const rateLimitType = (
|
|
78
|
-
headers[rateLimitTypeHeader]
|
|
79
|
-
&& headers[rateLimitTypeHeader].toLowerCase()
|
|
80
|
-
);
|
|
88
|
+
/* ----------- Rate Error ----------- */
|
|
81
89
|
|
|
82
|
-
if (
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
135
|
-
const errorCode = `ZOOM${status}${body.code ? `-${body.code}` : ''}`;
|
|
163
|
+
/* ----------- Postprocess ---------- */
|
|
136
164
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
code: errorCode,
|
|
140
|
-
});
|
|
141
|
-
}
|
|
165
|
+
// Extract results
|
|
166
|
+
let results = itemKey ? body[itemKey] : body;
|
|
142
167
|
|
|
143
|
-
|
|
168
|
+
// Update next page token
|
|
169
|
+
nextPageToken = body.next_page_token;
|
|
170
|
+
if (nextPageToken) {
|
|
171
|
+
isPaginated = true;
|
|
172
|
+
}
|
|
144
173
|
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
26
|
-
|
|
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
|
);
|
package/src/types/ZoomAPI.ts
CHANGED
|
@@ -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;
|