import {z} from 'zod' export type GetApiV1ContentLibraryArgs = {contentId?: string | undefined, contentType?: ('ENGAGEMENT' | 'GUIDE' | 'SLIDER' | 'DIALOG' | 'SURVEY' | 'ARTICLE' | 'LINKED_ARTICLE' | 'LINK' | 'FUNC_CALL') | undefined, excludeContentIds?: Array | undefined, pageNumber?: number | undefined, pageSize?: number | undefined, productId?: string | undefined, searchTerms?: string | undefined, sortColumnName?: Array | undefined, sortOrder?: string | undefined}; export type GetApiV1ContentLibraryOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const userView = z.object({id: z.string().optional(), name: z.string().optional()}); export const kCContentExternalListViewDto = z.object({additionalInfo: z.string().optional(), articleProvider: z.enum(["ARTICLE_PROVIDER_UNDEFINED", "ZENDESK_ARTICLE_PROVIDER", "HELP_DOCS_ARTICLE_PROVIDER", "SALESFORCE_ARTICLE_PROVIDER", "MINDTOUCH_ARTICLE_PROVIDER", "BLOOMFIRE_ARTICLE_PROVIDER", "TI_ARTICLE_PROVIDER", "GOOGLE_SEARCH_PROVIDER", "HIGHER_LOGIC_PROVIDER", "CONTENTFUL_PROVIDER", "COVEO_PROVIDER", "ZOOM_IN_PROVIDER", "UNRECOGNIZED"]).optional(), contentId: z.string().optional(), contentType: z.enum(["GUIDE", "ANNOUNCEMENT", "SLIDER", "LINK", "BOOLEAN_SURVEY", "RATING_SURVEY", "NPS_SURVEY", "CES_SURVEY", "MULTIPLE_QUESTION_SURVEY", "ARTICLE", "KNOWLEDGE_BASE_ARTICLE", "CUSTOM_LINK", "FUNC_CALL", "COMMUNITY"]).optional(), createdBy: userView.optional(), createdDate: z.number().int().optional(), description: z.string().optional(), displayName: z.string().optional(), id: z.string().optional(), imageUrl: z.string().optional(), lastModifiedBy: userView.optional(), lastModifiedDate: z.number().int().optional(), name: z.string().optional()}); export const sortPageDto = z.object({direction: z.string().optional(), property: z.string().optional()}); export const kCContentExternalListViewPage = z.object({content: z.array(kCContentExternalListViewDto).optional(), first: z.boolean().optional(), last: z.boolean().optional(), number: z.number().int().optional(), numberOfElements: z.number().int().optional(), size: z.number().int().optional(), sort: z.array(sortPageDto).optional(), totalElements: z.number().int().optional(), totalPages: z.number().int().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 Content Library * * GET /v1/content-library */ export const getApiV1ContentLibrary = async (args: GetApiV1ContentLibraryArgs, options?: GetApiV1ContentLibraryOptions) => { const {baseUrl = "https://app.aptrinsic.com", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.contentId != null) query.append("contentId", String(args.contentId)) if (args.contentType != null) query.append("contentType", String(args.contentType)) for (const item of args.excludeContentIds ?? []) query.append("excludeContentIds", String(item)) if (args.pageNumber != null) query.append("pageNumber", String(args.pageNumber)) if (args.pageSize != null) query.append("pageSize", String(args.pageSize)) if (args.productId != null) query.append("productId", String(args.productId)) if (args.searchTerms != null) query.append("searchTerms", String(args.searchTerms)) for (const item of args.sortColumnName ?? []) query.append("sortColumnName", String(item)) if (args.sortOrder != null) query.append("sortOrder", String(args.sortOrder)) const url = `${baseUrl.replace(/\/+$/, '')}/v1/content-library${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(kCContentExternalListViewPage, await res.json()) };