import {z} from 'zod' export type CreateApiLocationsUpdateArgs = {Authorization: string, body: {input: {id: string, name?: string | undefined, archived?: boolean | undefined, archivedAt?: (string | null) | undefined, billingPeriod?: (string | null) | undefined, bizUrl?: string | undefined, bookingUrl: unknown, businessHours?: (Array<{day: 'MONDAY' | 'TUESDAY' | 'WEDNESDAY' | 'THURSDAY' | 'FRIDAY' | 'SATURDAY' | 'SUNDAY' | 'SPECIAL', slots: Array<{start?: string | undefined, end?: string | undefined}>, type: 'OPEN' | 'OPEN_24x7' | 'CLOSED', specialDate?: string | undefined}>) | undefined, city?: string | undefined, countryIso?: string | undefined, customAttributes?: (Array<{archived?: boolean | undefined, enumValues?: Array | undefined, name?: string | undefined, slug?: string | undefined, type?: string | undefined, value?: Array | undefined}>) | undefined, description?: string | undefined, facebookUrl?: string | undefined, googleAdsPhone?: string | undefined, hideAddress?: boolean | undefined, instagramUrl?: string | undefined, linkedinUrl?: string | undefined, offeringsUrl: unknown, ownerEmail?: string | undefined, ownerName?: string | undefined, paymentMethods?: Array | undefined, phone?: string | undefined, additionalPhones?: Array | undefined, pinterestUrl?: string | undefined, postalCode?: string | undefined, reservationUrl: unknown, serviceItems?: Array | undefined, stateIso?: string | undefined, storeId: unknown, street?: string | undefined, street1?: string | undefined, subCategoryId?: number | undefined, additionalCategoryIds?: Array | undefined, tagline?: string | undefined, tags?: Array | undefined, temporarilyClosed?: boolean | undefined, tiktokUrl: unknown, twitterUrl?: string | undefined, videos?: Array | undefined, yearOfIncorporation?: number | undefined, youtubeUrl: unknown, enabledSiteIds?: Array | undefined, submissionDisabledSiteIds?: Array | undefined, placeActionLinks: Array<{placeActionType: 'APPOINTMENT' | 'ONLINE_APPOINTMENT' | 'DINING_RESERVATION' | 'FOOD_ORDERING' | 'FOOD_DELIVERY' | 'FOOD_TAKEOUT', isPreferred: boolean, uri: string, name?: string | undefined, action?: string | undefined}>}}}; export type CreateApiLocationsUpdateOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const createApiLocationsUpdateResponse = z.object({data: z.object({updateLocation: z.object({clientMutationId: z.unknown(), errors: z.array(z.object({code: z.string().optional(), contextInfo: z.array(z.object({key: z.string().optional(), value: z.string().optional()})).optional(), message: z.string().optional()})).nullable(), location: z.object({accountId: z.number().int(), additionalCategoryIds: z.array(z.string()), additionalInfo: z.unknown(), additionalPhones: z.array(z.string()), archived: z.boolean(), archivedAt: z.unknown(), billingPeriod: z.unknown(), bizUrl: z.string(), bookingUrl: z.unknown(), businessHours: z.array(z.object({day: z.string(), slots: z.array(z.object({end: z.string(), start: z.string()})), specialDate: z.string().nullable(), type: z.string()})), categoryId: z.number().int(), city: z.string(), countryIso: z.string(), customAttributes: z.array(z.object({archived: z.boolean(), enumValues: z.array(z.string()), name: z.string(), slug: z.string(), type: z.string(), value: z.array(z.string())})), databaseId: z.number().int(), description: z.string(), facebookUrl: z.string(), folderId: z.string(), folderName: z.string(), googleAdsPhone: z.string(), googleplusUrl: z.unknown(), hideAddress: z.boolean(), id: z.string(), instagramUrl: z.string(), isRestaurant: z.boolean(), latitude: z.number(), linkedinUrl: z.string(), locationPhotos: z.array(z.string()), longitude: z.number(), moreHours: z.array(z.string()), name: z.string(), offeringsUrl: z.unknown(), ownerEmail: z.string(), ownerName: z.string(), package: z.string(), paymentMethods: z.array(z.string()), phone: z.string(), pinterestUrl: z.string(), planId: z.number().int(), planName: z.string(), postalCode: z.string(), publisherAttributes: z.array(z.string()), reservationUrl: z.unknown(), serviceItems: z.array(z.string()), stateIso: z.string(), storeId: z.unknown(), street: z.string(), street1: z.string(), subCategory: z.object({databaseId: z.number().int(), id: z.string(), name: z.string(), primary: z.boolean()}), subCategoryId: z.number().int(), subCategoryName: z.string(), tagline: z.string(), tags: z.array(z.string()), temporarilyClosed: z.boolean(), tiktokUrl: z.unknown(), toplineMessage: z.unknown(), toplineMessageText: z.unknown(), twitterUrl: z.string(), videos: z.array(z.string()), yearOfIncorporation: z.number().int(), youtubeUrl: z.unknown()}), success: z.boolean(), warnings: z.array(z.string()), code: z.string()})})}); 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 }; /** * Update business location * * POST /locations/update */ export const createApiLocationsUpdate = async (args: CreateApiLocationsUpdateArgs, options?: CreateApiLocationsUpdateOptions) => { const {baseUrl = "https://api.synup.com/api/v4", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args.Authorization != null) headers.set("Authorization", String(args.Authorization)) const url = `${baseUrl.replace(/\/+$/, '')}/locations/update${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(createApiLocationsUpdateResponse, await res.json()) };