fix: #15474 retrieve zoom usersettings and update zoom integration (#15489)

* retrieve zoom usersettings and update

* update to filter response

* updated zoomUserSettingsSchema

* abstract to new function, log error

---------

Co-authored-by: Peer Richelsen <peeroke@gmail.com>
Co-authored-by: Keith Williams <keithwillcode@gmail.com>
Co-authored-by: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com>
This commit is contained in:
authored and GitHub committed 2024-08-09 08:19:31 +00:00
1 parent da5df7164a
commit a2998b6c84
1 file changed
+35 -5
@@ -59,6 +59,22 @@ export const zoomMeetingsSchema = z.object({
),
});
export type ZoomUserSettings = z.infer<typeof zoomUserSettingsSchema>;
/** @link https://developers.zoom.us/docs/api/rest/reference/user/methods/#operation/userSettings */
export const zoomUserSettingsSchema = z.object({
recording: z.object({
auto_recording: z.string(),
}),
schedule_meeting: z.object({
default_password_for_scheduled_meetings: z.string(),
}),
});
// https://developers.zoom.us/docs/api/rest/reference/user/methods/#operation/userSettings
// append comma seperated settings here, to retrieve only these specific settings
const settingsApiFilterResp = "default_password_for_scheduled_meetings,auto_recording";
type ZoomRecurrence = {
end_date_time?: string;
type: 1 | 2 | 3;
@@ -71,7 +87,20 @@ type ZoomRecurrence = {
const ZoomVideoApiAdapter = (credential: CredentialPayload): VideoApiAdapter => {
const tokenResponse = getTokenObjectFromCredential(credential);
const translateEvent = (event: CalendarEvent) => {
const getUserSettings = async () => {
let userSettings: ZoomUserSettings | undefined;
try {
const responseBody = await fetchZoomApi(
`users/me/settings?custom_query_fields=${settingsApiFilterResp}`
);
userSettings = zoomUserSettingsSchema.parse(responseBody);
} catch (err) {
log.error("Failed to retrieve zoom user settings", safeStringify(err));
}
return userSettings;
};
const translateEvent = async (event: CalendarEvent) => {
const getRecurrence = ({
recurringEvent,
startTime,
@@ -122,6 +151,7 @@ const ZoomVideoApiAdapter = (credential: CredentialPayload): VideoApiAdapter =>
};
};
const userSettings = await getUserSettings();
const recurrence = getRecurrence(event);
// Documentation at: https://marketplace.zoom.us/docs/api-reference/zoom-api/meetings/meetingcreate
return {
@@ -131,7 +161,7 @@ const ZoomVideoApiAdapter = (credential: CredentialPayload): VideoApiAdapter =>
duration: (new Date(event.endTime).getTime() - new Date(event.startTime).getTime()) / 60000,
//schedule_for: "string", TODO: Used when scheduling the meeting for someone else (needed?)
timezone: event.organizer.timeZone,
//password: "string", TODO: Should we use a password? Maybe generate a random one?
password: userSettings?.schedule_meeting?.default_password_for_scheduled_meetings ?? undefined,
agenda: event.description,
settings: {
host_video: true,
@@ -144,7 +174,7 @@ const ZoomVideoApiAdapter = (credential: CredentialPayload): VideoApiAdapter =>
use_pmi: false,
approval_type: 2,
audio: "both",
auto_recording: "none",
auto_recording: userSettings?.recording?.auto_recording || "none",
enforce_login: false,
registrants_email_notification: true,
},
@@ -263,7 +293,7 @@ const ZoomVideoApiAdapter = (credential: CredentialPayload): VideoApiAdapter =>
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(translateEvent(event)),
body: JSON.stringify(await translateEvent(event)),
});
const result = zoomEventResultSchema.parse(response);
@@ -300,7 +330,7 @@ const ZoomVideoApiAdapter = (credential: CredentialPayload): VideoApiAdapter =>
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(translateEvent(event)),
body: JSON.stringify(await translateEvent(event)),
});
return Promise.resolve({