implementação de um Payment Service Provider (PSP) para o desafio técnico da vaga de Software Engineer na Pagar.me
este projeto destina-se a implementação de um PSP muito simples, cujas responsabilidades são: processar transações, retornar transações criadas, criação de pagáveis e retornar saldo.
a stack de tecnologia no projeto foi a seguinte:
- Docker e Docker Compose para a criação do ambiente de desenvolvimento;
- Express utilizado para a criação do servidor web da API REST;
- PostgreSQL como banco de dados relacional e Sequelize como ORM (object relational mapper);
- Redis para armazenamento de dados em memória;
- Escriba como middleware para o Express para o log das requisições HTTP;
- Pagar.me JavaScript Style Guide plugin para o ESLint como linting;
certifique-se que os seguintes softwares estejam instalados em sua máquina para a correta execução do projeto:
a seguir, instruções para a instalação e execução do projeto:
- clone o repositório:
$ git clone https://github.com/nikolasrangel/tiny-psp.git
- criação do arquivo .env:
crie um arquivo .env
na raiz do projeto com as mesmas variáveis do .env.example
- faça o build da imagem base:
$ docker-compose build server
antes de subir nosso servidor web, é necessário subir previamente o banco Postgres (e executar suas migrações/seeds) e o Redis.
vamos lá:
- subindo banco Postgres, realizando as migrações e seed:
$ make setup-postgres-db
- subindo o Redis:
$ make start-redis
- por fim, subindo o servidor HTTP na porta default (3000):
$ make server
esta seção tem como objetivo explicitar cada endpoint do projeto.
criação de uma nova transação
exemplo:
-
requisição:
POST /api/v1/transaction
Content-Type: application/json { "amount": 15000, "description": "Calça que vira bermuda", "payment_method": "debit_card", "card_number": "5197364440676122", "card_holder_name": "NIKOLAS J R SOUZA", "card_expiration_date": "0120", "card_cvv": "323", "api_key": "ji919n9sahsak" }
-
resposta:
200 OK
Content-Type: application/json { "id": 1, "amount": 15000, "description": "Calça que vira bermuda", "payment_method": "debit_card", "card_holder_name": "NIKOLAS J R SOUZA", "card_expiration_date": "0120", "card_cvv": "323", "api_key": "ji919n9sahsak", "card_last_digits": "6122", "card_brand": "mastercard", "updatedAt": "2019-06-10T04:02:27.501Z", "createdAt": "2019-06-10T04:02:27.501Z" }
obtendo uma lista das transações já criadas
exemplo:
-
requisição:
GET /api/v1/transaction
-
resposta:
200 OK
Content-Type: application/json [ { "id": 1, "api_key": "ji919n9sahsak", "amount": 2000, "card_holder_name": "NIKOLAS J R SOUZA", "card_expiration_date": "0520", "card_last_digits": "6122", "card_cvv": "323", "card_brand": "mastercard", "payment_method": "credit_card", "description": "Apple Watch", "createdAt": "2019-06-10T00:38:37.479Z", "updatedAt": "2019-06-10T00:38:37.479Z" }, { "id": 2, "api_key": "ji919n9sahsak", "amount": 2000, "card_holder_name": "NIKOLAS J R SOUZA", "card_expiration_date": "0520", "card_last_digits": "6122", "card_cvv": "323", "card_brand": "mastercard", "payment_method": "credit_card", "description": "Apple Watch", "createdAt": "2019-06-10T00:38:38.375Z", "updatedAt": "2019-06-10T00:38:38.375Z" } ]
obtendo o saldo available
e waiting_funds
para o cliente com determinada api_key
obrigatório: requisição deve conter query string api_key
exemplo:
-
requisição:
GET /api/v1/balance?api_key=xxxxxxx
-
resposta:
200 OK
Content-Type: application/json { "object": "balance", "available": { "amount": 22310 }, "waiting_funds": { "amount": 28500 } }
ao realizar requisição em uma rota não definida, a API retornará um JSON com mensagem de erro e código HTTP específico (404)
exemplo
-
requisição:
GET /api/v1/recurso_nao_existente
-
resposta:
404 NOT FOUND
Content-Type: application/json { "errors": { "message": "Recurso procurado nao foi encontrado." } }
após subir o servidor web, ele estará disponível na porta 3000. assim, tem-se as seguintes opções para a realização das requisições HTTP para teste e validação dos endpoints:
- utilizando cURL:
comandos cURL disponíveis no seguinte caminho: src/test/manual/curl
- utilizando o Postman:
coleção das requisições no caminho: src/test/manual/postman-collection v2.1
obs: em src/test/data
tem-se também exemplos de demais dados para transações e cartões de crédito válidos e inválidos
- criar testes unitários e/ou de integração;
- criar worker com rotina diária para verificar transações com status 'waiting_funds';
- monitorar API e melhorar error handling.