Pular para o conteúdo principal
← Voltar aos projetos Nadinha

Nadinha

React Node.js TypeScript PostgreSQL

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.

Galeria