Skip to content

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

Package listing

@kody/zendesk

src/request.ts

70 lines · 2.4 KB · TypeScript
import { parseAuth, requireAuthMode } from './auth.ts'
import { zendeskRequest } from './client.ts'
import { resolveSubdomain } from './config.ts'
import { inferOperationFromPath, isMutatingMethod, isSearchPath, zendeskUrl } from './setup.ts'
import type { JsonRecord, MutationInput, ZendeskAuthInput } from './types.ts'
import { optionalBoolean, optionalString, requireRecord, requireString } from './types.ts'

export type ZendeskRawRequestInput = ZendeskAuthInput &
	MutationInput & {
		path: string
		method?: string
		query?: JsonRecord
		body?: JsonRecord
	}

/**
 * Call the Zendesk REST API with a saved OAuth integration or API token.
 * Search GET `/search`, `/users/search`, and Help Center article search are
 * reads. Other mutating methods require `confirm: true`; use `dryRun: true`
 * to preview.
 * @example
 * import request from 'kody:@kody/zendesk/request'
 * const result = await request({ path: '/tickets', query: { per_page: 5 }, subdomain: 'acme' })
 */
export async function request(input: ZendeskRawRequestInput) {
	const path = requireString(input.path, 'path')
	const method = (input.method ?? 'GET').toUpperCase()
	const mutating = isMutatingMethod(method) && !isSearchPath(path)
	if (input.dryRun) {
		const subdomain = await resolveSubdomain(input).catch(() => 'your-subdomain')
		return {
			dryRun: true as const,
			url: zendeskUrl(path, input.query, subdomain),
			method,
			operation: inferOperationFromPath(method, path),
			path,
			query: input.query ?? {},
			body: input.body ?? null,
			readOnly: !mutating,
		}
	}
	return zendeskRequest({
		...input,
		path,
		method,
		operation: inferOperationFromPath(method, path),
	})
}

/**
 * Call the Zendesk REST API with a saved OAuth integration or API token.
 * @example
 * import request from 'kody:@kody/zendesk/request'
 * const result = await request({ path: '/users/me', subdomain: 'acme' })
 */
export default async function requestEntrypoint(
	params: Partial<ZendeskRawRequestInput> & Record<string, unknown> = {},
) {
	const input = requireRecord(params, 'request')
	return request({
		...parseAuth(input),
		path: requireString(input.path, 'path'),
		method: optionalString(input.method, 'method'),
		query: input.query as JsonRecord | undefined,
		body: input.body as JsonRecord | undefined,
		auth: requireAuthMode(input.auth),
		confirm: optionalBoolean(input.confirm, 'confirm'),
		dryRun: optionalBoolean(input.dryRun, 'dryRun'),
	})
}