Skip to content
← Public packages

@kody/doordash-driver

Request DoorDash Drive (Dasher) deliveries with JWT auth from Developer Portal access keys.

src/create-delivery.ts

86 lines · 2.3 KB · TypeScript
/**
 * Create a DoorDash Drive delivery (`POST /drive/v2/deliveries`).
 * Dry-run by default — pass `confirm: true` to submit live.
 *
 * ```ts
 * import { createDelivery } from 'kody:@kody/doordash-driver/create-delivery'
 * await createDelivery({
 *   external_delivery_id: 'order-123',
 *   pickup_address: '901 Market Street, San Francisco, CA 94103',
 *   pickup_business_name: 'Store',
 *   pickup_phone_number: '+16505555555',
 *   dropoff_address: '901 Market Street, San Francisco, CA 94103',
 *   dropoff_phone_number: '+16505555555',
 *   order_value: 1999,
 *   confirm: true,
 * })
 * ```
 */

import { doorDashRequest, type DoorDashAuthInput, type DoorDashObject } from './core.ts'

export type CreateDeliveryInput = DoorDashAuthInput & {
	/** Full Drive create-delivery JSON body, or flatten common fields at top level. */
	body?: DoorDashObject
	external_delivery_id?: string
	pickup_address?: string
	pickup_business_name?: string
	pickup_phone_number?: string
	pickup_instructions?: string
	dropoff_address?: string
	dropoff_business_name?: string
	dropoff_phone_number?: string
	dropoff_instructions?: string
	dropoff_contact_given_name?: string
	dropoff_contact_family_name?: string
	order_value?: number
	currency?: string
	items?: DoorDashObject[]
	tip?: number
	dryRun?: boolean
	confirm?: boolean
}

function buildBody(input: CreateDeliveryInput): DoorDashObject {
	if (input.body && typeof input.body === 'object') {
		return { ...input.body }
	}
	const body: DoorDashObject = {}
	const keys = [
		'external_delivery_id',
		'pickup_address',
		'pickup_business_name',
		'pickup_phone_number',
		'pickup_instructions',
		'dropoff_address',
		'dropoff_business_name',
		'dropoff_phone_number',
		'dropoff_instructions',
		'dropoff_contact_given_name',
		'dropoff_contact_family_name',
		'order_value',
		'currency',
		'items',
		'tip',
	] as const
	for (const key of keys) {
		const value = input[key]
		if (value !== undefined) body[key] = value
	}
	return body
}

export async function createDelivery(input: CreateDeliveryInput = {}) {
	const body = buildBody(input)
	if (!body.external_delivery_id && input.confirm === true && input.dryRun !== true) {
		throw new Error('external_delivery_id is required to create a delivery.')
	}
	return doorDashRequest({
		...input,
		method: 'POST',
		path: '/drive/v2/deliveries',
		body,
	})
}

export default createDelivery