/psp-api-challenge

Desafio de API - Payment Service Provider (PSP) minimalista.

Primary LanguageJavaScript

psp-challenge

API RESTful criada com NodeJS + Express que funciona como uma versão super simplificada de um Payment Service Provider (PSP).

Sobre este projeto

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.

Começando

Pré-requisitos

Para executar este projeto você precisará ter um ambiente básico com o NodeJS 10+ e PostgreSQL 10+ instalados.

Configurando o ambiente

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 ou npm run knex migrate:rollback para dar rollback nas migrations.

Executando o ambiente de desenvolvimento

$ yarn dev
$ npm run dev

Executar os Testes

$ yarn test
$ npm run test

Rotas

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 ou credit_card): Método de pagamento

card (object): Dados do cartão

number (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
}