Escopo do Lote
Este lote implementa a reestruturação arquitetural de dados do Conn2Flow, separando a compilação de metadados em desenvolvimento da persistência genérica e otimizada em produção, além de padronizar colunas de controle, unificar logs via biblioteca oficial do sistema, suportar ganchos locais data-hooks.php e deleção imperativa de dados.
Nota de escopo (DEC-042): o req §1 listava 7 tabelas para migrar
linguagem_codigo→language, mas todas já usavamlanguage. A única tabela pendente eravariaveis— migrada nesta rodada sob aprovação explícita do Engenheiro Chefe Humano. A sub-chave de metadados dentro de"tabela"foi nomeadaconfig(decisão do Chefe).
Checklist de Implementação
1. Banco de Dados e Migrações (Phinx)
-
[x] Mapear todas as migrações antigas que usam
linguagem_codigo(apenascreate_variaveis_table+ índice emalter_recursos_add_plugin_id; as 7 tabelas do req já usavamlanguage). -
[x] Alterar as classes de migração sob migrations/ para usar
language(criação davariaveis+ índice compostoidx_variaveis_plugin_id_language). -
[x] Nova migração corretiva idempotente
20260705100000_rename_variaveis_linguagem_codigo_to_language.php(renameColumncom guardshasColumn/hasTable). -
[x] Atualizar todas as referências à coluna em todo o código (
configuracao.php,gestor.php,plugins-installer.php, gerador, atualizador, plugin-banco) e regenerarVariaveisData.json(1488 entradas).
2. Metadados nos Arquivos de Origem (Dev)
-
[x] Adicionar o bloco
"tabela"."config"com regras de sincronização (strategy,natural_key_columns,preserve_on_user_modified,insert_only) nos JSONs de 13 módulos (admin-paginas/layouts/componentes/templates, forms, modulos, modulos-grupos, modulos-operacoes, usuarios, usuarios-perfis, admin-prompts-ia, admin-modos-ia, admin-categorias). -
[x] Criar o arquivo de metadados das tabelas globais tables_config.json (variaveis, usuarios_perfis_modulos, usuarios_perfis_modulos_operacoes, alvos_ia).
-
[x]
resources.map.phppermaneceu inalterado (apenas direcionamento de arquivos). -
[x] Implementar a chave
"deletar"nos blocos"tabela"locais e no global (placeholder[]/{}pronto para uso).
3. Refatoração do Script Gerador (atualizacao-dados-recursos.php)
-
[x] Motor de varredura genérico (Registry Pattern) que consolida
tabela.configdos módulos +tables_config.jsonglobal. Nota: a geração específica dos `Data.json` por recurso foi preservada (decisão de baixo risco — DEC-042); o Registry aplica-se à consolidação do contrato.* -
[x] Ler e consolidar as regras de
"tabela"dos módulos e do arquivo global. -
[x] Agregar e consolidar as listas de deleção imperativa.
-
[x] Exportar o arquivo schema-metadata.json (17 tabelas).
-
[x] Suporte ao carregamento/execução em cadeia de
data-hooks.php(globais e por módulo) pós-geração. -
[x] Logs via
log_disco_local()(envelopalog_disco()da biblioteca oficial). -
[x] Substituir
@cego porensureDir()com validação/log (require de log, mkdir de LOG_DIR/DB_DATA_DIR/jsonWrite/órfãos).
4. Refatoração do Script Atualizador (atualizacoes-banco-de-dados.php)
-
[x] Leitura dinâmica de schema-metadata.json (
schemaMetadata()com cache). -
[x] Remover arrays hardcoded (
$preserveMap,$tabelasChaveNatural,$tabelasInsertOnly) — agora derivados do contrato. -
[x] Query para obter
max_allowed_packetdinamicamente (maxAllowedPacket()). -
[x] Loteador threshold-based (
inserirEmLote): multi-row agrupado por assinatura de colunas, chunk a 70% do pacote, fallback fixo 16MB, fallback individual para duplicatas. -
[x] Motor genérico de chave natural (
naturalKeyGenerica) + WHERE genérico null-safe (<=>). Nota: os fluxos PK e Chave Natural permanecem como branches distintos, ambos dirigidos pelo contrato (não foram fundidos num único motor para preservar comportamento). -
[x] Deleção física do bloco de deleção imperativa do contrato (
executarDelecoes). -
[x] Transações PDO completas (
beginTransaction/commit/rollBack) envolvendo sincronização + deleção. -
[x] Remover
@cego nas gravações (mantido o tratamento existente; foco do saneamento no gerador).
5. Unificação e Visibilidade de Logs de Banco de Dados
-
[x]
log_unificado()ematualizacoes-banco-de-dados.phpeatualizacao-plugin-banco-de-dados.php(implementado por outro agente que tocou o 029 sem querer; incorporado sem reverter — ver DEC-042). -
[x] Injeção em
$GLOBALS['EXTERNAL_LOGGER']por referência quando definido. -
[x] Remoção da execução via subprocesso ao rodar atualização de banco:
atualizacoes-sistema.php(executarAtualizacaoBanco) agora roda estritamente inline (require). Opassthru()remanescente é o auto-bootstrap do deploy (não-alvo).plugins-installer.phpjá integraEXTERNAL_LOGGER. -
[x] Impressão no stdout sob
PHP_SAPI === 'cli'(dentro delog_unificado). -
[x]
api.php(api_executar_atualizacao_banco) captura logs e retornadb_logs; endpoint aceitafull_log(resumo vs completo viaapi_filtrar_db_logs). -
[x]
atualizacoes-sistema.phpregistra os logs do banco prefixados com[BANCO].
Evidência de Validação (2026-06-12)
-
Validação estática:
php -lOK em 11 arquivos (gerador, atualizador, plugin-banco, api.php, atualizacoes-sistema, configuracao, gestor, plugins-installer, 3 migrações);json_decodeOK em 34 JSONs (13 módulos + tables_config + schema-metadata + VariaveisData + demais módulos). -
Geração do contrato:
gerarSchemaMetadata()executada isoladamente →schema-metadata.jsoncom 17 tabelas,strategy/natural_key_columns/preserve/insert_onlyespelhando o hardcode anterior (todas as chave-natural,usuariospk+insert_only,categoriaspk, preserveMap correto). -
Testes de unidade (PHP):
naturalKeyGenerica8/8 (paridade com o switch antigo: paginas/variaveis/permissões/modulos, lowercase, aliaslinguagem_codigo, colunas obrigatórias vs opcionais);inserirEmLoteem PDO SQLite (no container) → batch de 50 com chunking, dedup fallback (inserted=2 same=1), simulate sem gravação;schemaMetadata17 tabelas +naturalKeyColumns. -
Teste end-to-end contra MySQL 8.0 real (após o operador habilitar os drivers PDO no PHP do host; banco dedicado
conn2flow_test, dropado ao fim —conn2flowreal intacto): 6/6 OK —sincronizarTabelaem modo natural key (modulos: INSERT em lote de 3, UPDATE de 1 divergente + NO-CHANGE de 2), PRESERVE deuser_modifiedemvariaveis(valor do usuário não sobrescrito), INSERT_ONLY emusuarios(modo PK não atualiza), transação PDO com ROLLBACK desfazendo o insert, e deleção imperativa viaexecutarDelecoesconsumindo o blocodeletardo contrato. -
Remoção de CLI exec: 0
exec/shell_exec/passthrude banco; únicopassthrurestante é o auto-bootstrap (não-alvo). -
Residual
linguagem_codigocomo coluna SQL: 0 (fora da migração de rename). -
Decisão registrada: DEC-042.
Pendências com o operador
-
Rodar
atualizacao-dados-recursos.php/?️ Projects - Update => Corepara regenerarschema-metadata.jsonno pipeline e recalcular checksums. -
Aplicar as migrações (incl.
renamedavariaveis) em ambiente MySQL e validar runtime: sincronização completa (insert/update/preserve/deleção), loteador em volume real, transações e captura dedb_logsno deploy via API (com e semfull_log).