Skip to content

Teste codificando um gateway de pagamento com a Pagar.me

Notifications You must be signed in to change notification settings

rubythonode/node-gateway-payment

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

71 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

App scafolding

Este é o exemplo de código que eu, Jorge Feldmann, julgo o ideal para iniciar um projeto para aplicação Node.js. O código é baseado em refactoring de código para utilizar a API da Pagar.me

Desafio

A idéia é entender o que o código original (docs/codigo-original) faz para então consertar e refatorar o que achar necessário. Desde que o código atenda a funcionalidade inicial (que é extremamente básica), sinta-se livre para adicionar ou remover o que quiser dele. Note que este código contém desde pequenos erros até questões extremamente importantes que estão faltando. O objetivo final é entregar um projeto completo, seguro, pronto para produção e de fácil manutenção.

Não fique preso a apenas refatorar o código, altere o que achar necessário para deixar o projeto em um estado pronto para produção, então escolha querer evoluir o quanto quiser, mas cuidado apenas com over engineering.

Análise do desafio

Sobre over engineering: quando se trata de um teste com foco em produção, creio que a prioridade seja demonstrar o máximo de conhecimento, focando em conceitos como DRY, KISS, separação de contextos, modularização, legibilidade, para demonstrar tais recursos.

A solução aqui proposta é um exemplo de scafolding que engloba conceitos de segurança, performance, escalabilidade e agilidade no desenvolvimento de novos recursos, bem como uso de wrappers para componentes.t

O que foi alterado:

  • Rotas: para a listagem e criação, a rota é a mesma (/pokemons), mas com os verbos GET e PUT (idempotente) respectivamente. Para o processo de compra (/pokemons/buy) o recurso de compra (/buy) foi transformado num nível abaixo do recurso principal, ao contrário da original (/buy-pokemons);
  • Segurança: uso do middleware Helmet;
  • Modularização das rotas (routes/routes.js) e dos recursos (/app/pokemons), ao invés de manter tudo isso atrelado;
  • Performance: conversão de console.log (que afunila o processamento) para um chaveamento de logs em arquivo para produção ou console.log em dev, componente Bunyan
  • Uso de steps e init() para mostrar o passo-a-passo das funções (leia o código de baixo para cima)
  • Uso do Revealing Pattern, com composição, para criação de objetos (return _public), mantendo o "new" para denotar instanciação de objetos
  • Uso do PM2: solução completa, open source e gratuita para monitoramento. Para DEV: recarregar alterações e acompanhamento de uso de recursos. Para PROD: uso de clusterização, recursos, API de healthcheck, escalonamento de instâncias, etc
  • Promisses: ótimas para legibilidade, mas têm que se ter cuidado para tratativa de erros. Modifiquei os principais pontos em steps para legibilidade e melhor tratativa de erros
  • Config.js: certas constantes de configuração (porta da API, nome, api_key, url de serviços) foram transferidos para um arquivo config/config.js, afim de evitar "chumbar" tais dados dentro da aplicação
  • API Pagar.me: foi criado um wrapper (common/pagarme). A API_KEY está em config/config.js.
  • Dados de mock do pagamento: ainda estão dentro do recurso pokemon
  • Codificação literária: nomes de funções representam o que elas fazem. Ficam longas, mas evitam comentários
  • Assinatura de funções e métodos possuem o tipo esperado (intQuantity, objResponse), baseado na notação de código húngara
  • Design patterns de Node.js elementares e avançados
  • Uso de features disponíveis do Node.js ES6
  • Uso de debug com node-inspector
  • Performance sistêmica: guia Node.js para profiling
  • Performance de I/O HTTP: uso de stress test com siege -b -c100 -t 60S http://localhost:3000
  • Testes de API baseados em testes funcionais da StrongLoop
  • Integração contínua com Travis.CI
  • Organização de pastas baseada em comportamentos
  • Uso do NPM como ferramental de build, perfis, etc
  • Transformação do modelo de dados baseado em Sequelize.js para um arquivo separado, baseado em componentes de model. Podemos usar Sequelize, Mongoose, Bookshelf, ou até mesmo Joi do Happi.js, apenas mudando o componente de factory de models
  • Autenticação: usaria JWT (JSON Web Tokens) , Passport.js, com o Redis ou MemCache
  • IDE: Sublime, com templates, snippets e meu gerador de código. Mas usaria um Web Storm com muita alegria ;)

Referências:

Instalação

Instalação do Node.js 6.0.0 e do NPM

  • Node.js versão 6.0.0
  • Instruções de instalação neste link
  • Ao final, verificar a versão de ambos para confirmar:
node -v
npm -v
  • Recomenda-se o uso de NVM para versionar diferentes versões do Node.js

Dependências

  • Instalação global do componente PM2 1.x
npm install -g pm2
pm2 -v

Instalação do projeto

git clone https://github.com/jotafeldmann/node-gateway-payment
cd node-gateway-payment/src
npm install

Inicializando a aplicação

Acessar a pasta com o código:

cd node-gateway-payment/src

Iniciar a aplicação para PROD

Inicializa o PM2, com a aplicação como serviço, utilizando o máximo de núcleos disponíveis, observando mudanças e atualizando, reiniciando caso ocorram falhas

export NODE_ENV=production
cd node-gateway-payment/src
npm start

Parar a aplicação

npm stop

Iniciar a aplicação para DEV

Inicializa o PM2, com a aplicação como serviço, utilizando 1 núcleo, observando mudanças, parando a cada falha e lançando o log após a inicialização

npm run dev

Logs da aplicação

npm run logs

Testes

Acessar a pasta com os testes:

cd node-gateway-payment/testes

Instalação dos testes e dependências

  • Instalação global do Mocha
npm install -g mocha
mocha --version
  • Instalação das dependências locais dos testes
cd funcionais
npm install

Iniciar os testes

cd node-gateway-payment/src
npm test

Estudo do código

Após subir a aplicação, acessar http://localhost:3000 para verificar os recursos disponíveis.

Licença

MIT License © Jorge Feldmann (jotafeldmann)

About

Teste codificando um gateway de pagamento com a Pagar.me

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published