import {z} from 'zod' export type GetApiMcnYoutubeChannelsArgs = {pageNumber?: number | undefined, pageSize?: number | undefined, orderByProperty?: string | undefined, orderByDescending?: boolean | undefined, isAssignedToTenant?: boolean | undefined, isAssignedToChild?: boolean | undefined, youTubeId?: string | undefined, handle?: string | undefined, title?: string | undefined, searchText?: string | undefined, isDeleted?: boolean | undefined, publishedFrom?: string | undefined, publishedTo?: string | undefined, viewCountFrom?: number | undefined, viewCountTo?: number | undefined, subscriberCountFrom?: number | undefined, subscriberCountTo?: number | undefined, videoCountFrom?: number | undefined, videoCountTo?: number | undefined, visibility?: string | undefined, madeForKids?: boolean | undefined, isMonetized?: boolean | undefined, lastImportedFrom?: string | undefined, lastImportedTo?: string | undefined, creationDateFrom?: string | undefined, creationDateTo?: string | undefined, enterpriseIds?: Array | undefined, tenantIds?: Array | undefined}; export type GetApiMcnYoutubeChannelsOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const youTubeChannelDto = z.object({youTubeChannelId: z.number().int().optional(), multiChannelNetworkId: z.number().int().optional(), tenantId: z.number().int().optional(), tenantName: z.string().optional(), tenantLogoImageId: z.string().optional(), enterpriseId: z.number().int().optional(), enterpriseName: z.string().optional(), youTubeId: z.string().optional(), handle: z.string().optional(), title: z.string().optional(), description: z.string().optional(), publishedAt: z.string().optional(), viewCount: z.number().int().optional(), subscriberCount: z.number().int().optional(), videoCount: z.number().int().optional(), visibility: z.string().optional(), madeForKids: z.boolean().optional(), isMonetized: z.boolean().optional(), imageDefaultUrl: z.string().optional(), imageMediumUrl: z.string().optional(), imageHighUrl: z.string().optional(), lastUpdatedDate: z.string().optional(), creationDate: z.string().optional(), assetId: z.number().int().optional(), isDeleted: z.boolean().optional(), deletionDate: z.string().optional()}); export const pagedListYouTubeChannelDto = z.object({totalItemsCount: z.number().int().optional(), pageNumber: z.number().int().optional(), pageSize: z.number().int().optional(), items: z.array(youTubeChannelDto).optional(), additionalCounters: z.record(z.string(), z.number()).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 /mcn/youtube/channels */ export const getApiMcnYoutubeChannels = async (args: GetApiMcnYoutubeChannelsArgs, options?: GetApiMcnYoutubeChannelsOptions) => { const {baseUrl = "http://api.revelator.com", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.pageNumber != null) query.append("pageNumber", String(args.pageNumber)) if (args.pageSize != null) query.append("pageSize", String(args.pageSize)) if (args.orderByProperty != null) query.append("orderByProperty", String(args.orderByProperty)) if (args.orderByDescending != null) query.append("orderByDescending", String(args.orderByDescending)) if (args.isAssignedToTenant != null) query.append("isAssignedToTenant", String(args.isAssignedToTenant)) if (args.isAssignedToChild != null) query.append("isAssignedToChild", String(args.isAssignedToChild)) if (args.youTubeId != null) query.append("youTubeId", String(args.youTubeId)) if (args.handle != null) query.append("handle", String(args.handle)) if (args.title != null) query.append("title", String(args.title)) if (args.searchText != null) query.append("searchText", String(args.searchText)) if (args.isDeleted != null) query.append("isDeleted", String(args.isDeleted)) if (args.publishedFrom != null) query.append("publishedFrom", String(args.publishedFrom)) if (args.publishedTo != null) query.append("publishedTo", String(args.publishedTo)) if (args.viewCountFrom != null) query.append("viewCountFrom", String(args.viewCountFrom)) if (args.viewCountTo != null) query.append("viewCountTo", String(args.viewCountTo)) if (args.subscriberCountFrom != null) query.append("subscriberCountFrom", String(args.subscriberCountFrom)) if (args.subscriberCountTo != null) query.append("subscriberCountTo", String(args.subscriberCountTo)) if (args.videoCountFrom != null) query.append("videoCountFrom", String(args.videoCountFrom)) if (args.videoCountTo != null) query.append("videoCountTo", String(args.videoCountTo)) if (args.visibility != null) query.append("visibility", String(args.visibility)) if (args.madeForKids != null) query.append("madeForKids", String(args.madeForKids)) if (args.isMonetized != null) query.append("isMonetized", String(args.isMonetized)) if (args.lastImportedFrom != null) query.append("lastImportedFrom", String(args.lastImportedFrom)) if (args.lastImportedTo != null) query.append("lastImportedTo", String(args.lastImportedTo)) if (args.creationDateFrom != null) query.append("creationDateFrom", String(args.creationDateFrom)) if (args.creationDateTo != null) query.append("creationDateTo", String(args.creationDateTo)) for (const item of args.enterpriseIds ?? []) query.append("enterpriseIds", String(item)) for (const item of args.tenantIds ?? []) query.append("tenantIds", String(item)) const url = `${baseUrl.replace(/\/+$/, '')}/mcn/youtube/channels${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(pagedListYouTubeChannelDto, await res.json()) };