Vue Storefront is now Alokai! Learn More
GetOrderDetails

GetOrderDetails

Implements GetOrderDetails Unified Method.

Source

import { assignToNormalizerContext, getNormalizers } from "@alokai/connect/integration-kit";
import type {
  BigcommerceIntegrationContext,
  Order,
  OrderByCartResponse,
  OrderProductResponse,
} from "@vsf-enterprise/bigcommerce-api";

import { defineApi } from "@vsf-enterprise/unified-api-bigcommerce";

export const getOrderDetails = defineApi.getOrderDetails(async (context, args) => {
  const { id } = args;
  const orderId = Number.parseInt(id);
  const { api } = await context.getApiClient();
  const orderData = await api.getOrders({ max_id: orderId, min_id: orderId });
  const orderProducts = await api.getOrderProducts({ orderId });
  const orderShipping = await api.getOrderShippingAddresses({ orderId });

  const data: OrderByCartResponse = {
    ...(orderData![0] as Order),
    products: orderProducts,
    shipping_addresses: orderShipping,
  };

  const { normalizeOrder } = getNormalizers(context);
  assignToNormalizerContext(context, {
    imageGetter: await imageGetterFactory(orderProducts, context),
  });

  return normalizeOrder(data);
});

async function imageGetterFactory(
  orderProducts: OrderProductResponse,
  context: BigcommerceIntegrationContext,
) {
  if (context.config.unified.skipOrderImages) {
    return () => null;
  }

  const { api } = await context.getApiClient();
  const { data: orderImages } = await api.getProductsById({
    entityIds: orderProducts.map((product) => product.product_id).filter(Boolean),
  });

  if (!orderImages) {
    return () => null;
  }

  return (productId: number) => {
    const foundProduct = orderImages.find((product) => product.id === productId);

    if (!foundProduct?.images?.[0]) {
      return null;
    }

    return foundProduct.images[0];
  };
}