You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
API responsável pelo processamento de arquivos XML e geração de relatórios visuais em Excel (.xlsx) e PDF, construída com FastAPI e princípios de Clean Architecture.
📁 Estrutura de Arquivos
backend/
├── main.py # Ponto de entrada da aplicação
├── requirements.txt # Dependências Python do projeto
├── ruff.toml # Configuração do Ruff (linter + formatter)
├── Dockerfile # Imagem Docker do backend (Python 3.12-alpine)
├── .dockerignore # Arquivos ignorados pelo Docker
├── .env.example # Template de variáveis de ambiente
├── pytest.ini # Configuração do pytest
│
├── core/ # 🧠 Regras de negócio (independente de frameworks)
│ ├── domain/
│ │ ├── entities/ # Entidades de domínio (File, ProcessingOptions)
│ │ ├── interfaces/ # Contratos abstratos (IXmlParser, IReportGenerator, IStorage, INotifier, IServer)
│ │ └── exceptions.py # Exceções de domínio tipadas (InvalidXMLError, TagsNotFoundError, etc.)
│ └── application/
│ └── use_cases/
│ └── use_file.py # Caso de uso principal — orquestra validação → extração → geração → salvamento
│
├── infrastructure/ # ⚙️ Implementações concretas e integrações
│ ├── adapters/
│ │ ├── xml_adapter.py # Parsing e extração de XML (defusedxml)
│ │ ├── report_adapter.py # Geração de Excel (openpyxl) e PDF (reportlab)
│ │ ├── storage_adapter.py # Persistência em disco com resolução de colisões
│ │ ├── websocket_adapter.py # Notificações em tempo real via WebSocket
│ │ ├── exception_adapter.py # Conversão de exceções para respostas HTTP
│ │ ├── fastapi_adapter.py # Wrapper do FastAPI implementando IServer
│ │ └── input_adapter.py # Normalização de inputs de formulário
│ ├── middleware/
│ │ ├── security_middleware.py # Rate limiting por IP + validação de tamanho de arquivo
│ │ └── security_headers.py # Headers de segurança HTTP (CSP, XSS, HSTS, etc.)
│ ├── logging/
│ │ └── security_logger.py # Logger estruturado JSON para eventos de segurança
│ ├── logging_config.py # Configuração global de logging
│ ├── factories.py # Factory + Singleton para injeção de dependências
│ └── server_config.py # Composição do servidor (middleware, CORS, rotas)
│
├── api/ # 🌐 Camada de interface HTTP/WS
│ ├── router.py # Configuração e registro de rotas
│ ├── controllers/
│ │ ├── file_controller.py # Controller HTTP para upload de XML
│ │ └── websocket_controller.py # Controller WebSocket para conexões em tempo real
│ └── schemas/
│ └── files_schemas.py # Modelos Pydantic (UploadResponse, ErrorResponse)
│
├── tests/ # 🧪 Suíte de testes automatizados
│ ├── conftest.py # Fixtures compartilhadas (mocks, dados de teste)
│ ├── test_xml_adapter.py # Testes do XmlAdapter
│ ├── test_report_adapter.py # Testes do ReportAdapter
│ ├── test_storage_adapter.py # Testes do StorageAdapter
│ ├── test_core_extraction.py # Testes de extração hierárquica
│ ├── test_file_controller.py # Testes do FileController
│ ├── test_use_file.py # Testes do caso de uso UseFile
│ ├── security/ # Testes de segurança
│ └── xml/ # Arquivos XML de fixture
│
└── outputs/ # 📂 Diretório de saída dos relatórios gerados
📖 Referência dos Arquivos Raiz
Arquivo
Descrição
main.py
Ponto de entrada que instancia o FastAPIServer e inicia o Uvicorn na porta configurada (default: 8000).
requirements.txt
Lista de dependências: fastapi, pandas, openpyxl, reportlab, defusedxml, websockets, pytest, httpx, entre outras.
ruff.toml
Configuração do Ruff: regras de linting, formatação, target Python 3.12, indent 2, line-length 80.
Dockerfile
Baseado na imagem python:3.12-alpine. Instala dependências e expõe porta 8000.
.dockerignore
Ignora arquivos e diretórios que não devem ser incluídos na imagem Docker.
.env.example
Template com variáveis de ambiente: CORS origins, limites de upload, rate limiting, HSTS, logging e servidor.
pytest.ini
Configura pytest com modo assíncrono (asyncio_mode = auto), markers (integration, slow), e modo verbose.
🚀 Funcionalidades
Processamento de XML
Validação segura de sintaxe XML com defusedxml (proteção contra XXE)
Extração hierárquica preservando a estrutura pai-filho do XML
Detecção automática de elementos repetidos para organização inteligente
Busca avançada por tags com matching robusto de caminhos hierárquicos
Estatísticas automáticas: total de tags únicas, preenchidas e vazias
Enriquecimento Global (Singletons): Captura automática de dados únicos do cabeçalho e os replica em cada linha do relatório.
Exemplo: Se o XML tem um cabeçalho <loja> e vários <item>, selecionar a tag item resultará em linhas contendo os dados do item + o nome da loja em todas elas.
Agrupamento inteligente de tags similares por prefixo
Geração de Relatórios
Excel (.xlsx): Planilhas com formatação profissional (cabeçalhos estilizados, auto-ajuste de colunas, bordas)
PDF: Resumo executivo com header destacado, cards de estatísticas, tags prioritárias (Top 10), agrupamentos (Top 5 grupos com 10 itens cada), alertas e timestamp (UTC-3 Brasil)
Comunicação em Tempo Real
WebSocket (/api/ws) para notificações de progresso em cada etapa do processamento
Entidades, interfaces (contratos abstratos) e exceções de domínio. Sem dependências externas.
Application
core/application/
Casos de uso que orquestram o fluxo de negócio. Depende apenas de interfaces em domain.
Infrastructure
infrastructure/
Implementações concretas dos contratos (adapters), middleware, logging e configuração do servidor.
API
api/
Camada de interface: rotas HTTP/WS, controllers e schemas de validação.
Regra de Dependência
As dependências sempre apontam para dentro (da API → Infrastructure → Application → Domain).
O domínio nunca depende de frameworks ou bibliotecas externas.
🧩 Design Patterns
Pattern
Onde
Descrição
Adapter
infrastructure/adapters/
Cada adapter implementa uma interface de domínio (IXmlParser → XmlAdapter, IReportGenerator → ReportAdapter, etc.), isolando a lógica de negócio dos frameworks.
Factory
infrastructure/factories.py
Centraliza a criação de dependências, montando o grafo de objetos para os casos de uso.
Singleton
infrastructure/factories.py
Instâncias únicas dos adapters são criadas uma vez e reutilizadas em toda a aplicação.
Dependency Injection
UseFile, Controllers
Dependências são injetadas via construtor, permitindo substituição por mocks nos testes.
Strategy
ReportAdapter
Geração de relatórios alterna entre estratégias (Excel/PDF) baseado no formato solicitado.
Observer
WebSocketAdapter
Notificações broadcast para todos os clientes conectados durante o processamento.
Repository/Storage
StorageAdapter
Abstrai a persistência de arquivos em disco atrás de uma interface (IStorage).
🔒 Segurança — OWASP Top 10
A aplicação implementa controles alinhados às categorias do OWASP Top 10 (2025):
A01 — Broken Access Control
CORS restritivo: Apenas origens permitidas via ALLOWED_ORIGINS (configurável por env)
Métodos HTTP limitados: Apenas GET e POST são permitidos
Path Traversal Prevention: Sanitização de caminhos em StorageAdapter e ProcessingOptions (bloqueio de .., caracteres nulos e caracteres inválidos)
A02 — Cryptographic Failures
HSTS (Strict-Transport-Security): Força HTTPS em produção (ENABLE_HSTS=true)
Headers de segurança em todas as respostas
A03 — Injection
XML External Entity (XXE) Prevention: Uso de defusedxml para parsing seguro, bloqueando entidades externas, DTDs e expansão de entidades
Path Injection Prevention: Sanitização contra null bytes e caracteres especiais no StorageAdapter
A04 — Insecure Design
Clean Architecture: Separação rígida de camadas impede acesso direto a recursos internos
Domain Exceptions: Hierarquia tipada de exceções garante tratamento adequado por tipo de erro
Formato JSON estruturado para análise automatizada
Rotação de logs (100MB por arquivo, 10 backups)
Eventos registrados: uploads, violações de rate limit, tentativas de path traversal, erros de validação, exceções
Severidade por tipo de evento (INFO, WARNING, ERROR, CRITICAL)
A10 — Server-Side Request Forgery (SSRF)
Parsing local exclusivo: O backend processa apenas conteúdo XML enviado via upload — não faz requisições externas nem resolve entidades/DTDs remotas (garantido pelo defusedxml)
🧹 Linting & Formatação (Ruff)
O projeto utiliza o Ruff como linter e formatter unificado para Python. A configuração está centralizada em ruff.toml.
Configuração Atual (ruff.toml)
Opção
Valor
Descrição
target-version
py312
Compatibilidade com Python 3.12
line-length
80
Largura máxima de linha
indent-width
2
Indentação com 2 espaços
quote-style
double
Aspas duplas como padrão
indent-style
space
Indentação por espaços (não tabs)
Regras de Linting Ativas
Código
Plugin
O que verifica
E, W
pycodestyle
Estilo de código (PEP 8)
F
pyflakes
Erros lógicos (variáveis não usadas, imports fantasmas)
I
isort
Ordenação de imports
N
pep8-naming
Convenção de nomes (classes, funções, variáveis)
UP
pyupgrade
Atualiza sintaxe para Python 3.12+
B
flake8-bugbear
Bugs potenciais e bad practices
C4
flake8-comprehensions
Otimiza list/dict/set comprehensions
SIM
flake8-simplify
Simplificação de código redundante
RUF
ruff-specific
Regras exclusivas do Ruff
ASYNC
flake8-async
Uso correto de async/await (crucial para FastAPI)
Regras Ignoradas
Código
Motivo
E501
Line-length já é controlada pelo formatter
E302
Permite flexibilidade no espaçamento entre classes e funções
Comandos
# Verificar erros de linting (sem alterar arquivos)
ruff check .# Verificar e corrigir automaticamente o que for possível
ruff check --fix .# Verificar formatação (sem alterar arquivos)
ruff format --check .# Aplicar formatação automática
ruff format .
Workflow Recomendado
Antes de cada commit, execute ambos os comandos para garantir código limpo:
# 1. Corrige linting (imports, bugs, simplificações)
ruff check --fix .# 2. Formata o código (indentação, aspas, trailing commas)
ruff format .# 3. Verifica se tudo está limpo (deve retornar sem erros)
ruff check .
ruff format --check .
Dica: Se ruff check --fix não resolver algum erro, será necessário corrigi-lo manualmente. Erros comuns que exigem correção manual incluem:
B904:raise ... from e dentro de blocos except (encadeamento de exceções)
F841: Variáveis atribuídas mas nunca usadas (prefixar com _)
RUF001: Caracteres Unicode ambíguos em strings
🧪 Testes
A suíte de testes utiliza pytest com suporte assíncrono e mocks para isolamento de dependências.
# Executar todos os testes
pytest
# Executar com cobertura
pytest --cov=.
# Executar testes específicos
pytest tests/test_xml_adapter.py -v