UNPKG

@horizon-apps/domain-schema-core

Version:

Core domain schema utilities for Horizon Platform - Schema generators, data enrichers, converters and specifications

242 lines (194 loc) 7.98 kB
# 🛠️ DOC DE REFATORAÇÃO - REMOÇÃO DE HARDCODES > **Objetivo**: Tornar o Domain Display Enricher 100% agnóstico, removendo todos os hardcodes e assumptions sobre domínios específicos. --- ## 📋 **ANÁLISE ATUAL DOS HARDCODES** ### **🚫 PROBLEMA 1: Função `detectDomainFromData()`** **Local**: `domain-enricher-engine.ts:209-250` **Hardcodes identificados:** ```typescript // LINHA 213-226: Mapeamento fixo const fieldToDomainMap: Record<string, string> = { "broker": "broker", // ❌ HARDCODE "brokers": "broker", // ❌ HARDCODE "property": "property", // ❌ HARDCODE "properties": "property", // ❌ HARDCODE "image": "image", // ❌ HARDCODE "images": "image", // ❌ HARDCODE - PROBLEMA PRINCIPAL "user": "user", // ❌ HARDCODE "users": "user", // ❌ HARDCODE "owner": "user", // ❌ HARDCODE "agent": "broker", // ❌ HARDCODE "realtor": "broker", // ❌ HARDCODE }; // LINHA 242-244: Detecção por propriedades if (data.creci) return "broker"; // ❌ HARDCODE if (data.cpf || data.cnpj) return "user"; // ❌ HARDCODE if (data.url && (data.caption || data.alt)) return "image"; // ❌ HARDCODE ``` ### **🚫 PROBLEMA 2: Registry fake nos testes** **Local**: `tests/enricher.test.ts:301-313` ```typescript registry = { property: { key: "property", enrichMapper: propertyEnrichMapperFake }, broker: { key: "broker", enrichMapper: brokerEnrichMapperFake }, image: { key: "image", enrichMapper: imageEnrichMapperFake }, // ❌ HARDCODE } ``` ### **🚫 PROBLEMA 3: Testes assumindo relacionamentos** **Local**: `tests/enricher.test.ts:690-740` ```typescript it("deve enriquecer array de relacionamentos (images)", () => { // ❌ Assume que images é relacionamento // ❌ Assume que existe domínio "image" }) ``` --- ## 🎯 **PLANO DE REFATORAÇÃO DETALHADO** ### **ETAPA 1: Remover função `detectDomainFromData()` [SEM QUEBRAR TESTES]** #### **1.1 Localizar onde é chamada:** - `domain-enricher-engine.ts:154` (dentro de `processRelationshipField`) #### **1.2 Substituir chamada por lógica simples:** ```typescript // ANTES (hardcode): const detectedDomain = this.detectDomainFromData(fieldKey, relationship); // DEPOIS (agnóstico): const detectedDomain = this.registry[fieldKey] ? fieldKey : null; ``` #### **1.3 Remover função completa:** - Deletar linhas 209-250 inteiras - Manter comportamento: só processar relacionamento se domínio existir no registry ### **ETAPA 2: Modificar lógica de relacionamentos [SEM QUEBRAR TESTES]** #### **2.1 Simplificar `processRelationshipField()`:** ```typescript // LÓGICA ATUAL (complexa): // 1. Detecta se é relacionamento via isRelationship() // 2. Chama detectDomainFromData() (hardcode) // 3. Processa se encontrou domínio // LÓGICA NOVA (simples): // 1. Detecta se é relacionamento via isRelationship() // 2. Verifica se fieldKey existe no registry // 3. Processa se existe, senão ignora (deixa campo original) ``` #### **2.2 Impacto nos testes:** - ✅ Testes de `broker` continuam funcionando (se `broker` estiver no registry) - ❌ Testes de `images` vão falhar (pois `image` será removido do registry) - ✅ Demais testes continuam normais ### **ETAPA 3: Ajustar registry fake dos testes [VAI QUEBRAR ALGUNS TESTES]** #### **3.1 Remover domínio `image` do registry:** ```typescript // ANTES: registry = { property: { key: "property", enrichMapper: propertyEnrichMapperFake }, broker: { key: "broker", enrichMapper: brokerEnrichMapperFake }, image: { key: "image", enrichMapper: imageEnrichMapperFake }, // ← REMOVER } // DEPOIS: registry = { property: { key: "property", enrichMapper: propertyEnrichMapperFake }, broker: { key: "broker", enrichMapper: brokerEnrichMapperFake }, // image removido - images agora é campo normal } ``` #### **3.2 Testes que VÃO QUEBRAR (intencionalmente):** - `"deve enriquecer array de relacionamentos (images)"` - ❌ DEVE quebrar - Qualquer teste que assume `images` como relacionamento - ❌ DEVE quebrar ### **ETAPA 4: Adicionar `images` como campo normal no schema [CONSERTAR TESTES]** #### **4.1 Atualizar schema fake da property:** ```typescript const propertySchemaFake: FieldMetadata[] = [ // ... campos existentes { key: "images", type: "Json[]", // Array de objetos JSON ui: { label: "Imagens", description: "Lista de imagens do imóvel" } }, { key: "main_image", type: "Json", // Objeto JSON ui: { label: "Imagem Principal", description: "Imagem de destaque do imóvel" } } ] ``` #### **4.2 Atualizar testes quebrados:** ```typescript // ANTES (como relacionamento): it("deve enriquecer array de relacionamentos (images)", () => { // assumia que images era relacionamento }) // DEPOIS (como campo normal): it("deve enriquecer campo images como Json[]", () => { const rawData = { images: [ { md: "url1", sm: "url1", full: "url1", cover: true }, { md: "url2", sm: "url2", full: "url2", cover: false } ] }; const result = enricher.enrich(rawData, "property"); // Verifica que images foi enriquecido como campo normal expect(result.images).toBeDefined(); expect((result.images as EnrichedField).type).toBe("Json[]"); expect((result.images as EnrichedField).value).toEqual(rawData.images); }) ``` ### **ETAPA 5: Validação [NÃO DEVE QUEBRAR TESTES PRINCIPAIS]** #### **5.1 Testes que DEVEM continuar passando:** - ✅ Enriquecimento básico de campos - ✅ Relacionamento com `broker` (se registry tiver) - ✅ Campos computados - ✅ includeMetadata - ✅ getIcon - ✅ type, format, unit na raiz - ✅ Null handling #### **5.2 Testes que DEVEM falhar inicialmente:** - ❌ Testes específicos de `images` como relacionamento - ❌ Qualquer teste que assume hardcode #### **5.3 Após ajustes, todos devem passar:** - ✅ Todos os testes principais - ✅ Novos testes de `images` como campo Json[] --- ## 🧪 **ESTRATÉGIA DE VALIDAÇÃO SEM QUEBRAR** ### **Ordem de execução:** 1. **Rodar testes antes** - capturar estado baseline 2. **Implementar ETAPA 1** - remover detectDomainFromData() 3. **Rodar testes** - ver impacto (alguns devem quebrar) 4. **Implementar ETAPA 2** - simplificar relacionamentos 5. **Implementar ETAPA 3** - ajustar registry 6. **Rodar testes** - ver quebras intencionais 7. **Implementar ETAPA 4** - consertar com images como campo normal 8. **Rodar testes** - todos devem passar ### **Rollback se necessário:** - Git commit após cada etapa - Se algo quebrar inesperadamente, rollback pontual --- ## 📊 **RESULTADO ESPERADO FINAL** ### **✅ BENEFÍCIOS:** - Domain Display Enricher 100% agnóstico - Sem assumptions sobre nomes de domínios - `images` processado como campo normal (Json[]) - Relacionamentos baseados apenas no registry fornecido - Código mais limpo e extensível ### **✅ COMPATIBILIDADE:** - Todos os testes principais continuam passando - Comportamento para campos normais inalterado - Relacionamentos funcionam se configurados no registry - API pública inalterada ### **✅ NOVOS COMPORTAMENTOS:** - `images` como campo Json[] enriquecido normalmente - `main_image` como campo Json enriquecido normalmente - Relacionamentos só se domínio estiver explícito no registry - Sem detecção "mágica" de relacionamentos --- ## 🎯 **ESTA É A ESTRATÉGIA PERFEITA** **Justificativa**: 1. **Preserva testes principais** - nada quebra desnecessariamente 2. **Remove hardcodes gradualmente** - etapas controladas 3. **Substitui comportamento hardcoded** - por lógica agnóstica 4. **Mantém API** - sem breaking changes 5. **Melhora arquitetura** - torna extensível e limpo **Pronto para executar com segurança!** 🚀