import {z} from 'zod' export type GetApiApiFilesListingsListingGuidArgs = {listingGuid: unknown}; export type GetApiApiFilesListingsListingGuidOptions = {baseUrl?: string | undefined, OpenIdConnect?: string | undefined, fetch?: typeof fetch | undefined}; export const checklistComment = z.object({comment: z.string().nullable().optional(), createdBy: z.string().nullable().optional(), createdOn: z.string().nullable().optional()}); export const checklistDocument = z.object({id: z.string().nullable().optional(), name: z.string().nullable().optional(), url: z.string().nullable().optional(), documentServiceKey: z.string().nullable().optional(), modifiedDate: z.string().nullable().optional(), uploadDate: z.string().nullable().optional(), dateAssigned: z.string().nullable().optional(), fileName: z.string().nullable().optional(), extension: z.string().nullable().optional(), fileSize: z.number().int().nullable().optional(), pages: z.number().int().nullable().optional()}); export const checklistActivity = z.object({activityId: z.number().int().optional(), activityName: z.string().nullable().optional(), dateAssigned: z.string().nullable().optional(), comments: z.array(checklistComment).nullable().optional(), docs: z.array(z.string()).nullable().optional(), checklistDocs: z.array(checklistDocument).nullable().optional(), help: z.string().nullable().optional(), order: z.number().int().optional(), status: z.string().nullable().optional(), typeId: z.number().int().optional(), typeName: z.string().nullable().optional(), modifiedOn: z.string().nullable().optional()}); export const checklist = z.object({activities: z.array(checklistActivity).nullable().optional(), typeId: z.number().int().optional(), typeName: z.string().nullable().optional()}); export const transactionCoordinatorDTO = z.object({contactGuid: z.string().optional(), firstName: z.string().nullable().optional(), lastName: z.string().nullable().optional(), fullName: z.string().nullable().optional(), email: z.string().nullable().optional(), phoneNumber: z.string().nullable().optional(), notes: z.string().nullable().optional(), fee: z.number().nullable().optional(), hasAccess: z.boolean().optional()}); export const commercialLeaseDTO = z.object({size: z.number().nullable().optional(), sizeType: z.string().nullable().optional()}); export const commissionDTO = z.object({commissionBreakdown: z.string().nullable().optional(), listingCommissionAmount: z.number().nullable().optional(), listingCommissionPercent: z.number().nullable().optional(), officeGrossCommission: z.number().nullable().optional(), referralAmount: z.number().nullable().optional(), referralAmountPercent: z.number().nullable().optional(), saleCommissionPercent: z.number().nullable().optional(), salesCommissionAmount: z.number().nullable().optional(), transCoordinatorFee: z.number().nullable().optional(), adminBrokerageComp: z.number().nullable().optional()}); export const commissionReferralContact = z.object({email: z.string().nullable().optional(), firstName: z.string().nullable().optional(), guid: z.string().optional(), lastName: z.string().nullable().optional(), phoneNumber: z.string().nullable().optional()}); export const commissionReferral = z.object({amount: z.number().nullable().optional(), brokerageName: z.string().nullable().optional(), contact: commissionReferralContact.nullable().optional(), percent: z.number().nullable().optional()}); export const homeWarrantyContactDTO2 = z.object({company: z.string().nullable().optional(), confirmationNumber: z.string().nullable().optional(), contactGuid: z.string().optional(), notes: z.string().nullable().optional(), phoneNumber: z.string().nullable().optional(), representativeName: z.string().nullable().optional()}); export const miscellaneousContactDTO2 = z.object({alternatePhone: z.string().nullable().optional(), city: z.string().nullable().optional(), company: z.string().nullable().optional(), contactGuid: z.string().optional(), email: z.string().nullable().optional(), fax: z.string().nullable().optional(), firstName: z.string().nullable().optional(), lastName: z.string().nullable().optional(), miscContactType: z.string().nullable().optional(), notes: z.string().nullable().optional(), phoneNumber: z.string().nullable().optional(), state: z.string().nullable().optional(), streetName: z.string().nullable().optional(), streetNumber: z.string().nullable().optional(), zip: z.string().nullable().optional()}); export const propertyDTO = z.object({areasqft: z.string().nullable().optional(), city: z.string().nullable().optional(), county: z.string().nullable().optional(), direction: z.string().nullable().optional(), realPropertySubtypeId: z.number().int().nullable().optional(), realPropertyTypeId: z.number().int().nullable().optional(), state: z.string().nullable().optional(), streetAddress: z.string().nullable().optional(), streetNumber: z.string().nullable().optional(), unit: z.string().nullable().optional(), yearBuilt: z.number().int().nullable().optional(), zip: z.string().nullable().optional()}); export const sellerDTO2 = z.object({alternatePhone: z.string().nullable().optional(), city: z.string().nullable().optional(), company: z.string().nullable().optional(), contactGuid: z.string().optional(), email: z.string().nullable().optional(), fax: z.string().nullable().optional(), firstName: z.string().nullable().optional(), isTrustCompanyOrOtherEntity: z.boolean().optional(), lastName: z.string().nullable().optional(), notes: z.string().nullable().optional(), phoneNumber: z.string().nullable().optional(), state: z.string().nullable().optional(), streetName: z.string().nullable().optional(), streetNumber: z.string().nullable().optional(), zip: z.string().nullable().optional()}); export const stageDTO = z.object({id: z.number().int().optional(), name: z.string().nullable().optional()}); export const listingDTO = z.object({agentGuid: z.string().optional(), checklist: checklist.nullable().optional(), checklistType: z.string().nullable().optional(), coAgentGuids: z.array(z.string()).nullable().optional(), transactionCoordinators: z.array(transactionCoordinatorDTO).nullable().optional(), coListingAgentGuid: z.string().nullable().optional(), commercialLease: commercialLeaseDTO.nullable().optional(), commission: commissionDTO.nullable().optional(), commissionReferral: commissionReferral.nullable().optional(), listingEmail: z.string().nullable().optional(), company: z.string().nullable().optional(), createdByGuid: z.string().optional(), createdOn: z.string().optional(), checklistModifiedOn: z.string().nullable().optional(), deadDate: z.string().nullable().optional(), reviewerGuid: z.string().nullable().optional(), customFields: z.unknown(), expirationDate: z.string().optional(), fileId: z.string().nullable().optional(), homeWarranty: homeWarrantyContactDTO2.nullable().optional(), listingDate: z.string().optional(), listingGuid: z.string().optional(), listingPrice: z.number().optional(), miscContact: miscellaneousContactDTO2.nullable().optional(), mlsNumber: z.string().nullable().optional(), officeGuid: z.string().nullable().optional(), otherSource: z.string().nullable().optional(), property: propertyDTO.nullable().optional(), realPropertySubtype: z.string().nullable().optional(), realPropertyType: z.string().nullable().optional(), referringAgentGuid: z.string().nullable().optional(), representationType: z.string().nullable().optional(), sellers: z.array(sellerDTO2).nullable().optional(), source: z.string().nullable().optional(), sourceId: z.number().int().nullable().optional(), stage: stageDTO.nullable().optional(), status: z.string().nullable().optional(), type: z.string().nullable().optional()}); export const getListingResponse = z.object({listing: listingDTO.nullable().optional()}); export const link = z.object({href: z.string().nullable().optional(), rel: z.string().nullable().optional(), method: z.string().nullable().optional()}); export const linkedResponseOfGetListingResponse = z.object({value: getListingResponse.nullable().optional(), warnings: z.array(z.string()).nullable().optional(), links: z.array(link).nullable().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 }; /** * Get listing * * GET /api/files/listings/{listingGuid} */ export const getApiApiFilesListingsListingGuid = async (args: GetApiApiFilesListingsListingGuidArgs, options?: GetApiApiFilesListingsListingGuidOptions) => { const {baseUrl = "https://api.skyslope.com", fetch: fetchFn = fetch, OpenIdConnect} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (OpenIdConnect !== undefined) headers.set('authorization', `Bearer ${OpenIdConnect}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/files/listings/${encodeURIComponent(String(args.listingGuid))}${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(linkedResponseOfGetListingResponse, await res.json()) };