Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kody/calendly

src/get-available-times.ts

72 lines · 2.5 KB · TypeScript
import { calendlyRequest, calendlyResourceUri } from './client.ts'
import { mapAvailableTime } from './models.ts'
import type { CalendlyAuthInput, CalendlyAvailableTime } from './types.ts'
import { compactRecord, optionalString, requireRecord, requireString } from './types.ts'
import { requireAuthMode } from './auth.ts'

export type GetAvailableTimesInput = CalendlyAuthInput & {
	/** Event type uuid or URI. */
	eventType: string
	/** Inclusive UTC start (`2026-06-01T00:00:00Z`). */
	startTime: string
	/** Exclusive UTC end. */
	endTime: string
}

export type GetAvailableTimesResult = {
	items: Array<CalendlyAvailableTime>
}

/**
 * List bookable start times for a Calendly event type.
 * @example
 * import getAvailableTimes from 'kody:@kody/calendly/get-available-times'
 * const { items } = await getAvailableTimes({
 *   eventType: 'AAAAAAAAAAAAAAAA',
 *   startTime: '2026-06-01T00:00:00Z',
 *   endTime: '2026-06-08T00:00:00Z',
 * })
 */
export async function getAvailableTimes(
	input: GetAvailableTimesInput,
): Promise<GetAvailableTimesResult> {
	const result = await calendlyRequest<Array<unknown>>({
		...input,
		operation: 'eventTypes.read',
		path: '/event_type_available_times',
		query: compactRecord({
			event_type: calendlyResourceUri('event_types', requireString(input.eventType, 'eventType')),
			start_time: requireString(input.startTime, 'startTime'),
			end_time: requireString(input.endTime, 'endTime'),
		}),
	})
	return {
		items: (Array.isArray(result.data) ? result.data : []).map(mapAvailableTime),
	}
}

/**
 * List bookable start times for a Calendly event type.
 * @example
 * import getAvailableTimes from 'kody:@kody/calendly/get-available-times'
 * const result = await getAvailableTimes({
 *   eventType: 'AAAAAAAAAAAAAAAA',
 *   startTime: '2026-06-01T00:00:00Z',
 *   endTime: '2026-06-08T00:00:00Z',
 * })
 */
export default async function getAvailableTimesEntrypoint(
	params: Partial<GetAvailableTimesInput> & Record<string, unknown> = {},
) {
	const input = requireRecord(params, 'get-available-times')
	return getAvailableTimes({
		eventType: requireString(input.eventType, 'eventType'),
		startTime: requireString(input.startTime, 'startTime'),
		endTime: requireString(input.endTime, 'endTime'),
		integrationName: optionalString(input.integrationName, 'integrationName'),
		integration: optionalString(input.integration, 'integration'),
		account: optionalString(input.account, 'account'),
		secretName: optionalString(input.secretName, 'secretName'),
		auth: requireAuthMode(input.auth),
	})
}