import {z} from 'zod' export type CreateApiLocationsArgs = {Authorization: string, body: {input?: ({tenure?: string | undefined, storeId?: (string | null) | undefined, subCategoryId: number, name: string, street: string, street1?: string | undefined, city: string, postalCode: string, phone: string, stateIso: string, countryIso: string, description: string, ownerEmail?: string | undefined, ownerName?: string | undefined, bizUrl?: string | undefined, facebookUrl?: string | undefined, twitterUrl?: string | undefined, linkedinUrl?: string | undefined, instagramUrl?: string | undefined, youtubeUrl?: string | undefined, tiktokUrl?: string | undefined, pinterestUrl?: string | undefined, tagline?: string | undefined, paymentMethods?: (Array<'VISA' | 'MASTERCARD' | 'AMEX' | 'CASH' | 'CHEQUE' | 'CRYPTO' | 'DINERS_CLUB' | 'DISCOVER' | 'FINANCING' | 'INVOICE' | 'TRAVELERS_CHECK' | 'APPLE_PAY' | 'SAMSUNG_PAY' | 'PAYPAL' | 'ANDROID_PAY'>) | undefined, yearOfIncorporation?: number | undefined, hideAddress?: boolean | undefined, businessHours?: (Array<{day: 'MONDAY' | 'TUESDAY' | 'WEDNESDAY' | 'THURSDAY' | 'FRIDAY' | 'SATURDAY' | 'SUNDAY', slots: Array<{start?: string | undefined, end?: string | undefined}>, type: 'OPEN' | 'OPEN_24x7' | 'CLOSED'}>) | undefined, additionalCategoryIds?: Array | undefined, videos?: Array | undefined, enabledSiteIds?: Array | undefined, submissionDisabledSiteIds?: Array | undefined, temporarilyClosed?: boolean | undefined, additionalPhones?: Array | undefined, googleAdsPhone?: string | undefined, bookingUrl?: (string | null) | undefined, offeringsUrl?: (string | null) | undefined, reservationUrl?: (string | null) | undefined, placeActionLinks?: (Array<{placeActionType: 'APPOINTMENT' | 'ONLINE_APPOINTMENT' | 'DINING_RESERVATION' | 'FOOD_ORDERING' | 'FOOD_DELIVERY' | 'FOOD_TAKEOUT' | 'SHOP_ONLINE', isPreferred?: boolean | undefined, uri: string}>) | undefined}) | undefined}}; export type CreateApiLocationsOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const createApiLocationsResponse = z.object({data: z.object({createLocation: z.object({errors: z.unknown(), 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().nullable().optional(), bookingUrl: z.string().nullable().optional(), categoryId: z.number().int(), businessHours: z.array(z.object({day: z.enum(["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY", "SPECIAL"]), slots: z.array(z.object({start: z.string().optional(), end: z.string().optional()})), type: z.enum(["OPEN", "OPEN_24x7", "CLOSED"]), specialDate: z.string().optional()})).optional(), city: z.string(), countryIso: z.string(), customAttributes: z.array(z.object({archived: z.boolean().optional(), enumValues: z.array(z.string()).optional(), name: z.string().optional(), slug: z.string().optional(), type: z.string().optional(), value: z.array(z.string()).optional()})), databaseId: z.number().int(), description: z.string(), facebookUrl: z.string().nullable().optional(), folderId: z.string(), folderName: z.string(), googleAdsPhone: z.string(), googleplusUrl: z.unknown(), hideAddress: z.boolean(), id: z.string(), instagramUrl: z.string().nullable().optional(), isRestaurant: z.boolean().optional(), latitude: z.number(), linkedinUrl: z.string().optional(), locationPhotos: z.array(z.string()), longitude: z.number(), moreHours: z.array(z.string()), name: z.string(), offeringsUrl: z.string().nullable().optional(), 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.string(), 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(), placeActionLinks: z.array(z.object({placeActionType: z.enum(["FOOD_ORDERING FOOD_ORDERING", "ONLINE_APPOINTMENT", "APPOINTMENT", "DINING_RESERVATION", "FOOD_DELIVERY", "FOOD_TAKEOUT", "SHOP_ONLINE"]), uri: z.string(), isPreferred: z.boolean().optional(), name: z.string().optional(), submissionStatus: z.string().optional(), submissionMessage: z.string().optional(), lastSubmittedAt: z.string().optional(), isEditable: z.string().optional()})).optional(), discoveredPlaceActionLinks: z.array(z.object({placeActionType: z.string(), uri: z.string(), isPreferred: z.boolean(), name: z.string(), providerType: z.string(), isEditable: z.boolean()})).optional()}).optional(), success: z.boolean().optional(), warnings: z.array(z.string()).optional()}).optional()}).optional(), message: 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 }; /** * Create a new business location * * POST /locations */ export const createApiLocations = async (args: CreateApiLocationsArgs, options?: CreateApiLocationsOptions) => { 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${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(createApiLocationsResponse, await res.json()) };