@horizon-domains/property-model
Version:
Modelo de propriedades imobiliárias v3 - Sistema de atributos dinâmicos
111 lines (101 loc) • 5.04 kB
text/typescript
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)
}