import {z} from 'zod' export type GetApiLocationsOwnerIdForProPageArgs = {owner_id: number}; export type GetApiLocationsOwnerIdForProPageOptions = {baseUrl: string, Bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const proPageFallback = z.object({city: z.string().optional(), state: z.string().optional()}); export const locAvailabilityInfo = z.object({end_time: z.number().int().optional(), start_time: z.number().int().optional(), unavailable: z.boolean().optional()}); export const locAvailabilityDay = z.object({dropoff: locAvailabilityInfo.optional(), pickup: locAvailabilityInfo.optional()}); export const locAvailability = z.object({days: z.record(z.string(), locAvailabilityDay).optional()}); export const locationLocale = z.object({base_currency: z.string().optional()}); export const specialHourDropoff = z.object({end_time: z.number().int().optional(), start_time: z.number().int().optional(), unavailable: z.boolean().optional()}); export const specialHourPickup = z.object({end_time: z.number().int().optional(), start_time: z.number().int().optional(), unavailable: z.boolean().optional()}); export const dBStringSlice = z.array(z.string()); export const specialHour = z.object({created: z.string().optional(), created_from_id: z.number().int().optional(), dropoff: specialHourDropoff.optional(), end_date: z.string().optional(), id: z.number().int().optional(), location_id: z.number().int().nullable().optional(), name: z.string().optional(), owner_id: z.number().int().optional(), pickup: specialHourPickup.optional(), repeats: z.boolean().optional(), start_date: z.string().optional(), updated: z.string().optional(), weekdays: dBStringSlice.optional()}); export const taxRate = z.object({archived: z.boolean().optional(), created: z.string().optional(), description: z.string().optional(), id: z.number().int().optional(), marketplace: z.boolean().optional(), name: z.string().optional(), owner_id: z.number().int().optional(), rate: z.number().optional(), state: z.string().optional(), updated: z.string().optional(), zip_code: z.string().optional()}); export const location = z.object({archived: z.boolean().optional(), availability: locAvailability.optional(), city: z.string().optional(), country: z.string().optional(), county: z.string().optional(), created: z.string().optional(), custom_insurance_text: z.string().nullable().optional(), dropoff_end_time: z.number().int().optional(), dropoff_start_time: z.number().int().optional(), eligible_for_system_tax_rates: z.boolean().optional(), employer_identification_number: z.string().optional(), id: z.number().int().optional(), lat: z.number().optional(), lng: z.number().optional(), locale: locationLocale.optional(), name: z.string().optional(), opt_out_marketplace_taxes: z.boolean().optional(), owner_id: z.number().int().optional(), payment_processing_info_id: z.number().int().optional(), phone: z.string().optional(), pickup_end_time: z.number().int().optional(), pickup_start_time: z.number().int().optional(), rental_count: z.number().int().optional(), special_hours: z.array(specialHour).optional(), state: z.string().optional(), state_tax_id: z.string().optional(), street: z.string().optional(), street_etc: z.string().optional(), tax_rate_id: taxRate.optional(), tax_rate_ids: z.array(z.number().int()).optional(), tax_split_eligible: z.boolean().optional(), updated: z.string().optional(), waived_insurance_text: z.string().nullable().optional(), zip: z.string().optional()}); export const proPageResponse = z.object({fallback: proPageFallback.optional(), locations: z.array(location).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 }; /** * List dealer locations for his pro page (locations with connected bank account, ordered by having the most rentals desc). Provide falback in the form of city and state with most bookable rentals * * GET /locations/{owner_id}/for-pro-page * * Also accepts auth: API-Key */ export const getApiLocationsOwnerIdForProPage = async (args: GetApiLocationsOwnerIdForProPageArgs, options: GetApiLocationsOwnerIdForProPageOptions) => { const {baseUrl, fetch: fetchFn = fetch, Bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (Bearer !== undefined) headers.set("Authorization", Bearer) const url = `${baseUrl.replace(/\/+$/, '')}/locations/${encodeURIComponent(String(args.owner_id))}/for-pro-page${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(proPageResponse, await res.json()) };