Skip to content

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

Package listing

@kody/workos

src/list-events.ts

88 lines · 2.9 KB · TypeScript
import { workosRequest } from './client.ts'
import { mapEvent } from './models.ts'
import type { WorkosAuthInput, WorkosEventSummary, WorkosPageInfo } from './types.ts'
import {
	clampInt,
	compactRecord,
	optionalString,
	optionalStringArray,
	requireRecord,
} from './types.ts'

export type ListEventsInput = WorkosAuthInput & {
	/** Event type filters. WorkOS requires at least one. */
	events: Array<string>
	organizationId?: string
	rangeStart?: string
	rangeEnd?: string
	limit?: number
	after?: string
	before?: string
	order?: 'asc' | 'desc' | 'normal'
}

export type ListEventsResult = {
	items: Array<WorkosEventSummary>
	pageInfo: WorkosPageInfo
}

/**
 * List WorkOS events. `events` is required by the API (for example
 * `["dsync.user.created"]`).
 * @example
 * import listEvents from 'kody:@kody/workos/list-events'
 * const { items } = await listEvents({ events: ['organization.created'] })
 */
export async function listEvents(input: ListEventsInput): Promise<ListEventsResult> {
	const events = optionalStringArray(input.events, 'events')
	if (!events || events.length === 0) {
		throw new Error('events must include at least one WorkOS event type.')
	}
	const result = await workosRequest<Array<unknown>>({
		...input,
		operation: 'events.read',
		path: '/events',
		query: compactRecord({
			events,
			organization_id: optionalString(input.organizationId, 'organizationId'),
			range_start: optionalString(input.rangeStart, 'rangeStart'),
			range_end: optionalString(input.rangeEnd, 'rangeEnd'),
			limit: clampInt(input.limit, 1, 100, 10),
			after: optionalString(input.after, 'after'),
			before: optionalString(input.before, 'before'),
			order: optionalString(input.order, 'order'),
		}),
	})
	return {
		items: (Array.isArray(result.data) ? result.data : []).map(mapEvent),
		pageInfo: result.pageInfo,
	}
}

/**
 * List WorkOS events. `events` is required by the API.
 * @example
 * import listEvents from 'kody:@kody/workos/list-events'
 * const result = await listEvents({ events: ['organization.created'] })
 */
export default async function listEventsEntrypoint(
	params: Partial<ListEventsInput> & Record<string, unknown> = {},
) {
	const input = requireRecord(params, 'list-events')
	const order = optionalString(input.order, 'order')
	if (order !== undefined && order !== 'asc' && order !== 'desc' && order !== 'normal') {
		throw new Error('order must be "asc", "desc", or "normal".')
	}
	return listEvents({
		events: optionalStringArray(input.events, 'events') ?? [],
		organizationId: optionalString(input.organizationId, 'organizationId'),
		rangeStart: optionalString(input.rangeStart, 'rangeStart'),
		rangeEnd: optionalString(input.rangeEnd, 'rangeEnd'),
		limit: input.limit as number | undefined,
		after: optionalString(input.after, 'after'),
		before: optionalString(input.before, 'before'),
		order,
		account: optionalString(input.account, 'account'),
		secretName: optionalString(input.secretName, 'secretName'),
	})
}