commerce/lib/spree/utils/normalizations/normalize-wishlist.ts
2024-05-21 20:00:11 +05:00

61 lines
2.0 KiB
TypeScript

import MissingProductError from '../../errors/MissingProductError';
import MissingVariantError from '../../errors/MissingVariantError';
import { jsonApi } from '@spree/storefront-api-v2-sdk';
import type { ProductAttr } from '@spree/storefront-api-v2-sdk/types/interfaces/Product';
import type { WishedItemAttr } from '@spree/storefront-api-v2-sdk/types/interfaces/WishedItem';
import type { WishlistAttr } from '@spree/storefront-api-v2-sdk/types/interfaces/Wishlist';
import type { ExplicitCommerceWishlist, SpreeSdkResponse, VariantAttr } from '../../types';
import normalizeProduct from './normalize-product';
const normalizeWishlist = (
spreeSuccessResponse: SpreeSdkResponse,
spreeWishlist: WishlistAttr
): ExplicitCommerceWishlist => {
const spreeWishedItems = jsonApi.findRelationshipDocuments<WishedItemAttr>(
spreeSuccessResponse,
spreeWishlist,
'wished_items'
);
const items: ExplicitCommerceWishlist['items'] = spreeWishedItems.map((spreeWishedItem) => {
const spreeWishedVariant = jsonApi.findSingleRelationshipDocument<VariantAttr>(
spreeSuccessResponse,
spreeWishedItem,
'variant'
);
if (spreeWishedVariant === null) {
throw new MissingVariantError(
`Couldn't find variant for wished item with id ${spreeWishedItem.id}.`
);
}
const spreeWishedProduct = jsonApi.findSingleRelationshipDocument<ProductAttr>(
spreeSuccessResponse,
spreeWishedVariant,
'product'
);
if (spreeWishedProduct === null) {
throw new MissingProductError(
`Couldn't find product for variant with id ${spreeWishedVariant.id}.`
);
}
return {
id: spreeWishedItem.id,
product_id: parseInt(spreeWishedProduct.id, 10),
variant_id: parseInt(spreeWishedVariant.id, 10),
product: normalizeProduct(spreeSuccessResponse, spreeWishedProduct)
};
});
return {
id: spreeWishlist.id,
token: spreeWishlist.attributes.token,
items
};
};
export default normalizeWishlist;