API RESTful criada com NodeJS + Express que funciona como uma versão super simplificada de um Payment Service Provider (PSP).
Este é um desafio de backend para um processo seletivo, críticas e sugestões são sempre bem-vindas. :P
Fico disponível para contato pelo meu email (abner.figueiredo.bertelline@gmail.com) e/ou LinkedIn.
Para executar este projeto você precisará ter um ambiente básico com o NodeJS 10+ e PostgreSQL 10+ instalados.
Criando os bancos de dados
$ psql -U <your_user> -W
$ Password: <your_password>
$ <your_user>=# CREATE DATABASE psp_challenge;
$ <your_user>=# CREATE DATABASE psp_challenge_test;
$ \q
Você pode alterar os nomes dos bancos se desejar, basta mudar no arquivo .env depois ;)
Instalando as dependências
$ yarn
$ npm install
Configurando o .env
Crie um arquivo .env na raiz do projeto para manter as variáveis de ambiente, seguindo o padrão apresentado no arquivo .env.example. Não esqueça de colocar seu usuário e senha do PostgreSQL para que a aplicação consiga se conectar. :)
Rodando as migrations
$ yarn knex migrate:latest
$ npm run knex migrate:latest
Nota: Você pode rodar
yarn knex migrate:rollback
ounpm run knex migrate:rollback
para dar rollback nas migrations.
$ yarn dev
$ npm run dev
$ yarn test
$ npm run test
Base
URL base da API: http://localhost:8000/api
data: Dados retornados
error: Flag de ocorrência de erro
message: Mensagem indicando sucesso ou o erro
Exemplo de corpo do retorno
{
"data": null,
"error": false,
"message": "PSP Challenge API"
}
Processamento de transações
POST em http://localhost:8000/api/transaction
value (number): Valor da transação
description (string): Descrição da transação
paymentMethod (debit_card
oucredit_card
): Método de pagamento
card (object): Dados do cartãonumber (string): Número do cartão
owner (string): Nome do portador do cartão
expiration (string): Data de validade do cartão no formato MM/YYYY
cvv (string): Código de verificação do cartão
Exemplo de corpo da requisição
{
"value": 100,
"description": "Smartband XYZ 3.0",
"paymentMethod": "debit_card",
"card": {
"number": "5168441223630339",
"owner": "Abner Bertelline",
"expiration": "13/2089",
"cvv": "209"
}
}
Exemplo de dados retornados
{
"id": 10
}
Listagem das transações já realizadas
GET em http://localhost:8000/api/transaction
page (number): Número da página
pageSize (string): Número de resultados por página
includeTotal (boolean): Flag indicando se deve retornar o número total de transações
Exemplo de QueryString da requisição
?page=2&pageSize=1&includeTotal=true
Exemplo de dados retornados
[
{
"id": 2,
"cardLastDigits": "0339",
"description": "Smartband XYZ 3.0",
"value": 235.43,
"paymentMethod": "credit_card",
"createdAt": "2019-11-19T04:26:19.738Z"
}
]
Consulta de saldo
GET em http://localhost:8000/api/balance
Exemplo de dados retornados
{
"available": 1135.74,
"waiting_funds": 922.32
}