import { isConfirmed, isDryRun, normalizeUserLocator, pickAuthInput, request } from '../core.ts' import { asRecord, buildMeetingBody, slimMeeting } from '../shape.ts' /** * Create a Zoom meeting. * * Pass `dryRun: true` to preview the request. Live creates require `confirm: true`. * Do not create a live meeting from a smoke test. * * @example * import createZoomMeeting from 'kody:@kody/zoom/meetings/create' * const preview = await createZoomMeeting({ * topic: 'Example meeting', * type: 2, * start_time: '2030-01-15T17:00:00', * duration: 30, * timezone: 'UTC', * dryRun: true, * }) */ export default async function createZoomMeeting(params: Record = {}) { const auth = pickAuthInput(params) const { userId } = normalizeUserLocator(params) const body = buildMeetingBody(params) if (!body.topic || typeof body.topic !== 'string') { throw new Error('topic is required to create a meeting.') } if (isDryRun(params)) { return { dryRun: true, wouldCreate: true, userId, path: `/users/${userId}/meetings`, body, auth, } } if (!isConfirmed(params)) { throw new Error( `Creating a meeting for ${userId} requires dryRun: true (preview) or confirm: true (live write).`, ) } const response = await request>({ ...auth, method: 'POST', path: `/users/${userId}/meetings`, body, throwOnError: true, confirm: true, }) return { ...slimMeeting(asRecord(response.data)), auth: response.auth, } }