refactor: decomposição de main.py em módulos Core + split EEG do Report #17
Loading…
Reference in a new issue
No description provided.
Delete branch "refactor/backend-core-modules"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Resumo
Continuação da decomposição modular (ADR-0013):
main.py(951 → 457 linhas):test_execution(Plans/Runs/Steps/anexos de run),issues(achados) ereporting(CSV/HTML/PDF de Report, resumo em PDF,/api/metrics).Report:patient_code/has_photic/has_cardio/has_videosaem da tabelareportspara uma tabela nova,report_eeg_profiles(FK 1:1,ondelete=CASCADE). Migrationb4fc85244591, testada com round-trip upgrade → downgrade → upgrade preservando dados.modules/eeg_reports/report_profile.py. Contrato HTTP muda:GET/POST/PUT /api/reports*usameeg: {patient_code, has_photic, has_cardio, has_video}em vez dos 4 campos soltos. Frontend (ReportForm.jsx,ReportDetail.jsx,ReportList.jsx) atualizado.eeg_extension:reporting,pdf_export.py,html_export.pyeservices/reports.pyparavam de ser genéricos porque liam campos EEG direto (CSV,channel_coveragede/api/metrics, seção "Dados do exame" do PDF/HTML, busca textual). Agora esses módulos aceitam um ponto de extensão explícito (extra_exam_fields,extra_search_filter,eeg_extension) injetado pormain.py, implementado pormodules/eeg_reports/report_profile.py. Resultado: nenhum desses arquivos referencia maisReportEegProfileou os 4 campos — servem pra reportar sobre qualquer tipo de teste, não só EEG.reportingentra de fato na listaCORE_MODULESdo teste de fronteira, que ganhoutest_generic_report_exporters_stay_eeg_agnosticcomo guarda de regressão.Documentação atualizada em
docs/MODULAR_ARCHITECTURE.md(seções "Split de Report" e "Extension point: eeg_extension") edocs/BACKLOG.md. Também corrige uma linha desatualizada emdocs/KNOWN_LIMITATIONS.md(Report e TestRun já têm relação explícita desde o PR #12).Test plan
pytestno backend: 37/37 passando (inclui teste de round-trip completo do Alembic do zero e o novo guard de regressão EEG-agnóstico)patient_code, editar, duplicar, CSV, PDF, HTML, métricas (channel_coverage) — tudo conferido via network tab/fetch, batendo com o comportamento anteriorSegundo corte da separação Core/EEG do Report (depois do split de schema em report_eeg_profiles): a lógica de ler/criar/clonar o perfil EEG agora mora em modules/eeg_reports/report_profile.py (apply/clone/to_schema) — main.py só orquestra (create_report/update_report/duplicate_report/list_reports), não é mais dono da lógica. As @property de compatibilidade saíram do Report: ele não expõe mais patient_code/has_photic/has_cardio/has_video como atributo nenhum, só a relationship eeg_profile. Contrato HTTP mudou de propósito: GET/POST/PUT /api/reports* agora usam eeg: {patient_code, has_photic, has_cardio, has_video} em vez dos 4 campos soltos (schemas.ReportEegProfile novo, ReportUpdate.eeg é Optional e substitui os 4 de uma vez quando presente, mesma semântica de tags/ manufacturers). channel_coverage (reporting/router.py::metrics()) e o filtro de busca (services/reports.py::apply_report_filters) já usavam join explícito com ReportEegProfile desde o corte anterior, então não mudaram. Frontend atualizado: ReportForm.jsx, ReportDetail.jsx e ReportList.jsx leem/ escrevem form.eeg.*/r.eeg?.* em vez dos campos soltos, com merge defensivo no restore de rascunho do localStorage (formato antigo não quebra mais). Validado com dev server rodando (.claude/launch.json novo, com backend e frontend): criar, listar, buscar por patient code, editar, duplicar, CSV, PDF, HTML e métricas, tudo conferido via network tab batendo com o novo formato. 36/36 testes de backend continuam passando (test_report_duplicate_ and_run_link.py atualizado pro formato aninhado). reporting continua fora do CORE_MODULES do teste de fronteira — ainda depende de pdf_export/html_export e de ReportEegProfile diretamente. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>