Architecture Decision Records (ADR)
Registro de Decisões de Arquitetura
ADR-001: Monorepo com Turborepo
Status: ✅ Accepted / Aceito
Context: O projeto contém múltiplos desafios que compartilham configurações de TypeScript, ferramentas de lint, e dependências de desenvolvimento. Cada desafio precisa ser desenvolvido e testado independentemente, mas com a capacidade de reutilizar código comum.
Decision: Utilizar Turborepo com pnpm workspaces como gerenciador de monorepo.
- Turborepo oferece cache inteligente de build e paralelismo.
- pnpm é rápido e eficiente com seus links simbólicos.
- Cada desafio é um pacote separado em
packages/backend/,packages/frontend/, etc. - Scripts compartilhados via
turbo.jsonpipeline. Makefilecomo interface unificada para comandos comuns.
Consequences:
- Positive: Builds rápidos com cache, isolamento entre pacotes, dependências compartilhadas.
- Positive: Facilidade para adicionar novos desafios como novos pacotes.
- Negative: Complexidade inicial de configuração do Turborepo.
- Negative: Consumo de disco maior com
node_modulesduplicados entre pacotes.
ADR-002: GraphQL com Relay para Ledger
Status: ✅ Accepted / Aceito
Context: O desafio do ledger bancário exige um CRUD com paginação eficiente e consultas flexíveis. O padrão Relay Connection é ideal para listas paginadas com cursor-based pagination.
Decision: Implementar o ledger usando graphql-js + graphql-relay + DataLoader + Koa.
- Relay Connections para paginação consistente.
- DataLoader para evitar N+1 queries no MongoDB.
- Koa como framework HTTP leve e moderno.
- Mutations seguindo o padrão Relay (input/payload/clientMutationId).
Consequences:
- Positive: Paginação cursor-based eficiente e previsível.
- Positive: Batched queries com DataLoader reduzem latência.
- Positive: Compatível com clientes Relay modernos.
- Negative: Curva de aprendizado do padrão Relay.
- Negative: GraphQL demanda mais configuração inicial que REST.
ADR-003: ISO 20022 para SPI Simulation
Status: ✅ Accepted / Aceito
Context: O SPI (Sistema de Pagamentos Instantâneos) do Banco Central do Brasil utiliza mensagens ISO 20022 no formato XML. Para simular o fluxo Pix de forma realista, é necessário implementar parsing e geração dessas mensagens.
Decision: Utilizar Fastify + fast-xml-parser para implementar o simulador SPI.
- Mensagens ISO 20022 padrões: pacs.008 (crédito), pacs.002 (status), pacs.004 (devolução).
- Parsing e validação rigorosa dos campos obrigatórios.
- Armazenamento em memória para simplicidade (substituível por MongoDB).
- Endpoints REST que aceitam/enviram XML.
Consequences:
- Positive: Fidelidade ao protocolo real do SPI.
- Positive: XML é verboso mas auto-descritivo e validável.
- Positive: Código reutilizável para integração real com o BCB.
- Negative: XML é mais pesado que JSON para tráfego.
- Negative: Parsing de XML requer validação cuidadosa.
ADR-004: MongoDB para Dados Financeiros
Status: ✅ Accepted / Aceito
Context: Sistemas financeiros precisam de consistência transacional e capacidade de armazenar documentos com esquemas flexíveis. O ledger bancário e outros serviços precisam de transações ACID.
Decision: Utilizar MongoDB 7 com Replica Set para transações multi-documento.
- MongoDB oferece transações ACID desde a versão 4.0.
- Replica Set necessário para suporte a transações.
- Mongoose como ODM para modelagem e validação.
- Esquemas flexíveis para evolução rápida.
Consequences:
- Positive: Transações ACID para operações financeiras (débito/crédito atômicos).
- Positive: Esquema flexível para acomodar diferentes tipos de transação.
- Positive: Boa performance para leituras e escritas.
- Negative: MongoDB não é a escolha tradicional para sistemas financeiros (PostgreSQL seria mais comum).
- Negative: Replica Set adiciona complexidade operacional.
ADR-005: Design System Componentizado
Status: ✅ Accepted / Aceito
Context: A landing page e o sistema KYC precisam de componentes UI reutilizáveis e consistentes. Em vez de um único design system monolítico, optou-se por componentes desacoplados.
Decision: Criar um design system com Radix UI + TailwindCSS + CVA + Storybook.
- Radix UI para componentes acessíveis e sem estilo.
- TailwindCSS para estilização utilitária.
- CVA (Class Variance Authority) para variantes de componentes.
- Storybook para documentação e desenvolvimento isolado.
- Tailwind Merge para resolução de conflitos de classes.
- Lucide React para ícones.
Consequences:
- Positive: Componentes acessíveis (Radix UI garante WAI-ARIA).
- Positive: Estilização consistente com TailwindCSS.
- Positive: Storybook permite desenvolvimento e teste isolados.
- Negative: Múltiplas dependências (Radix, CVA, Tailwind Merge).
- Negative: Storybook aumenta o tempo de build.