import {z} from 'zod' export type PublicObjectId = {id: string}; export type AssociationSpec = {associationCategory: 'HUBSPOT_DEFINED' | 'INTEGRATOR_DEFINED' | 'USER_DEFINED' | 'WORK', associationTypeId: number}; export type ExternalAssociationCreateRequest = {to: PublicObjectId, types: Array}; export type ExternalReminder = {numberOfTimeUnits: number, timeUnit: 'DAYS' | 'HOURS' | 'MINUTES' | 'WEEKS'}; export type ExternalEmailReminderSchedule = {reminders: Array, shouldIncludeInviteDescription: boolean}; export type ExternalCalendarMeetingEventCreateProperties = {hs_activity_type?: string | undefined, hs_attachment_ids?: Array | undefined, hs_attendee_owner_ids?: Array | undefined, hs_internal_meeting_notes?: string | undefined, hs_meeting_body?: string | undefined, hs_meeting_end_time: string, hs_meeting_location?: string | undefined, hs_meeting_location_type?: ('ADDRESS' | 'CUSTOM' | 'PHONE') | undefined, hs_meeting_outcome: string, hs_meeting_start_time: string, hs_meeting_title: string, hs_timestamp: string, hubspot_owner_id: string}; export type ExternalCalendarMeetingEventCreateRequest = {associations: Array, emailReminderSchedule: ExternalEmailReminderSchedule, properties: ExternalCalendarMeetingEventCreateProperties, timezone: string}; export type CreateApiSchedulerV3MeetingsCalendarArgs = {organizerUserId: string, body: ExternalCalendarMeetingEventCreateRequest}; export type CreateApiSchedulerV3MeetingsCalendarOptions = {baseUrl?: string | undefined, oauth2?: string | undefined, fetch?: typeof fetch | undefined}; export const externalCalendarMeetingEventResponseProperties = z.object({hs_activity_type: z.string().optional(), hs_attachment_ids: z.array(z.string()).optional(), hs_attendee_owner_ids: z.array(z.string()).optional(), hs_engagement_source: z.enum(["ACADEMY", "ACCEPTANCE_TEST", "ACTIVITY_AUTO_ASSOCIATE", "ACTIVITY_LOG_REVERT", "ADS", "AI_GROUP", "ANALYTICS", "API", "APPROVALS", "ASSISTS", "ASSOCIATIONS", "AUTO_ASSOCIATE_BY_DOMAIN", "AUTOMATION_JOURNEY", "AUTOMATION_PLATFORM", "AVATARS_SERVICE", "BATCH_UPDATE", "BCC_TO_CRM", "BEHAVIORAL_EVENTS", "BET_ASSIGNMENT", "BET_CRM_CONNECTOR", "BIDEN", "BILLING", "BOT", "BREEZE_AGENT", "CALCULATED", "CENTRAL_EXCHANGE_RATES", "CHATSPOT", "CLONE_OBJECTS", "COMMUNICATOR", "COMPANIES", "COMPANY_FAMILIES", "COMPANY_INSIGHTS", "CONNECTED_ACCOUNT", "CONTACTS", "CONTACTS_WEB", "CONTENT_MEMBERSHIP", "CONVERSATIONAL_ENRICHMENT", "CONVERSATIONS", "CRM_PROCESSES_PLATFORM", "CRM_UI", "CRM_UI_BULK_ACTION", "CUSTOMER_AGENT", "CUSTOMER_PORTAL", "DATA_ENRICHMENT", "DATA_QUALITY", "DATASET", "DEALS", "DEFAULT", "DELETE_OBJECTS", "DI_WRITE_TO_CRM", "EMAIL", "EMAIL_INBOX_IMPORT", "EMAIL_INTEGRATION", "ENGAGEMENTS", "EXTENSION", "FILE_MANAGER", "FLYWHEEL_PRODUCT_DATA_SYNC", "FORECASTING", "FORM", "FORWARD_TO_CRM", "GMAIL_INTEGRATION", "GOALS", "HEISENBERG", "HELP_DESK", "HELP_DESK_AI", "IMPORT", "INTEGRATION", "INTEGRATIONS_PLATFORM", "INTEGRATIONS_SYNC", "INTENT", "INTERNAL_PROCESSING", "LEADIN", "LEGAL_BASIS_REMEDIATION", "MARKET_SOURCING", "MARKETPLACE", "MARKETS", "MEETINGS", "MERGE_COMPANIES", "MERGE_CONTACTS", "MERGE_OBJECTS", "MERGE_REVERT_OBJECTS", "MICROAPPS", "MIGRATION", "MOBILE_ANDROID", "MOBILE_IOS", "PAYMENTS", "PIPELINE_SETTINGS", "PLAYBOOKS", "PORTAL_OBJECT_SYNC", "PORTAL_USER_ASSOCIATOR", "PRESENTATIONS", "PRIMARY_AUTOMATION", "PROPERTY_DEFAULT_VALUE", "PROPERTY_RESTORE", "PROPERTY_SETTINGS", "PROSPECTING_AGENT", "QUOTAS", "QUOTES", "RECYCLING_BIN", "RESTORE_OBJECTS", "REVENUE_PLATFORM", "SALES", "SALES_MESSAGES", "SALESFORCE", "SEQUENCES", "SETTINGS", "SIDEKICK", "SIGNALS", "SLACK_INTEGRATION", "SMART_DATA_CAPTURE", "SOCIAL", "SUCCESS", "TALLY", "TASK", "UNKNOWN", "WAL_INCREMENTAL", "WORK_UI", "WORKFLOW_CONTACT_DELETE_ACTION", "WORKFLOWS"]), hs_engagement_source_id: z.string(), hs_include_description_in_reminder: z.string().optional(), hs_internal_meeting_notes: z.string().optional(), hs_meeting_body: z.string().optional(), hs_meeting_end_time: z.string(), hs_meeting_external_url: z.string().optional(), hs_meeting_location: z.string().optional(), hs_meeting_location_type: z.enum(["ADDRESS", "CUSTOM", "PHONE"]).optional(), hs_meeting_outcome: z.string(), hs_meeting_start_time: z.string(), hs_meeting_title: z.string(), hs_timestamp: z.string(), hs_unique_id: z.string().optional(), hubspot_owner_id: z.string().optional()}); export const externalCalenderMeetingEventResponse = z.object({createdAt: z.string(), id: z.string(), lastUpdatedAt: z.string(), properties: externalCalendarMeetingEventResponseProperties}); 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 }; /** * Create a new calendar meeting event. * * POST /scheduler/v3/meetings/calendar * * Also accepts auth: oauth2, oauth2, oauth2, oauth2, oauth2, oauth2, oauth2, oauth2, oauth2, oauth2, oauth2, oauth2, oauth2, oauth2, oauth2, oauth2, oauth2, oauth2, oauth2, oauth2, oauth2, oauth2, oauth2, oauth2, oauth2 */ export const createApiSchedulerV3MeetingsCalendar = async (args: CreateApiSchedulerV3MeetingsCalendarArgs, options?: CreateApiSchedulerV3MeetingsCalendarOptions) => { const {baseUrl = "https://api.hubapi.com", fetch: fetchFn = fetch, oauth2} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args.organizerUserId != null) query.append("organizerUserId", String(args.organizerUserId)) if (oauth2 !== undefined) headers.set('authorization', `Bearer ${oauth2}`) const url = `${baseUrl.replace(/\/+$/, '')}/scheduler/v3/meetings/calendar${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(externalCalenderMeetingEventResponse, await res.json()) };