O objetivo deste desafio é construir uma API RESTFul para efetuar pagamentos simples. Nela deve ser possível realizar transferências de dinheiro entre usuários. Temos 2 tipos de usuários: os comuns e os lojistas, sendo que ambos possuem carteira com dinheiro e realizam transferências entre eles.
A API desenvolvida deve respeitar as regras de negócio a seguir:
-
Este serviço deve ser RESTFul;
-
Para ambos tipos de usuário, precisamos do
Nome Completo
,CPF/CNPJ
,E-mail
eSenha
. CPF/CNPJ e e-mail devem ser únicos no sistema. Sendo assim, seu sistema deve permitir apenas um cadastro com o mesmo CPF/CNPJ ou endereço de e-mail; -
Usuários comuns podem enviar dinheiro (efetuar transferência) para lojistas e entre usuários comuns;
-
Lojistas só recebem transferências, não enviam dinheiro para ninguém;
-
Validar se o usuário tem saldo antes da transferência;
-
Antes de finalizar a transferência, deve-se consultar um serviço autorizador externo. Use este mock https://util.devi.tools/api/v2/authorize para simular o serviço utilizando o verbo
GET
. Ele retornará uma resposta no seguinte formato:
{"status" : "success", "data" : { "authorization" : true }}
A resposta retornada pelo mock é randômica, então também vai acontecer de serem retornadas respostas negativas.
{"status" : "fail", "data" : { "authorization" : false }}
Lembre-se considerar as possíveis respostas que podem ser recebidas do mock no desenvolvimento da API;
-
A operação de transferência deve ser uma transação (ou seja, revertida em qualquer caso de inconsistência) e o dinheiro deve voltar para a carteira do usuário que envia (independente do tipo);
-
No recebimento de pagamento, o usuário comum ou lojista precisa receber uma notificação (envio de email, sms, etc) enviada por um serviço de terceiro e eventualmente este serviço pode estar indisponível/instável. Use este mock https://util.devi.tools/api/v1/notify para simular o envio da notificação utilizando o verbo
POST
. Ele retornará uma resposta no seguinte formato:
{"status" : "success", "data" : { "sent" : true }}
A resposta retornada pelo mock é randômica, então também vai acontecer de serem retornadas respostas negativas.
{"status" : "fail", "data" : { "sent" : false }}
Lembre-se considerar as possíveis respostas que podem ser recebidas do mock no desenvolvimento da API.
A implementação do endpoint de transferência deve seguir o contrato seguir:
POST /transfer
Content-Type: application/json
{
"value": 100.0,
"payer": 4,
"payee": 15
}
Você pode implementar o que achar conveniente para o funcionamento do sistema, porém a avaliação do resultado do desafio vai considerar apenas o fluxo de transferência entre 2 usuários. O fluxo de gerenciamento de usuários e autenticação da API não são requisitos para conclusão do desafio, mas são bem-vindos se implementados.
Lembre-se de respeitar as regras de negócio do desafio.
Nome | Versão |
---|---|
Laravel | v10.x + |
PHP | v8.2.x + |
Docker | v20.10.x + |
Docker Compose | v3.8.x + |
MySQL | v8.0.x |
Redis | v6.2.x |