import {z} from 'zod' export type GetApiApiV1FePlansPlanIdOrdersPartnerOrderIdArgs = {planId: string, partnerOrderId: string}; export type GetApiApiV1FePlansPlanIdOrdersPartnerOrderIdOptions = {baseUrl?: string | undefined, oauth2Scheme?: string | undefined, fetch?: typeof fetch | undefined}; export const fEDesiredDeliveryDateOptions = z.object({exactDateDelivery: z.boolean().optional(), guaranteedDateDelivery: z.boolean().optional(), upgradeCostDeltaMax: z.number().optional(), currencyCode: z.string().optional(), fulfillmentPreference: z.enum(["OnTime", "Consolidate", "Unknown"]).optional()}); export const address = z.object({name: z.string().optional(), company: z.string().optional(), street1: z.string().optional(), street2: z.string().optional(), city: z.string().optional(), region: z.string().optional(), countryCode: z.string(), postalCode: z.string(), addressType: z.enum(["commercial", "residential"]).optional()}); export const fEOrderItem = z.object({quantity: z.number().int(), productId: z.string()}); export const criteria = z.object({mustShipComplete: z.boolean().optional()}); export const performance = z.object({effectiveShipDateTime: z.string().optional(), estimatedDeliveryDate: z.string().optional(), estimatedDeliveryDateLocal: z.string().optional(), destinationTimezoneId: z.string().optional()}); export const costInfo = z.object({carrier: z.string().optional(), serviceMethod: z.string().optional(), cost: z.number().optional(), performance: performance.optional()}); export const linearDimensions = z.object({linearUnit: z.enum(["in", "cm"]).optional(), length: z.number().optional(), width: z.number().optional(), height: z.number().optional()}); export const weight = z.object({weightUnit: z.enum(["g", "kg", "oz", "lb"]).optional(), weight: z.number().optional()}); export const fEPackagingType = z.object({packagingTypeId: z.string(), packagingMaterial: z.enum(["box", "envelope", "flat_pack", "unknown"]), linearDimensions: linearDimensions, weight: weight, maxContentWeight: weight.optional(), urn: z.string().optional(), packagingSizeName: z.string().optional()}); export const shipmentItem = z.object({productId: z.string(), partnerOrderId: z.string(), linearDimensions: linearDimensions.optional(), weight: weight.optional()}); export const proposedShipment = z.object({proposedShipmentId: z.string(), fulfillmentCenterId: z.string().optional(), fulfillmentContextId: z.string(), fulfillmentContext: z.string().optional(), cost: costInfo.optional(), destinationAddress: address, packagingType: fEPackagingType, shipmentItems: z.array(shipmentItem), totalWeight: weight.optional()}); export const unfulfillableItem = z.object({partnerOrderId: z.string(), orderItem: fEOrderItem, reason: z.string(), countUnfulfilled: z.number().int()}); export const fEOrder = z.object({planId: z.string(), orderId: z.string(), partnerOrderId: z.string(), currencyCode: z.enum(["chf", "usd", "not_set", "unknown"]), desiredDeliveryDate: z.string().optional(), desiredDeliveryDateOptions: fEDesiredDeliveryDateOptions.optional(), businessDaysOfTransit: z.number().int().optional(), shipOption: z.string().optional(), shippedDateTime: z.string().optional(), destinationAddress: address, orderedDateTime: z.string(), partnerReferenceIdentifier: z.string().optional(), partnerReferenceIdentifier2: z.string().optional(), orderItemQuantities: z.array(fEOrderItem), orderParams: criteria, proposedShipments: z.array(proposedShipment), unfulfillableItems: z.array(unfulfillableItem), shipmentTags: z.array(z.string()).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 }; /** * Endpoint to retrieve an existing order from a plan. * * GET /api/v1/fe/plans/{planId}/orders/{partnerOrderId} */ export const getApiApiV1FePlansPlanIdOrdersPartnerOrderId = async (args: GetApiApiV1FePlansPlanIdOrdersPartnerOrderIdArgs, options?: GetApiApiV1FePlansPlanIdOrdersPartnerOrderIdOptions) => { const {baseUrl = "https://api.shipium.com", fetch: fetchFn = fetch, oauth2Scheme} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (oauth2Scheme !== undefined) headers.set('authorization', `Bearer ${oauth2Scheme}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/fe/plans/${encodeURIComponent(String(args.planId))}/orders/${encodeURIComponent(String(args.partnerOrderId))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(fEOrder, await res.json()) };