import {z} from 'zod' export type GetApiApiReviewSummaryArgs = {siteId?: string | undefined, itemId?: string | undefined, rd?: boolean | undefined}; export type GetApiApiReviewSummaryOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const customDataAggregate = z.object({Average: z.number().optional(), Min: z.number().optional(), Max: z.number().optional()}); export const ratingSummaryByItemData = z.object({itemId: z.string().nullable().optional(), totalReviews: z.number().int().optional(), averageRating: z.number().optional(), positiveCount: z.number().int().optional(), negativeCount: z.number().int().optional(), positiveText: z.string().nullable().optional(), negativeText: z.string().nullable().optional(), summarizedText: z.string().nullable().optional(), rating1Count: z.number().int().optional(), rating2Count: z.number().int().optional(), rating3Count: z.number().int().optional(), rating4Count: z.number().int().optional(), rating5Count: z.number().int().optional(), createdDate: z.string().nullable().optional(), customData: z.record(z.string(), customDataAggregate).nullable().optional()}); export const badgeLabels = z.object({basedOnLabel: z.string().nullable().optional(), reviewButtonLabel: z.string().nullable().optional()}); export const addReviewLabels = z.object({writeReviewForText: z.string().nullable().optional(), updateReviewForText: z.string().nullable().optional(), reviewerNameLabel: z.string().nullable().optional(), reviewerNamePlaceholder: z.string().nullable().optional(), ratingLabel: z.string().nullable().optional(), reviewInputPlaceholder: z.string().nullable().optional(), termsCheckboxText: z.string().nullable().optional(), requiredFieldMessage: z.string().nullable().optional(), addBtnLabel: z.string().nullable().optional(), updateBtnLabel: z.string().nullable().optional(), submittingBtnLabel: z.string().nullable().optional(), updatingBtnLabel: z.string().nullable().optional(), successMsgOnAdd: z.string().nullable().optional(), successMsgOnUpdate: z.string().nullable().optional(), termsLinkLabel: z.string().nullable().optional(), termsLinkUrl: z.string().nullable().optional(), starRatingErrorMsg: z.string().nullable().optional(), reviewTextErrorMsg: z.string().nullable().optional(), guidelinesErrorMsg: z.string().nullable().optional(), nameErrorMsg: z.string().nullable().optional(), subHeaderText: z.string().nullable().optional(), detractorsRatingText: z.string().nullable().optional(), passivesRatingText: z.string().nullable().optional(), promotersRatingText: z.string().nullable().optional(), reviewCustomlabel: z.string().nullable().optional(), maxMediaCount: z.number().int().nullable().optional(), maxMediaSizeMB: z.number().int().nullable().optional()}); export const reviewLabels = z.object({reviewerName: z.string().nullable().optional(), sortOnLatest: z.string().nullable().optional(), sortOnHighestGrade: z.string().nullable().optional(), sortOnLowestRating: z.string().nullable().optional(), sortOnMostLikes: z.string().nullable().optional(), loadReviewBtnLabel: z.string().nullable().optional(), translatedFromLabel: z.string().nullable().optional(), todayTextlable: z.string().nullable().optional(), yesterdayTextlable: z.string().nullable().optional(), daysAgoTextlable: z.string().nullable().optional(), monthsAgoTextlable: z.string().nullable().optional(), yearsAgoTextlable: z.string().nullable().optional(), commentPopupHeader: z.string().nullable().optional(), loadCommentBtnLabel: z.string().nullable().optional(), addCommentLabel: z.string().nullable().optional(), commentInputPlaceholder: z.string().nullable().optional(), addCommentBtnLabel: z.string().nullable().optional(), updateCommentBtnLabel: z.string().nullable().optional(), editCommentPopupHeader: z.string().nullable().optional(), cancelCommentText: z.string().nullable().optional(), commentAddSuccessMessage: z.string().nullable().optional(), commentUpdateSuccessMessage: z.string().nullable().optional(), noCommentsYetMessage: z.string().nullable().optional(), commentRequiredMessage: z.string().nullable().optional(), commentLoadingText: z.string().nullable().optional(), verifiedCustomerText: z.string().nullable().optional(), allReviewsLabel: z.string().nullable().optional()}); export const addReviewButtonLabels = z.object({addReviewBtnLabel: z.string().nullable().optional()}); export const distributionWidgetLabels = z.object({showingStarReviewsLabel: z.string().nullable().optional(), seeAllReviewsLabel: z.string().nullable().optional()}); export const summaryLabels = z.object({aiSummary: z.string().nullable().optional(), summaryHeader: z.string().nullable().optional()}); export const highlightLabels = z.object({highlightHeader: z.string().nullable().optional(), highlightFooter: z.string().nullable().optional()}); export const advancedReviewTypeLabel = z.object({label: z.string().nullable().optional(), value: z.number().nullable().optional(), alias: z.string().nullable().optional()}); export const advancedReviewType = z.object({visual: z.string().nullable().optional(), type: z.string().nullable().optional(), label: z.string().nullable().optional(), steps: z.number().int().optional(), rightMostSubLabel: z.string().nullable().optional(), leftMostSubLabel: z.string().nullable().optional(), options: z.array(advancedReviewTypeLabel).nullable().optional(), isRequired: z.boolean().optional()}); export const advancedReviewLabels = z.object({heading: z.string().nullable().optional(), reviewCountLabel: z.string().nullable().optional(), advancedReviews: z.array(advancedReviewType).nullable().optional(), advancedFieldErrorMsg: z.string().nullable().optional()}); export const reviewCarousel = z.object({reviewCarouselHeading: z.string().nullable().optional(), todayCarouselLabel: z.string().nullable().optional(), yesterdayCarouselLabel: z.string().nullable().optional(), daysAgoCarouselLabel: z.string().nullable().optional(), monthsAgoCarouselLabel: z.string().nullable().optional(), yearsAgoCarouselLabel: z.string().nullable().optional(), verifiedCustomerCarouselLabel: z.string().nullable().optional(), readFullReviewCarouselLabel: z.string().nullable().optional()}); export const widgetFlow = z.object({Session: z.string().nullable().optional(), Timestamp: z.string().nullable().optional(), Role: z.string().nullable().optional(), Flow: z.string().nullable().optional(), Deal: z.string().nullable().optional(), API: z.string().nullable().optional(), Click: z.string().nullable().optional(), Channel: z.string().nullable().optional(), Impression: z.string().nullable().optional(), User: z.string().nullable().optional(), Device: z.string().nullable().optional(), FlowStep: z.string().nullable().optional(), data: z.string().nullable().optional(), Latitude: z.number().optional(), Longitude: z.number().optional(), DeviceType: z.string().nullable().optional(), Resolution: z.string().nullable().optional(), OS: z.string().nullable().optional(), UserLanguage: z.string().nullable().optional(), BrowserType: z.string().nullable().optional(), Revenue: z.number().optional(), Total: z.number().optional(), DenyReason: z.string().nullable().optional(), Identity: z.string().nullable().optional(), OptIn: z.string().nullable().optional(), Site: z.string().nullable().optional(), currency: z.string().nullable().optional(), Company: z.string().nullable().optional(), contact: z.string().nullable().optional(), ImpressionType: z.string().nullable().optional(), code: z.string().nullable().optional(), referer: z.string().nullable().optional(), email: z.string().nullable().optional(), Agent: z.string().nullable().optional(), flowtype: z.string().nullable().optional(), ip: z.string().nullable().optional(), delay: z.number().int().optional(), trigger: z.string().nullable().optional(), emailaddrsha256: z.string().nullable().optional(), country: z.string().nullable().optional(), region: z.string().nullable().optional(), domain: z.string().nullable().optional(), path: z.string().nullable().optional(), sitecurrency: z.string().nullable().optional(), siteconversionrate: z.number().optional(), companycurrency: z.string().nullable().optional(), companyconversionrate: z.number().optional(), apiversion: z.string().nullable().optional(), scriptversion: z.string().nullable().optional(), tenant: z.string().nullable().optional(), salesforce: z.string().nullable().optional(), new_accepts_sms: z.boolean().optional(), new_accepts_email: z.boolean().optional(), new_accepts_postal: z.boolean().optional(), Item: z.string().nullable().optional(), NPS: z.number().optional()}); export const getRatingSummaryByItemResponse = z.object({success: z.boolean().optional(), message: z.string().nullable().optional(), data: ratingSummaryByItemData.optional(), badgeLabels: badgeLabels.optional(), addReviewLabels: addReviewLabels.optional(), reviewLabels: reviewLabels.optional(), addReviewButtonLabels: addReviewButtonLabels.optional(), distributionWidgetLabels: distributionWidgetLabels.optional(), summaryLabels: summaryLabels.optional(), highlightLabels: highlightLabels.optional(), advancedReviewLables: advancedReviewLabels.optional(), reviewCarousel: reviewCarousel.optional(), wf: z.array(widgetFlow).nullable().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * GET /api/Review/summary */ export const getApiApiReviewSummary = async (args: GetApiApiReviewSummaryArgs, options: GetApiApiReviewSummaryOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.siteId != null) query.append("siteId", String(args.siteId)) if (args.itemId != null) query.append("itemId", String(args.itemId)) if (args.rd != null) query.append("rd", String(args.rd)) const url = `${baseUrl.replace(/\/+$/, '')}/api/Review/summary${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(getRatingSummaryByItemResponse, await res.json()) };