Nadinha
Visão Geral
O Nadinha nasceu de uma dor muito específica: minha esposa trabalhava em uma empresa de crédito consignado que gerenciava dezenas de clientes ao mesmo tempo usando planilhas soltas, anotações em papel e memória. Cada cliente tinha benefícios diferentes, bancos parceiros e entidades vinculadas, sem um lugar único para consolidar tudo. Isso gerava retrabalho, perda de histórico e atendimento inconsistente.
A proposta foi construir um CRM realmente alinhado ao domínio de crédito consignado, em vez de adaptar uma ferramenta genérica. O sistema permite cadastrar clientes, vincular benefícios, bancos e entidades de forma dinâmica, manter um perfil completo de cada cliente e registrar um histórico de interações e anotações em formato rico. A interface foi pensada para uso diário no desktop da empresa, por pessoas não técnicas.
Atuei como desenvolvedor fullstack solo: desenhei o modelo de dados em PostgreSQL, implementei a API REST em Node.js/Express com TypeScript e TypeORM, e construí o front-end em React com Redux/Redux-Saga e Styled-Components. Também cuidei da infra básica com Docker, Redis, filas de background e integrações com AWS (S3/SES) e Sentry.
O sistema rodou em produção e gerenciou uma carteira de cerca de 100 clientes, centralizando a operação em uma única aplicação, com histórico rastreável por cliente e cadastro dinâmico de bancos, benefícios e entidades sem necessidade de envolvimento técnico.
Diferencial Principal
O diferencial do SistemaNadinha não é “ser um CRM”, mas ser um CRM moldado ao fluxo real de crédito consignado, com decisões de engenharia voltadas para estabilidade do dia a dia em um escritório pequeno.
Em vez de um esquema rígido, o modelo de dados permite que bancos parceiros, benefícios e entidades sejam gerenciados via painel administrativo, refletindo rapidamente mudanças na operação. No front-end, optei por Redux-Saga e um fluxo de autenticação robusto (tokens, refresh automático, persistência criptografada) para garantir sessões estáveis mesmo em máquinas compartilhadas.
Outro ponto relevante é a combinação de cache em Redis e filas com Bull para aliviar a API: dados pouco mutáveis (bancos, entidades) são servidos via cache com TTL configurado, e envios de e-mail e outras tarefas pesadas rodam assíncronas, mantendo o uso diário rápido, mesmo com infraestrutura simples.
Arquitetura
- Frontend (React 17 + TypeScript): SPA voltada para desktop, com Redux para estado global, Redux-Saga para side-effects, Styled-Components para estilização e integrações com a API via Axios.
- Gerenciamento de Autenticação: Fluxo de login com JWT, refresh token, persistência criptografada no client (redux-persist + localforage) e AuthContext para validação periódica de sessão.
- Backend API (Node.js + Express): API REST em TypeScript, organizada por módulos de domínio (users, clients, bancos, beneficios, entidades), validação e serialização consistentes.
- Camada de Serviços: Services desacoplados do ORM, injetados via tsyringe (DI), concentrando regras de negócio como vínculo de benefícios e entidades ao cliente.
- Repositórios (TypeORM): Repositórios por agregado de domínio, com migrations versionando a evolução do schema em PostgreSQL.
- Banco de Dados (PostgreSQL): Armazena usuários, clientes, bancos parceiros, benefícios, entidades, histórico de anotações e metadados.
- Cache e Filas (Redis + Bull): Redis para cache de dados frequentemente consultados e backend de filas Bull para processamento assíncrono (e-mails, tarefas de rotina).
- Armazenamento de Arquivos (AWS S3): Upload e gestão de arquivos vinculados a clientes (contratos, comprovantes) fora do banco relacional.
- Envio de E-mails (AWS SES): Disparo de comunicações transacionais e e-mails de acompanhamento via filas de background.
- Observabilidade (Sentry): Captura de erros do backend em produção para monitorar falhas reais dos usuários.
Destaques Técnicos
- Implementei fluxo de autenticação com JWT + refresh token, usando interceptor Axios que renova o token automaticamente em caso de 401 e reenvia a requisição original, sem quebra de UX.
- Configurei Redux com Redux-Saga e redux-persist criptografado (localforage + transform encrypt) para garantir persistência segura de sessão e dados essenciais em máquinas compartilhadas.
- Modelei o domínio em módulos independentes (users, clients, bancos, beneficios, entidades) com camada de serviços desacoplada de TypeORM via padrão Repository e injeção de dependências (tsyringe).
- Usei Redis como cache de dados de leitura intensiva (bancos, entidades) com TTL de 6 horas, reduzindo carga no PostgreSQL e melhorando tempo de resposta da API.
- Integrei Bull Queue com Redis para processamento assíncrono de e-mails e rotinas, evitando travar requisições HTTP com operações de I/O externas.
- Desenvolvi um wrapper customizado integrando SunEditor (WYSIWYG) ao Unform, sincronizando conteúdo rico do editor com o estado do formulário sem re-renderizações desnecessárias.
- Organizei toda a stack com Docker (API, banco, Redis), simplificando setup local e implantação em servidor simples com variáveis de ambiente.