UNPKG

@horizon-domains/property-model

Version:

Modelo de propriedades imobiliárias v3 - Sistema de atributos dinâmicos

111 lines (101 loc) 5.04 kB
import { z } from "zod" // Schema Horizon v2.3.0 para HorizonPropertySchemaBase // Removidos do base: tags, numero_pessoas, subtipo, valor_diaria, geo_aproximado (agora são extras de cada CRM) // Gerado automaticamente com inferência inteligente /** * Formato de imagem Horizon V3 * - md: URL tamanho médio * - sm: URL tamanho pequeno * - full: URL tamanho completo */ const ImageSchema = z.object({ md: z.string().url().describe("URL tamanho médio"), sm: z.string().url().describe("URL tamanho pequeno"), full: z.string().url().describe("URL tamanho completo"), cover: z.boolean().describe("Se é imagem de capa") }) /** * Formato de imagem principal (sem flag cover) */ const MainImageSchema = z.object({ md: z.string().url().describe("URL tamanho médio"), sm: z.string().url().describe("URL tamanho pequeno"), full: z.string().url().describe("URL tamanho completo") }) const VideoSchema = z.object({ url: z.string().nullish().describe("Url do vídeo"), embed_url: z.string().nullish().describe("Url de incorporação do vídeo"), }) const VirtualTourSchema = z.object({ embed_url: z.string().url().describe("URL de incorporação do tour 360°") }) export const HorizonPropertySchemaBaseZod = z.object({ // Sistema source_published_at: z.string().nullish().describe("Data da publicação original"), source_updated_at: z.string().describe("Data da última republicação"), currency: z.string().default("BRL").describe("Moeda"), unit_area: z.string().default("m2").describe("Unidade de área"), unit_distance: z.enum(["meters", "km"]).default("meters").describe("Unidade de distância"), // Cabecalho reference: z.string().describe("Referência"), title: z.string().max(200).describe("Título"), description: z.string().describe("Descrição"), // SEO seo_slug: z.string().max(255).nullish().describe("Slug SEO"), seo_title: z.string().max(60).nullish().describe("Título SEO"), seo_description: z.string().max(160).nullish().describe("Descrição SEO"), seo_keywords: z.string().max(200).nullish().describe("Palavras-chave SEO"), // Medias main_image: MainImageSchema.describe("Imagem principal").optional(), images: z.array(ImageSchema).describe("Imagens"), videos: z.array(VideoSchema).describe("Vídeos"), virtual_tours: z.array(VirtualTourSchema).describe("Tours virtuais"), // Ficha técnica operacao: z.array(z.enum(["venda", "locacao", "temporada"])).describe("Operação"), tipo: z.string().describe("Tipo do imóvel"), dormitorios: z.number().min(0).nullish().describe("Dormitórios"), suites: z.number().min(0).nullish().describe("Suítes"), banheiros: z.number().min(0).nullish().describe("Banheiros"), vagas_garagem: z.number().min(0).nullish().describe("Vagas de garagem"), area_total: z.number().min(0).nullish().describe("Área total"), area_privativa: z.number().min(0).nullish().describe("Área privativa"), area_util: z.number().min(0).nullish().describe("Área útil"), destaque: z.boolean().nullish().describe("Imóvel em destaque"), // VALORES valor_venda: z.number().nullish().describe("Valor de venda"), valor_locacao: z.number().nullish().describe("Valor de locação"), valor_condominio: z.number().nullish().describe("Valor do condomínio"), valor_iptu: z.number().nullish().describe("Valor do IPTU"), // LOCALIZACAO endereco_cep: z.string().max(9).nullish().describe("CEP"), endereco_estado: z.string().nullish().describe("Estado"), endereco_cidade: z.string().nullish().describe("Cidade"), endereco_bairro: z.string().nullish().describe("Bairro"), endereco_logradouro: z.string().nullish().describe("Logradouro"), endereco_numero: z.string().nullish().describe("Número"), endereco_complemento: z.string().nullish().describe("Complemento"), endereco_referencia: z.string().nullish().describe("Referência"), endereco_zona: z.string().nullish().describe("Zona"), lat: z.number().min(-90).max(90).nullish().describe("Latitude"), lng: z.number().min(-180).max(180).nullish().describe("Longitude"), // RELACIONAMENTOS corretor_key: z.string().nullish().describe("ID do corretor"), corretor_nome: z.string().nullish().describe("Nome do corretor"), condominio_key: z.string().nullish().describe("ID do condomínio"), condominio_nome: z.string().nullish().describe("Nome do condomínio"), }) // Tipo inferido a partir do schema export type HorizonPropertySchemaBaseType = z.infer<typeof HorizonPropertySchemaBaseZod> // // Função helper para validação export const validateHorizonPropertySchemaBase = (data: unknown): HorizonPropertySchemaBaseType => { return HorizonPropertySchemaBaseZod.parse(data) } // Função helper para validação safe export const safeValidateHorizonPropertySchemaBase = (data: unknown) => { return HorizonPropertySchemaBaseZod.safeParse(data) } // Função helper para validação parcial export const validatePartialHorizonPropertySchemaBase = (data: unknown) => { return HorizonPropertySchemaBaseZod.partial().parse(data) }