@horizon-domains/property-model
Version:
Modelo de propriedades imobiliárias v3 - Sistema de atributos dinâmicos
161 lines (150 loc) • 4.03 kB
text/typescript
/**
* 📋 Schema Type Definitions v2.0.0
*
* Tipagens TypeScript para validar estrutura dos schemas JSON
* Baseado no formato Entity Schema v2.0.0
*/
/**
* Metadados de relação com outras entidades
*/
export interface RelationMetadata {
/** Nome do modelo Prisma relacionado */
model: string;
/** Campo de ligação (FK) */
field: string;
/** Campo para exibição (label) */
labelField: string;
/** Template opcional para exibição (ex: "{{name}} - {{creci}}") */
displayTemplate?: string;
/** Coluna FK nesta entidade que contém o valor (para campos virtualizados) */
foreignKey?: string;
}
/**
* Metadados de UI e apresentação
*/
export interface UIMetadata {
/** Label de exibição do campo */
label: string;
/** Descrição detalhada */
description?: string;
/** Placeholder para inputs */
placeholder?: string;
/** Se pode ser buscado por texto */
searchable?: boolean;
/** Se pode ser filtrado */
filterable?: boolean;
/** Se pode ser ordenado */
sortable?: boolean;
/** Se pode ser usado em facetas */
facetable?: boolean;
/** Se é visível na UI */
visible?: boolean;
/** Template de exibição (ex: "{{area}} m²") */
displayTemplate?: string;
/** Ícone associado */
iconName?: string;
}
/**
* Metadados de auditoria
*/
export interface AuditMetadata {
/** Origem do campo (ex: "hb:property", "publisher:property") */
origin: string;
/** Descrição de onde o dado foi captado no CRM original (ex: "features.bedroom", "values.saleValue (REAIS)") */
source?: string;
}
/**
* Regras de negócio e dependências
*/
export interface RulesMetadata {
/** Condições para exibição (ex: ["operacao:venda"]) */
conditions?: string[];
/** Campo pai (dependência hierárquica) */
parent?: string;
}
/**
* Validações do campo
*/
export interface ValidationRules {
/** Campo obrigatório */
required?: boolean;
/** Valor mínimo (números) */
min?: number;
/** Valor máximo (números) */
max?: number;
/** Comprimento mínimo (strings) */
minLength?: number;
/** Comprimento máximo (strings) */
maxLength?: number;
/** Precisão decimal */
precision?: number;
/** Padrão regex */
pattern?: string;
}
/**
* Metadados de banco de dados
*/
export interface DBMetadata {
/** Tipo do campo no DB (ex: "varchar(255)", "decimal(10,8)") */
type?: string;
/** Valor padrão */
default?: string | number | boolean;
/** Se tem índice */
index?: boolean | string; // true, "gin", "fulltext", "geo"
/** Se é unique */
unique?: boolean;
}
/**
* Definição de um campo do schema
*/
export interface FieldSchema {
/** Chave única do campo */
key: string;
/** Tipo do campo (String, Number, Boolean, Json, Json[], String[], Number[], Relation) */
type: string;
/** Tipo dos itens em arrays */
itemType?: string;
/** Categorias do campo */
categories: string[];
/** Validações */
validation?: ValidationRules;
/** Metadados de banco de dados */
db?: DBMetadata;
/** Metadados de UI */
ui: UIMetadata;
/** Metadados de auditoria */
audit: AuditMetadata;
/** Enum de valores possíveis */
enum?: Record<string, string>;
/** Formato do campo (currency, area, count, datetime, year, distance, etc) */
format?: string;
/** Unidade (BRL, m2, m, etc) */
unit?: string;
/** Máscara de formatação frontend (cpf, cnpj, cep, phone, email, url) */
mask?: string;
/** Regras de negócio */
rules?: RulesMetadata;
/** Metadados de relação (para FKs) */
relation?: RelationMetadata;
}
/**
* Schema completo de uma entidade
*/
export interface EntitySchema {
/** Nome da entidade */
entity: string;
/** Versão do schema */
version: string;
/** Descrição da entidade */
description?: string;
/** Lista de campos */
fields: FieldSchema[];
}
/**
* Tipo auxiliar: chave de campo
*/
export type FieldKey = string;
/**
* Tipo auxiliar: mapa de campos
*/
export type FieldsMap = Record<FieldKey, FieldSchema>;