import {z} from 'zod' export type GoogleAdsSearchads360V23ResourcesYoutubeVideoIdentifier = {channelId?: string | undefined, videoId?: string | undefined}; export type GoogleAdsSearchads360V23ResourcesDataLink = {dataLinkId?: unknown | undefined, productLinkId?: unknown | undefined, resourceName?: string | undefined, status?: ('UNSPECIFIED' | 'UNKNOWN' | 'REQUESTED' | 'PENDING_APPROVAL' | 'ENABLED' | 'DISABLED' | 'REVOKED' | 'REJECTED') | undefined, type?: ('UNSPECIFIED' | 'UNKNOWN' | 'VIDEO') | undefined, youtubeVideo?: GoogleAdsSearchads360V23ResourcesYoutubeVideoIdentifier | undefined}; export type GoogleAdsSearchads360V23ServicesCreateDataLinkRequest = {dataLink?: GoogleAdsSearchads360V23ResourcesDataLink | undefined}; export type CreateApiV23CustomersCustomersIdDataLinksCreateArgs = {customersId: string, body: GoogleAdsSearchads360V23ServicesCreateDataLinkRequest}; export type CreateApiV23CustomersCustomersIdDataLinksCreateOptions = {baseUrl?: string | undefined, Oauth2?: string | undefined, Oauth2c?: string | undefined, fetch?: typeof fetch | undefined}; export const googleAdsSearchads360V23ServicesCreateDataLinkResponse = z.object({resourceName: z.string().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 }; /** * Creates a data link. The requesting Google Ads account name and account ID will be shared with the third party (such as YouTube creators for video links) to whom you are creating the link with. Only customers on the allow-list can create data links. List of thrown errors: [AuthenticationError]() [AuthorizationError]() [DatabaseError]() [DataLinkError]() [FieldError]() [HeaderError]() [InternalError]() [MutateError]() [QuotaError]() [RequestError]() * * POST /v23/customers/{customersId}/dataLinks:create */ export const createApiV23CustomersCustomersIdDataLinksCreate = async (args: CreateApiV23CustomersCustomersIdDataLinksCreateArgs, options?: CreateApiV23CustomersCustomersIdDataLinksCreateOptions) => { const {baseUrl = "https://searchads360.googleapis.com", fetch: fetchFn = fetch, Oauth2, Oauth2c} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (Oauth2 !== undefined) headers.set('authorization', `Bearer ${Oauth2}`) if (Oauth2c !== undefined) headers.set('authorization', `Bearer ${Oauth2c}`) const url = `${baseUrl.replace(/\/+$/, '')}/v23/customers/${encodeURIComponent(String(args.customersId))}/dataLinks:create${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(googleAdsSearchads360V23ServicesCreateDataLinkResponse, await res.json()) };