commerce/lib/geins/pim.ts
Kristian Arvidsson db63db1331
feat/add-geins-as-provider (#1)
* feat: add geins as provider
2024-11-28 11:24:28 +01:00

152 lines
3.7 KiB
TypeScript

import { GeinsCore } from '@geins/core';
import { USE_CATEGORY_FOR_RECOMMENDATIONS_BACKUP } from './constants';
import { categoriesQuery } from './queries/queries/categories';
import { listPageInfoQuery } from './queries/queries/listPageInfo';
import { productQuery } from './queries/queries/product';
import { productsQuery } from './queries/queries/products';
import { relatedProductsQuery } from './queries/queries/products-related';
import {
reshapeCategories,
reshapeListPageMetadata,
reshapeProduct,
reshapeProducts,
translateSortKey
} from './reshape';
import {
CategoryItemType,
CollectionType,
ProductRelationType,
ProductRelationTypeEnum,
ProductType
} from './types';
export const getCategoryMetadata = async (
geinsCore: GeinsCore,
slug: string
): Promise<CollectionType> => {
const data = await geinsCore.graphql.query({
queryAsString: listPageInfoQuery,
variables: { url: slug }
});
return reshapeListPageMetadata(data);
};
export const getCategories = async (
geinsCore: GeinsCore,
parentNodeId?: number
): Promise<CategoryItemType[]> => {
const variables = {
includeHidden: false,
parentCategoryId: parentNodeId
};
const data = await geinsCore.graphql.query({ queryAsString: categoriesQuery, variables });
return reshapeCategories(data);
};
export const getProduct = async (
geinsCore: GeinsCore,
slug: string
): Promise<ProductType | undefined> => {
const variables = {
alias: slug
};
const data = await geinsCore.graphql.query({ queryAsString: productQuery, variables });
if (!data.product) {
return undefined;
}
return reshapeProduct(data.product);
};
export const getProducts = async (
geinsCore: GeinsCore,
{
query,
reverse,
sortKey
}: {
query?: string;
reverse?: boolean;
sortKey?: string;
}
): Promise<ProductType[]> => {
const variables = {
filter: {
sort: translateSortKey(sortKey || '', reverse || false),
includeCollapsed: true,
filterMode: 'CURRENT',
searchText: query
}
};
const data = await geinsCore.graphql.query({ queryAsString: productsQuery, variables });
if (!data || !data.products || !data.products.products) {
return [];
}
return reshapeProducts(data.products.products);
};
export const getProductRecommendations = async (
geinsCore: GeinsCore,
product: ProductType
): Promise<ProductType[]> => {
const variables = {
alias: product.slug
};
const data = await geinsCore.graphql.query({ queryAsString: relatedProductsQuery, variables });
if (data?.relatedProducts && data.relatedProducts.length > 0) {
return reshapeProducts(data.relatedProducts);
}
if (USE_CATEGORY_FOR_RECOMMENDATIONS_BACKUP) {
const categoryAlias = product.relations?.filter(
(relation: ProductRelationType) => relation.type === ProductRelationTypeEnum.CATEGORY
);
if (categoryAlias && categoryAlias[0]) {
return getCategoryProducts(geinsCore, { category: categoryAlias[0].alias, take: 4 });
}
}
return [];
};
export const getCategoryProducts = async (
geinsCore: GeinsCore,
{
category,
reverse,
sortKey,
take,
skip
}: {
category: string;
reverse?: boolean;
sortKey?: string;
take?: number;
skip?: number;
}
): Promise<ProductType[]> => {
const variables = {
categoryAlias: category,
filter: {
sort: translateSortKey(sortKey || '', reverse || false),
includeCollapsed: false
},
...(take && { take }),
...(skip && { skip })
};
const data = await geinsCore.graphql.query({
queryAsString: productsQuery,
variables,
requestOptions: { fetchPolicy: 'no-cache' }
});
if (!data || !data.products || !data.products.products) {
return [];
}
return reshapeProducts(data.products.products);
};