import {z} from 'zod' export type AssignRouteInputSerializer = {providerId?: (string | null) | undefined, driverGroupId?: (string | null) | undefined, courierId?: (string | null) | undefined, vehicleId?: (string | null) | undefined}; export type CreateApiV1RoutesIdAssignArgs = {id: string, body: AssignRouteInputSerializer}; export type CreateApiV1RoutesIdAssignOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const courierSerializer = z.object({id: z.string().nullable().optional(), firstName: z.string().nullable().optional(), lastName: z.string().nullable().optional(), phoneNumber: z.string().nullable().optional()}); export const driverGroupSerializer = z.object({id: z.string().nullable().optional(), externalId: z.string().nullable().optional()}); export const courierPositionSerializer = z.object({lat: z.number(), lng: z.number(), updatedAt: z.string().nullable().optional(), capturedAt: z.string().nullable().optional(), accuracy: z.number().nullable().optional(), heading: z.number().nullable().optional(), speed: z.number().nullable().optional(), altitude: z.number().nullable().optional(), altitudeAccuracy: z.number().nullable().optional(), batteryLevel: z.number().nullable().optional(), batteryIsCharging: z.boolean().nullable().optional(), isMoving: z.boolean().nullable().optional()}); export const vehicleSerializer = z.object({licensePlate: z.string().nullable().optional(), make: z.string().nullable().optional(), model: z.string().nullable().optional(), color: z.string().nullable().optional(), year: z.number().int().nullable().optional(), type: z.string().nullable().optional()}); export const latLngSerializer = z.object({lat: z.number(), lng: z.number()}); export const proofOfDeliverySerializer = z.object({type: z.string(), url: z.string().nullable().optional(), uploadedAt: z.string().nullable().optional()}); export const itemStatusMetadataSerializer = z.object({pickedAt: z.string().nullable().optional(), deliveredAt: z.string().nullable().optional(), failedAt: z.string().nullable().optional(), returnedAt: z.string().nullable().optional(), failureReason: z.string().nullable().optional(), failureLocation: z.string().nullable().optional()}); export const itemStatusHistoryEntrySerializer = z.object({status: z.string(), createdAt: z.string(), occurredAt: z.string().nullable().optional()}); export const orderItemSerializer: z.ZodType = z.object({id: z.string().nullable().optional(), description: z.string().nullable().optional(), count: z.number().int().nullable().optional(), valueCents: z.number().int().nullable().optional(), barcode: z.string().nullable().optional(), sku: z.string().nullable().optional(), category: z.string().nullable().optional(), status: z.string().nullable().optional(), availableQuantity: z.number().int().nullable().optional(), statusMetadata: itemStatusMetadataSerializer.nullable().optional(), statusHistory: z.array(itemStatusHistoryEntrySerializer).nullable().optional(), subItems: z.array(z.lazy(() => orderItemSerializer)).nullable().optional()}); export const stopOrderSerializer = z.object({id: z.string(), externalId: z.string().nullable().optional(), publicTrackingUrl: z.string().nullable().optional(), pod: z.array(proofOfDeliverySerializer).nullable().optional(), orderItems: z.array(orderItemSerializer).nullable().optional()}); export const routeStopSerializer = z.object({stopType: z.string(), objectIds: z.array(z.string()), arrivalTime: z.string().nullable().optional(), departTime: z.string().nullable().optional(), plannedArrivalTime: z.string().nullable().optional(), serviceTime: z.number().int().nullable().optional(), distanceFromPrevious: z.number().int().nullable().optional(), durationFromPrevious: z.number().int().nullable().optional(), location: latLngSerializer.nullable(), status: z.string().nullable().optional(), statusDescription: z.string().nullable().optional(), statusHistory: z.array(z.record(z.string(), z.string().nullable())).nullable().optional(), metadata: z.record(z.string(), z.unknown()).nullable().optional(), startedAt: z.string().nullable().optional(), breakDuration: z.number().int().nullable().optional(), orders: z.array(stopOrderSerializer).nullable().optional()}); export const routeSerializer = z.object({id: z.string(), externalId: z.string().nullable().optional(), portalUrl: z.string(), name: z.string().nullable().optional(), type: z.string(), courierId: z.string().nullable().optional(), vehicleId: z.string().nullable().optional(), courier: courierSerializer.nullable().optional(), driverGroup: driverGroupSerializer.nullable().optional(), courierPosition: courierPositionSerializer.nullable().optional(), vehicle: vehicleSerializer.nullable().optional(), providerName: z.string().nullable().optional(), shiftId: z.string().nullable().optional(), stops: z.array(routeStopSerializer), isDispatched: z.boolean().optional(), jobId: z.string().nullable().optional(), routeMetadata: z.record(z.string(), z.unknown()).nullable().optional(), validationErrors: z.record(z.string(), z.string()).nullable().optional(), encodedPolyline: z.string().nullable().optional(), status: z.string().nullable().optional(), statusHistory: z.array(z.record(z.string(), z.string().nullable())).nullable().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Assign or Reassign a Route * * POST /v1/routes/{id}/assign */ export const createApiV1RoutesIdAssign = async (args: CreateApiV1RoutesIdAssignArgs, options?: CreateApiV1RoutesIdAssignOptions) => { const {baseUrl = "https://api.sandbox.usenash.com", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/v1/routes/${encodeURIComponent(String(args.id))}/assign${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(routeSerializer, await res.json()) };