import {z} from 'zod' export type GetApiV3GrantsGrantIdEventsImportArgs = {limit?: number | undefined, page_token?: string | undefined, calendar_id: string, start?: number | undefined, end?: number | undefined, select?: string | undefined}; export type GetApiV3GrantsGrantIdEventsImportOptions = {baseUrl?: string | undefined, NYLASAPIKEY?: string | undefined, fetch?: typeof fetch | undefined}; export const eventCalendarId = z.string().nullable(); export const eventConferencingResponse = z.object({provider: z.enum(["Google Meet", "GoToMeeting", "Microsoft Teams", "Teams for Business", "Skype for Business", "Skype for Consumer", "WebEx", "Zoom Meeting", "unknown"]).optional(), details: z.object({url: z.string().optional(), meeting_code: z.string().optional(), password: z.string().optional(), pin: z.string().optional(), phone: z.array(z.string()).optional()}).optional(), autocreate: z.object({}).optional()}); export const eventCreatedAt = z.number().int().nullable(); export const grantId = z.string(); export const eventHtmlLink = z.string(); export const eventIcalUid = z.string().nullable(); export const eventId = z.string().min(1); export const eventIsOwner = z.boolean(); export const metadata = z.record(z.string(), z.string().max(500)); export const object = z.string(); export const organizer = z.object({name: z.string().optional(), email: z.string().optional()}); export const eventParticipants = z.array(z.object({comment: z.string().optional(), email: z.string().optional(), name: z.string().optional(), phone_number: z.string().optional(), status: z.enum(["yes", "no", "maybe", "noreply"]).optional()})); export const eventResources = z.object({email: z.string(), name: z.string().optional()}); export const eventReadOnly = z.boolean(); export const eventReminders = z.object({use_default: z.boolean().nullable().optional(), overrides: z.array(z.object({reminder_minutes: z.number().int().optional(), reminder_method: z.enum(["popup", "email", "display", "sound"]).optional()})).nullable().optional()}); export const eventRecurrence = z.array(z.string()); export const eventStatus = z.enum(["confirmed", "cancelled", "maybe"]); export const eventUpdatedAt = z.number().int().nullable(); export const eventVisibility = z.enum(["default", "private", "public"]).nullable(); export const eventWhenResponse = z.union([z.object({start_time: z.number().int().optional(), end_time: z.number().int().optional(), start_timezone: z.string().min(1).nullable().optional(), end_timezone: z.string().min(1).nullable().optional()}), z.object({date: z.string().optional()}), z.object({start_date: z.string().min(1).optional(), end_date: z.string().optional()})]).nullable(); export const onJoinMessage = z.object({type: z.literal("text"), content: z.string().min(1).max(1000), send_after_ms: z.number().int().gte(1).lte(600000)}); export const onParticipantJoinMessage = z.object({type: z.literal("text"), content: z.string().min(1).max(1000), debounce_ms: z.number().int().gte(1).lte(600000)}); export const messages = z.object({on_join: z.array(onJoinMessage).optional(), on_participant_join: z.array(onParticipantJoinMessage).optional()}); export const meetingSettings = z.object({action_items: z.boolean().optional(), action_items_settings: z.object({custom_instructions: z.string().optional()}).optional(), audio_recording: z.boolean().optional(), leave_after_silence_seconds: z.number().int().gte(10).lte(3600).optional(), summary: z.boolean().optional(), summary_settings: z.object({custom_instructions: z.string().optional()}).optional(), transcription: z.boolean().optional(), video_recording: z.boolean().optional(), transcription_settings: z.object({expected_languages: z.array(z.string()).optional(), fallback_language: z.string().optional(), keywords: z.array(z.string().max(200)).optional(), use_speaker_names_as_keywords: z.boolean().optional()}).nullable().optional(), messages: messages.optional()}); export const eventSync = z.object({id: z.string().optional(), meeting_settings: meetingSettings.optional(), name: z.string().optional()}); export const getApiV3GrantsGrantIdEventsImportResponse = z.object({request_id: z.string().optional(), data: z.array(z.object({busy: z.boolean().optional(), calendar_id: eventCalendarId.optional(), conferencing: eventConferencingResponse.optional(), created_at: eventCreatedAt.optional(), description: z.string().nullable().optional(), text_description: z.string().nullable().optional(), hide_participants: z.boolean().optional(), grant_id: grantId.optional(), html_link: eventHtmlLink.optional(), ical_uid: eventIcalUid.optional(), id: eventId.optional(), is_owner: eventIsOwner.optional(), location: z.string().nullable().optional(), master_event_id: z.string().nullable().optional(), metadata: metadata.optional(), object: object.optional(), organizer: organizer.optional(), participants: eventParticipants.optional(), resources: z.array(eventResources).optional(), read_only: eventReadOnly.optional(), reminders: eventReminders.optional(), recurrence: eventRecurrence.optional(), status: eventStatus.optional(), title: z.string().min(1).max(1024).optional(), updated_at: eventUpdatedAt.optional(), visibility: eventVisibility.optional(), when: eventWhenResponse.optional(), original_start_time: z.number().int().optional(), notetaker: eventSync.optional()})).optional(), next_cursor: z.string().nullable().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Import events * * GET /v3/grants/{grant_id}/events/import * * Also accepts auth: ACCESS_TOKEN */ export const getApiV3GrantsGrantIdEventsImport = async (args: GetApiV3GrantsGrantIdEventsImportArgs, options?: GetApiV3GrantsGrantIdEventsImportOptions) => { const {baseUrl = "https://api.us.nylas.com", fetch: fetchFn = fetch, NYLASAPIKEY} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.limit != null) query.append("limit", String(args.limit)) if (args.page_token != null) query.append("page_token", String(args.page_token)) if (args.calendar_id != null) query.append("calendar_id", String(args.calendar_id)) if (args.start != null) query.append("start", String(args.start)) if (args.end != null) query.append("end", String(args.end)) if (args.select != null) query.append("select", String(args.select)) if (NYLASAPIKEY !== undefined) headers.set('authorization', `Bearer ${NYLASAPIKEY}`) const url = `${baseUrl.replace(/\/+$/, '')}/v3/grants/${encodeURIComponent(String(args.grant_id))}/events/import${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(getApiV3GrantsGrantIdEventsImportResponse, await res.json()) };