Skip to content
← Public packages

@kody/salesforce

Salesforce REST helpers for identity, SOQL, multi-org routing, and error investigation.

src/get-record.ts

67 lines · 2.0 KB · TypeScript
import { salesforceJson } from './request.ts'
import type { JsonRecord } from './types.ts'
import {
	optionalString,
	requireRecord,
	requireSalesforceId,
	requireSObjectName,
} from './types.ts'

export type GetRecordInput = {
	sobject: string
	id: string
	/** Optional comma-separated field list. */
	fields?: string
	instanceUrl?: string
	apiVersion?: string
	/** Saved OAuth integration name. Defaults to `salesforce`. */
	integrationName?: string
}

/**
 * Fetch one Salesforce record by sObject API name and id.
 * @param input.sobject - Salesforce sObject API name.
 * @param input.id - Record id.
 * @param input.fields - Optional comma-separated field list.
 * @returns Record field map.
 * @example
 * import getRecord from 'kody:@kody/salesforce/get-record'
 * const contact = await getRecord({
 *   sobject: 'Contact',
 *   id: '003XXXXXXXXXXXXXXX',
 *   fields: 'Id,Name,Email',
 * })
 */
export async function getRecord(input: GetRecordInput): Promise<JsonRecord> {
	const sobject = requireSObjectName(input.sobject)
	const id = requireSalesforceId(input.id)
	const fields = optionalString(input.fields, 'fields')

	return salesforceJson<JsonRecord>({
		path: `sobjects/${sobject}/${id}`,
		method: 'GET',
		query: fields ? { fields } : undefined,
		instanceUrl: optionalString(input.instanceUrl, 'instanceUrl'),
		apiVersion: optionalString(input.apiVersion, 'apiVersion'),
		integrationName: optionalString(input.integrationName, 'integrationName'),
	})
}

/**
 * Fetch one Salesforce record by sObject API name and id.
 * @example
 * import getRecord from 'kody:@kody/salesforce/get-record'
 * const contact = await getRecord({
 *   sobject: 'Contact',
 *   id: '003XXXXXXXXXXXXXXX',
 *   fields: 'Id,Name,Email',
 * })
 */
export default async function getRecordEntrypoint(
	params: Partial<GetRecordInput> & Record<string, unknown> = {},
) {
	const input = requireRecord(params, 'get-record')
	requireSObjectName(input.sobject)
	requireSalesforceId(input.id)
	return getRecord(input as GetRecordInput)
}