import {z} from 'zod' export type DomainPublicAdapterWebApiModelsV1ListingsCommercialPriceSearch = {min?: number | undefined, max?: number | undefined, type?: ('totalAmount' | 'perSqm') | undefined}; export type DomainPublicAdapterWebApiModelsV1ListingsCommercialLocationSearch = {area?: string | undefined, postcode?: string | undefined, region?: string | undefined, state?: ('act' | 'nsw' | 'qld' | 'vic' | 'sa' | 'wa' | 'nt' | 'tas') | undefined, street?: string | undefined, suburb?: string | undefined}; export type DomainPublicAdapterWebApiModelsV1ListingsCommercialGeoPoint = {lat?: number | undefined, long?: number | undefined}; export type DomainPublicAdapterWebApiModelsV1ListingsCommercialGeoWindow = {polygon?: Array | undefined, boundingBox?: Array | undefined}; export type DomainPublicAdapterWebApiModelsV1ListingsCommercialParkingSearch = {type?: ('onSite' | 'onStreet' | 'noParking') | undefined, carspaces?: number | undefined}; export type DomainPublicAdapterWebApiModelsV1ListingsCommercialSearchRequest = {pageNumber?: number | undefined, advertiserId?: number | undefined, pageSize?: number | undefined, propertyTypes?: (Array<'unknown' | 'accessoriesParts' | 'accommodationTourism' | 'accounting' | 'acreageSemiRural' | 'adult' | 'advertisingMarketing' | 'aerial' | 'aeronautical' | 'agedCare' | 'agricultural' | 'air' | 'aircraft' | 'alarms' | 'alcoholLiquor' | 'amusements' | 'animalRelated' | 'apartmentUnitFlat' | 'aquaculture' | 'aquaticMarineMarinaBerth' | 'artsCrafts' | 'autoElectrical' | 'automotive' | 'backpackerHostel' | 'bakery' | 'barsNightclubs' | 'beautyHealth' | 'beautyProducts' | 'beautySalon' | 'bedAndBreakfast' | 'bikeAndMotorcycle' | 'blockOfUnits' | 'boardingKennels' | 'boatsMarineMarinaBerth' | 'bookkeeping' | 'brokerage' | 'builder' | 'buildingAndConstruction' | 'bus' | 'butcher' | 'cafeCoffeeShop' | 'car' | 'carBusTruck' | 'carDealership' | 'carRental' | 'carSpace' | 'carWash' | 'caravanPark' | 'carpenter' | 'catering' | 'childCare' | 'civil' | 'cleaning' | 'cleaningAndMaintenance' | 'clinicalPractice' | 'clothingAccessories' | 'clothingFootwear' | 'communication' | 'communications' | 'computerIT' | 'computerAndInternet' | 'construction' | 'convenienceStore' | 'copyLaminate' | 'courier' | 'cropHarvesting' | 'customs' | 'dairyFarming' | 'deli' | 'dental' | 'detailing' | 'developmentLand' | 'developmentSite' | 'distributors' | 'drivingSchools' | 'duplex' | 'educationTraining' | 'educational' | 'electrical' | 'employmentRecruitment' | 'entertainment' | 'entertainmentTechnology' | 'export' | 'farm' | 'farming' | 'fertiliser' | 'finance' | 'financialServices' | 'fishingForestry' | 'floristNursery' | 'foodBeverage' | 'foodBeverageHospitality' | 'franchiseBusinessOpportunities' | 'freight' | 'fruitVegFreshProduce' | 'fruitPicking' | 'functionCentre' | 'furnitureTimber' | 'gambling' | 'gardenHousehold' | 'gardenNurseries' | 'gardening' | 'glassCeramic' | 'guestHouseBB' | 'guesthouse' | 'hairdresser' | 'healthBeauty' | 'healthSpa' | 'hire' | 'homeGarden' | 'homeBased' | 'newHomeDesigns' | 'homewareHardware' | 'hospital' | 'hotel' | 'hotelLeisure' | 'hotelMotelPub' | 'house' | 'newHouseLand' | 'huntingTrap' | 'import' | 'importExportWholesale' | 'industrialManufacturing' | 'industrialWarehouse' | 'insemination' | 'insurance' | 'internationalNewDevelopment' | 'internet' | 'irrigationServices' | 'juiceBar' | 'landClearing' | 'newLand' | 'landscaping' | 'laundryDryCleaning' | 'legal' | 'leisureEntertainment' | 'limousineTaxi' | 'livestock' | 'internationalCommercial' | 'machinery' | 'machineryMetal' | 'managementRights' | 'manufacturers' | 'manufacturingEngineering' | 'marine' | 'massage' | 'mechanicalRepair' | 'media' | 'medical' | 'medicalConsulting' | 'medicalPractice' | 'miningEarthMoving' | 'mobileServices' | 'motel' | 'motorcycle' | 'musicRelated' | 'mustering' | 'nails' | 'naturalTherapies' | 'newApartments' | 'newsagency' | 'nursery' | 'nursingHome' | 'offices' | 'officeSupplies' | 'oilGas' | 'onStreet' | 'panelBeating' | 'paperPrinting' | 'parkingCarSpace' | 'penthouse' | 'pestRelated' | 'pharmacies' | 'plastic' | 'plumbing' | 'poolWater' | 'postOffices' | 'printPhoto' | 'professional' | 'propertyRealEstate' | 'rail' | 'recreationSport' | 'recruitment' | 'repair' | 'resort' | 'restaurant' | 'retail' | 'retailer' | 'retirementVillage' | 'road' | 'rural' | 'ruralCommercialFarming' | 'scientific' | 'sea' | 'security' | 'semiDetached' | 'serviceStation' | 'serviced' | 'services' | 'shearing' | 'showroomsBulkyGoods' | 'specialistFarm' | 'sportsComplexGym' | 'studio' | 'supermarket' | 'takeawayFood' | 'taxi' | 'terrace' | 'themePark' | 'tours' | 'townhouse' | 'training' | 'transportDistribution' | 'travel' | 'truck' | 'vacantLand' | 'vending' | 'villa' | 'water' | 'welding' | 'wholesale' | 'wholesalers' | 'withShowroomWarehouse' | 'withinShoppingComplex' | 'woolClassing' | 'wreckers' | 'tattersalls' | 'servicedOffices' | 'other' | 'alcoholGrocery' | 'cafeRestaurant' | 'discountStore' | 'ecoFriendly' | 'green' | 'grocery' | 'specialityRetail' | 'storage' | 'travelAgency' | 'varietyStore' | 'franchiseNew' | 'business'>) | undefined, price?: DomainPublicAdapterWebApiModelsV1ListingsCommercialPriceSearch | undefined, locations?: Array | undefined, keywords?: Array | undefined, geoWindow?: DomainPublicAdapterWebApiModelsV1ListingsCommercialGeoWindow | undefined, landAreaMin?: number | undefined, landAreaMax?: number | undefined, buildingSizeMin?: number | undefined, buildingSizeMax?: number | undefined, searchMode?: ('forSale' | 'forLease' | 'sold' | 'leased') | undefined, occupancy?: string | undefined, sort?: ('default' | 'newestFirst' | 'cheapestTotalFirst' | 'cheapestPerSqmFirst' | 'mostExpensiveTotalFirst' | 'mostExpensivePerSqmFirst' | 'suburbAsc' | 'suburbDesc' | 'buildingSizeAsc' | 'buildingSizeDesc') | undefined, saleType?: ('standardSale' | 'auction' | 'expressionOfInterest' | 'tender') | undefined, propertyTitle?: ('freehold' | 'strata' | 'noBuilding') | undefined, parking?: DomainPublicAdapterWebApiModelsV1ListingsCommercialParkingSearch | undefined, exclusionTypes?: (Array<'surroundingSuburbs' | 'withoutPrice'>) | undefined, annualReturn?: number | undefined}; export type CreateApiV1ListingsCommercialSearchArgs = {body: DomainPublicAdapterWebApiModelsV1ListingsCommercialSearchRequest}; export type CreateApiV1ListingsCommercialSearchOptions = {baseUrl?: string | undefined, apikey?: string | undefined, fetch?: typeof fetch | undefined}; export const domainPublicAdapterWebApiModelsV1ListingsCommercialAd = z.object({adType: z.string().optional(), url: z.string().optional()}); export const domainPublicAdapterWebApiModelsV1ListingsCommercialAdvertiserImages = z.object({agencyBannerImageUrl: z.string().optional(), agencyBannerWideImageUrl: z.string().optional(), logoUrl: z.string().optional()}); export const domainPublicAdapterWebApiModelsV1ListingsCommercialPhoneNumber = z.object({displayLabel: z.string().optional(), type: z.string().optional(), number: z.string().optional()}); export const domainPublicAdapterWebApiModelsV1ListingsCommercialContact = z.object({id: z.number().int().optional(), firstName: z.string().optional(), lastName: z.string().optional(), imageUrl: z.string().optional(), displayFullName: z.string().optional(), phoneNumbers: z.array(domainPublicAdapterWebApiModelsV1ListingsCommercialPhoneNumber).optional(), emailAddress: z.string().optional(), address: z.string().optional()}); export const domainPublicAdapterWebApiModelsV1ListingsCommercialAdvertiser = z.object({address: z.string().optional(), id: z.number().int().optional(), name: z.string().optional(), preferredColorHex: z.string().optional(), images: domainPublicAdapterWebApiModelsV1ListingsCommercialAdvertiserImages.optional(), contacts: z.array(domainPublicAdapterWebApiModelsV1ListingsCommercialContact).optional(), isConjunctional: z.boolean().optional()}); export const domainPublicAdapterWebApiModelsV1ListingsCommercialGeoLocation = z.object({latitude: z.number().optional(), longitude: z.number().optional()}); export const domainPublicAdapterWebApiModelsV1ListingsCommercialMedia = z.object({dateCreated: z.string().optional(), imageUrl: z.string().optional(), mediaType: z.string().optional(), type: z.string().optional(), videoUrl: z.string().optional()}); export const domainPublicAdapterWebApiModelsV1ListingsCommercialAddressComponents = z.object({area: z.string().optional(), district: z.string().optional(), postcode: z.string().optional(), region: z.string().optional(), stateShort: z.string().optional(), street: z.string().optional(), streetNumber: z.string().optional(), suburb: z.string().optional(), unitNumber: z.string().optional()}); export const domainPublicAdapterWebApiModelsV1ListingsCommercialMetadata = z.object({addressComponents: domainPublicAdapterWebApiModelsV1ListingsCommercialAddressComponents.optional()}); export const domainPublicAdapterWebApiModelsV1ListingsCommercialListing = z.object({ad: domainPublicAdapterWebApiModelsV1ListingsCommercialAd.optional(), price: z.string().optional(), advertiser: domainPublicAdapterWebApiModelsV1ListingsCommercialAdvertiser.optional(), geoLocation: domainPublicAdapterWebApiModelsV1ListingsCommercialGeoLocation.optional(), propertyArea: z.string().optional(), propertyType: z.string().optional(), address: z.string().optional(), headline: z.string().optional(), hasVideo: z.boolean().optional(), media: z.array(domainPublicAdapterWebApiModelsV1ListingsCommercialMedia).optional(), auctionDate: z.string().optional(), id: z.number().int().optional(), metadata: domainPublicAdapterWebApiModelsV1ListingsCommercialMetadata.optional(), carspaceCount: z.number().int().optional()}); export const createApiV1ListingsCommercialSearchResponse = z.array(domainPublicAdapterWebApiModelsV1ListingsCommercialListing); 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 }; /** * Retrieves commercial listings matching the specified criteria. * * POST /v1/listings/commercial/_search * * Also accepts auth: oauth2 */ export const createApiV1ListingsCommercialSearch = async (args: CreateApiV1ListingsCommercialSearchArgs, options?: CreateApiV1ListingsCommercialSearchOptions) => { const {baseUrl = "https://api.domain.com.au", fetch: fetchFn = fetch, apikey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (apikey !== undefined) headers.set("x-api-key", apikey) const url = `${baseUrl.replace(/\/+$/, '')}/v1/listings/commercial/_search${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(createApiV1ListingsCommercialSearchResponse, await res.json()) };