Este é o teste prático de estágio da Ultralinks, onde foi solicitado a criação de uma API REST utilizando PHP/Laravel, com o banco de dados sendo executado em um contêiner Docker. Neste README, será demonstrado como iniciar o projeto Laravel em sua máquina. Além disso, serão fornecidos comentários sobre os endpoints desenvolvidos.
Para implementar o endpoint de cadastro de usuários, criei duas tabelas no banco de dados para armazenar as informações necessárias. Os campos requeridos no cadastro são:
a. Nome Completo;
b. Data de Nascimento;
c. CPF;
d. Email;
e. Senha (Criptografada no Banco);
f. Endereço de Cobrança; i. CEP; ii. Complemento; iii. Número de Endereço.
Os usuários são obrigados a fornecer o CEP e o número de endereço durante o cadastro. Utilizando o CEP fornecido, preencho automaticamente a tabela de endereços.
Metodo POST:
http://localhost:8000/user
{
"name":"pedro",
"email":"[email protected]",
"cpf":"55874123",
"date_birth":"2023-08-12",
"password":"23132",
"cep":"18570-970",
"number_adress":157
}
Se todos os campos forem preenchidos corretamente, a resposta será a seguinte:
{
"name": "pedro",
"email": "[email protected]",
"cpf": "55874123",
"date_birth": "2023-08-12",
"updated_at": "2023-12-10T20:54:58.000000Z",
"created_at": "2023-12-10T20:54:58.000000Z",
"id": 3
}
Se algum campo estiver inválido ou não preenchido, a resposta será um JSON contendo a
informação adequada do erro, por exemplo:
{
"messageError": "Bad Request",
"statusCode": 400,
"timestamp": "2023-12-10 05:57:49pm"
}
Para concluir, a imagem das duas tabelas utilizadas neste primeiro endpoint.
O segundo endpoint implementado é destinado à autenticação de usuários, exigindo os campos obrigatórios de email e senha para a validação. No processo de autenticação, utilizei a tecnologia JWT para a geração de tokens.
Metodo POST:
http://localhost:8000/auth
{
"email":"[email protected]",
"password":"23132"
}
Os dados serão verificados no banco de dados, e se estiverem corretos, retorna um token.
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwMDAvYXV0aCIsI
mlhdCI6MTcwMjI0MzQzNSwiZXhwIjoxNzAyMjQ3MDM1LCJuYmYiOjE3MDIyNDM0MzUsImp0aSI6IjdISWtUT0JleTBTeEdhaUsiLCJzdWIiOiIzIiwicHJ2IjoiMjNiZDVjODk0OWY2MDBhZGIzOWU3MDFjNDAwODcyZGI3YTU5NzZmNyJ9.ZuTaKi2eHU1WV_HFWWhep6X5ptMfaCkHi1MwuEy9EiE",
"token_type": "bearer",
"expires_in": 3600
}
Se o usuário não estiver cadastrado ou se houver algum campo inválido,retornará a seguinte resposta:
{
"messageError": "Not Found",
"statusCode": 404,
"timestamp": "2023-12-10 09:27:23pm"
}
O terceiro endpoint é responsável por realizar depósitos de dinheiro em uma conta e gerar um código para identificar a transação. Para implementar esse endpoint, foram necessárias duas tabelas no banco de dados: account, que armazena o saldo total do usuário, e historic, que registra as operações realizadas pelo usuário, incluindo o valor depositado.
É importante destacar que o usuário só poderá efetuar um depósito se estiver cadastrado e autenticado.
Metodo POST:
http://localhost:8000/user/deposit
Se o CPF fornecido for válido, pertencer ao usuário logado,
e o valor depositado for positivo e válido,
retornará a seguinte resposta.
{
"Account": {
"user_cpf": "55874123",
"balance": 600,
"updated_at": "2023-12-10T21:48:25.000000Z",
"created_at": "2023-12-10T21:48:25.000000Z",
"id": 3
},
"Deposit": {
"value": 600,
"operation": "DEP1287",
"id_account": 3,
"id": 6
}
}
Caso o usuario informe um valor negativo, retornará a seguinte resposta.
{
"messageError": "Bad Request",
"statusCode": 400,
"message": "invalid field",
"timestamp": "2023-12-10 09:51:02pm"
}
Para concluir, a imagem das duas tabelas utilizadas neste terceiro endpoint.
O quarto endpoint consiste em transferências entre usuários. Para realizar uma transferência, o usuário precisa ter uma conta cadastrada com saldo suficiente. Além disso, o destinatário da transferência também deve estar cadastrado.
Metodo POST:
http://localhost:8000/user/transfer
Se ambos os usuários estiverem cadastrados e o valor da transferência for compatível
com o saldo do remetente, a operação será concluída com sucesso e retornará o seguinte resultado:
{
"Account": {
"id": 3,
"user_cpf": "55874123",
"balance": 1100,
"created_at": "2023-12-10T21:48:25.000000Z",
"updated_at": "2023-12-10T21:48:25.000000Z"
},
"Deposit": {
"value": 500,
"operation": "DEP1970",
"id_account": 3,
"id": 7
}
}
Se o CPF do destinatário da transferência for inválido ou não estiver cadastrado,
será retornado um erro indicando a impossibilidade de realizar a transferência.
{
"messageError": "Not Found",
"statusCode": 404,
"timestamp": "2023-12-10 11:38:37pm"
}
Imagem do banco completa.