import {z} from 'zod' export type GetApiApiCoursesContentIdUsageArgs = {contentId: number}; export type GetApiApiCoursesContentIdUsageOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const audit = z.object({createdTime: z.string().optional(), modifiedTime: z.string().optional(), modifiedBy: z.string().max(32).optional()}); export const audiencePromoLocaleValues = z.object({actionText: z.string().optional()}); export const pageLocaleValues = z.object({detail: z.string().optional(), body: z.string().optional(), shortTitle: z.string().max(40).optional(), subTitle: z.string().max(255).optional(), title: z.string().max(255), audiencePromo: audiencePromoLocaleValues.optional(), externalCssUrl: z.string().max(255).optional()}); export const audiencePromo = z.object({contentId: z.number().int().optional(), actionText: z.string().max(40).optional(), localizedValues: audiencePromoLocaleValues.optional()}); export const pageCore = z.object({audit: audit.optional(), alternateLocales: z.object({empty: z.boolean().optional()}).and(z.record(z.string(), pageLocaleValues)).optional(), pageId: z.number().int().optional(), membershipId: z.number().int().optional(), token: z.string().optional(), typeCode: z.enum(["BLOCK", "BOOK", "PAGE", "SPLASH"]).optional(), sharedMembershipId: z.number().int().optional(), sharedPageId: z.number().int().optional(), title: z.string().optional(), subTitle: z.string().optional(), shortTitle: z.string().optional(), detail: z.string().optional(), body: z.string().optional(), slug: z.string().optional(), publishStartDate: z.string().optional(), publishEndDate: z.string().optional(), external: z.boolean().optional(), previewing: z.boolean().optional(), defaultViewType: z.string().optional(), defaultSort: z.enum(["ALPHABETICAL", "REVERSE_CHRONOLOGICAL", "PRIORITY"]).optional(), parentPageId: z.number().int().optional(), priority: z.number().int().optional(), coverImageUuid: z.string().optional(), thumbnailImageUuid: z.string().optional(), coverVideoUrl: z.string().optional(), externalPluginId: z.number().int().optional(), externalId: z.string().optional(), sponsorId: z.number().int().optional(), audienceId: z.number().int().optional(), audiencePromo: audiencePromo.optional(), splashDisplayMax: z.number().int().optional(), externalCssUrl: z.string().optional(), locale: z.string().optional(), isPublished: z.boolean().optional(), isPrivate: z.boolean().optional()}); export const contentUsage = z.object({pages: z.array(pageCore).optional()}); export const contentUsageResponse = z.object({success: z.boolean().optional(), error: z.string().optional(), usage: contentUsage.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 usage information for a course. Roles: admin. * * GET /api/courses/{contentId}/usage */ export const getApiApiCoursesContentIdUsage = async (args: GetApiApiCoursesContentIdUsageArgs, options: GetApiApiCoursesContentIdUsageOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/api/courses/${encodeURIComponent(String(args.contentId))}/usage${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(contentUsageResponse, await res.json()) };