UNPKG

@techsio/storefront-data

Version:

Medusa-first storefront data layer built on TanStack Query.

68 lines (67 loc) • 2.63 kB
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 };