@techsio/storefront-data
Version:
Medusa-first storefront data layer built on TanStack Query.
68 lines (67 loc) • 2.63 kB
JavaScript
const REVIEW_SUMMARY_REPAIR_LIMIT = 100;
const stripListInput = (input)=>{
const { enabled: _enabled, page: _page, productId: _productId, ...query } = input;
return query;
};
const calculateReviewSummary = (reviews)=>{
if (!reviews.length) return {
average_rating: 0,
count: 0
};
const ratingSum = reviews.reduce((sum, review)=>sum + review.rating, 0);
return {
average_rating: Number((ratingSum / reviews.length).toFixed(1)),
count: reviews.length
};
};
const hasCompleteReviewSet = (response)=>response.count === response.reviews.length;
const hasInconsistentSummary = (response)=>response.summary.count !== response.count;
function createMedusaProductReviewService(sdk, config) {
const { listPath = "/store/products", transformReview } = config ?? {};
const mapReview = transformReview ?? ((review)=>review);
return {
async listProductReviews (params, signal) {
if (!params.productId) return {
count: 0,
limit: params.limit ?? 0,
offset: params.offset ?? 0,
reviews: [],
summary: {
average_rating: 0,
count: 0
}
};
const query = stripListInput(params);
const response = await sdk.client.fetch(`${listPath}/${params.productId}/reviews`, {
query,
signal
});
let summary = response.summary;
if (hasCompleteReviewSet(response)) summary = calculateReviewSummary(response.reviews);
else if (hasInconsistentSummary(response) && response.count <= REVIEW_SUMMARY_REPAIR_LIMIT) {
const summaryResponse = await sdk.client.fetch(`${listPath}/${params.productId}/reviews`, {
query: {
...query,
limit: response.count,
offset: 0
},
signal
});
if (hasCompleteReviewSet(summaryResponse)) summary = calculateReviewSummary(summaryResponse.reviews);
}
return {
...response,
reviews: response.reviews.map(mapReview),
summary
};
},
async createProductReview (input) {
const response = await sdk.client.fetch("/store/reviews", {
method: "POST",
body: input
});
return mapReview(response.review);
}
};
}
export { createMedusaProductReviewService };