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'),
})
}