Possível solução para o Desafio do Cartão de Multi-Crédito para a vaga de backend developer na Stone Pagamentos.
Essa api foi criada utilizando as seguintes tecnologias:
- Microsoft ASP.NET Core 2.0
- Padrão Mediator com a bibilioteca MediatR
- Validação de comandos (fail-fast) via middleware usando a biblioteca Fluent Validation
- Log com a biblioteca Log4Net
- Visualização dos logs da aplicação no PaperTrail
- Autenticação de usuário baseada em token JWT Json Web Token
- Banco de dados SQL com Heroku Postgres
- Documentação da API gerada com o Swagger
- Remover lançamento de exceptions do dominio e substituir por Domain Notifications.
Primeiramente será necessário instalar o .Net Core 2.0 SDK, em seguida use os seguintes comandos no terminal para clonar e executar o projeto:
git clone https://github.com/wellingtonjhn/backend-test-stone-wallet
cd stone-wallet\StoneWallet\StoneWallet.Api\
dotnet build
dotnet run
Neste momento, serão exibidas as configurações de inicialização no terminal, bem como o endereço e porta em que a aplicação está rodando. Basta copiar a url e acessar seus endpoints conforme exemplos abaixo, respeitando sempre a porta em que a aplicação está rodando.
Você também pode abrir o arquivo de Solution diretamente no Visual Studio, marcar o projet o StoneWallet.Api.csproj como default e pressionar a tecla F5 para executar a aplicação.
Esse projeto conta com uma documentação dos endpoints da API feita através do Swagger. Após rodar a aplicação basta acessar a url "http://localhost:{port}/docs/", onde {port} deverá ser substituído pela porta em que a aplicação está rodando em seu computador.
Os exemplos abaixo utilizam a ferramenta de linha de comando CURL, mas você também pode utilizar o Postman para realizar as chamadas na api. Neste caso, basta importar para o Postman o arquivo Stone Wallet.postman_collection.json que está na raiz do repositório.
curl -X POST http://localhost:51177/api/accounts/register \
-H 'content-type: application/json' \
-d '{
"name" : "Wellington Nascimento",
"email" : "wellington@email.com",
"password" : "pass"
}'
curl -X POST http://localhost:51177/api/accounts/login \
-H 'content-type: application/json' \
-d '{
"email" : "wellington@email.com",
"password" : "pass"
}'
curl -X GET http://localhost:51177/api/accounts/profile \
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 ...'
curl -X PUT http://localhost:51177/api/accounts/profile/password \
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 ...' \
-H 'content-type: application/json' \
-d '{ "newPassword" : "new pass", "newPasswordConfirmation" : "new pass" }'
curl -X GET http://localhost:51177/api/wallets \
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 ...'
curl -X POST http://localhost:51177/api/wallets/creditcards \
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 ...' \
-H 'content-type: application/json' \
-d '{
"number" : 1234567890987654,
"dueDate" : "2017-10-15",
"expirationDate" : "2022-03-12",
"printedName" : "Wellington Nascimento",
"cvv" : 567,
"creditLimit" : 1500
}'
curl -X PUT http://localhost:51177/api/wallets/limit \
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 ...' \
-H 'content-type: application/json' \
-d '{ "limit" : 1000 }'
curl -X DELETE http://localhost:51177/api/wallets/creditcards \
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 ...' \
-H 'content-type: application/json' \
-d '{ "creditCardId" : "77898ef0-152c-473d-aed2-0269ec910363" }'
curl -X POST http://localhost:51177/api/wallets/purchase \
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 ...' \
-H 'content-type: application/json' \
-d '{ "amount": 800 }'
curl -X POST \
http://localhost:51177/api/wallets/creditcards/payment \
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 ...' \
-H 'content-type: application/json' \
-d '{ "cardId" : "379d2521-bffa-4941-8669-4f18f0e63777", "amount" : 500 }'