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