Files
botpress--botpress/integrations/calendly/src/calendly-api/schemas.ts
T
2026-07-13 13:34:48 +08:00

175 lines
5.2 KiB
TypeScript

import { z } from '@botpress/sdk'
export const calendlyUri = z.string().url().brand('CalendlyUri')
export type CalendlyUri = z.infer<typeof calendlyUri>
export const uuidSchema = z.string().uuid()
export const paginationSchema = z
.object({
count: z.number(),
next_page: z.string().url().nullable(),
next_page_token: z.string().nullable(),
previous_page: z.string().url().nullable(),
previous_page_token: z.string().nullable(),
})
.passthrough()
export type Pagination = z.infer<typeof paginationSchema>
/** @see https://developer.calendly.com/api-docs/005832c83aeae-get-current-user */
export const getCurrentUserRespSchema = z
.object({
resource: z.object({
avatar_url: z.string().url().nullable(),
created_at: z.coerce.date(),
current_organization: calendlyUri,
email: z.string().email(),
locale: z.string(),
/** Human Readable format */
name: z.string(),
resource_type: z.string(),
scheduling_url: z.string().url(),
slug: z.string(),
time_notation: z.string(),
/** e.g. 'America/New_York' */
timezone: z.string(),
updated_at: z.coerce.date(),
/** The user's calendly URI */
uri: calendlyUri,
}),
})
.passthrough()
export type GetCurrentUserResp = z.infer<typeof getCurrentUserRespSchema>
export const eventQuestionSchema = z
.object({
name: z.string(),
type: z.string(),
position: z.number(),
enabled: z.boolean(),
required: z.boolean(),
answer_choices: z.array(z.string()),
include_other: z.boolean(),
})
.passthrough()
export type EventQuestion = z.infer<typeof eventQuestionSchema>
export const eventTypeSchema = z
.object({
uri: z.string().url(),
name: z.string().nullable(),
active: z.boolean(),
slug: z.string().nullable(),
scheduling_url: z.string().url(),
duration: z.number(),
duration_options: z.array(z.number()).nullable(),
kind: z.string(),
pooling_type: z.string().nullable(),
type: z.string(),
color: z.string(),
created_at: z.coerce.date(),
updated_at: z.coerce.date(),
internal_note: z.string().nullable(),
description_plain: z.string().nullable(),
description_html: z.string().nullable(),
profile: z
.object({
type: z.string(),
name: z.string(),
owner: z.string().url(),
})
.passthrough()
.nullable(),
secret: z.boolean(),
booking_method: z.string(),
custom_questions: z.array(eventQuestionSchema),
deleted_at: z.coerce.date().nullable(),
admin_managed: z.boolean(),
locations: z
.array(
z
.object({
kind: z.string(),
location: z.string().optional(),
additional_info: z.string().optional(),
phone_number: z.string().optional(),
})
.passthrough()
)
.nullable(),
position: z.number(),
locale: z.string(),
})
.passthrough()
export type EventType = z.infer<typeof eventTypeSchema>
/** @see https://developer.calendly.com/api-docs/25a4ece03c1bc-list-user-s-event-types */
export const getEventTypesListRespSchema = z
.object({
collection: z.array(eventTypeSchema),
pagination: paginationSchema,
})
.passthrough()
export type GetEventTypesListResp = z.infer<typeof getEventTypesListRespSchema>
/** @see https://developer.calendly.com/api-docs/4b8195084e287-create-single-use-scheduling-link */
export const createSchedulingLinkRespSchema = z
.object({
resource: z
.object({
booking_url: z.string().url(),
owner: calendlyUri,
owner_type: z.string(),
})
.passthrough(),
})
.passthrough()
export type CreateSchedulingLinkResp = z.infer<typeof createSchedulingLinkRespSchema>
export const webhookDetailsSchema = z
.object({
callback_url: z.string(),
created_at: z.coerce.date(),
creator: z.string(),
events: z.array(z.string()),
group: z.null(),
organization: calendlyUri,
retry_started_at: z.coerce.date().nullable(),
scope: z.string(),
state: z.string(),
updated_at: z.coerce.date(),
uri: calendlyUri,
user: calendlyUri.nullable(),
})
.passthrough()
export type WebhookDetails = z.infer<typeof webhookDetailsSchema>
/** @see https://developer.calendly.com/api-docs/faac832d7c57d-list-webhook-subscriptions */
export const getWebhooksListRespSchema = z
.object({
collection: z.array(webhookDetailsSchema),
pagination: paginationSchema,
})
.passthrough()
export type GetWebhooksListResp = z.infer<typeof getWebhooksListRespSchema>
/** @see https://developer.calendly.com/api-docs/c1ddc06ce1f1b-create-webhook-subscription */
export const createWebhookRespSchema = z
.object({
resource: webhookDetailsSchema,
})
.passthrough()
export type CreateWebhookResp = z.infer<typeof createWebhookRespSchema>
export const getOAuthAccessTokenRespSchema = z.object({
access_token: z.string().min(1),
token_type: z.string().min(1),
expires_in: z.number().min(0),
refresh_token: z.string().min(1),
scope: z.string().min(1),
created_at: z.number().min(0),
owner: calendlyUri,
organization: calendlyUri,
})
export type GetOAuthAccessTokenResp = z.infer<typeof getOAuthAccessTokenRespSchema>