mirror of
https://github.com/vercel/commerce.git
synced 2025-04-28 05:47:50 +00:00
152 lines
3.7 KiB
TypeScript
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);
|
|
};
|