Api REST para gerenciamento de clientes e empréstimos.
- JAVA 8 - Linguagem de programação (JDK 1.8).
- Spring - Framework MVC.
- Apache Maven 3.8.6 - Gerenciador de dependências.
- IntelliJ - IDE para desenvolvimento.
- Docker - Serviço de virtualização.
- H2 Database - Banco de dados relacional escrito em Java que funciona em memória.
O projeto foi desenvolvido utilizando o SonarQube para verificar a qualidade de código. O resultado do SonarQube pode ser visto abaixo:
Para executar o projeto você pode utilizar a IDE de sua preferência, executar através do Maven ou através do Docker.
Para executar o projeto através da IDE, basta importar o projeto como um projeto Maven e executar a classe EmprestimoApiApplication.
Para executar o projeto através do Maven, basta executar o comando abaixo na raiz do projeto:
mvn spring-boot:run
Para executar o projeto através do Docker, basta executar o comando abaixo na raiz do projeto:
docker-compose up
Para executar os testes de unidade, basta executar o comando abaixo na raiz do projeto:
mvn test
este comando irá executar os testes de unidade e exibirá o resultado no console.
- Possuir o JDK 1.8 instalado
- Possuir o Maven instalado
- Possuir o Docker instalado ( Opcional )
- Uma IDE ou editor de sua preferência ( Opcional )
As dependências são declaradas no arquivo pom.xml.
Dependência | Descrição | Versão |
---|---|---|
H2database | Banco de dados relacional escrito em Java que funciona em memória | 2.1.214 |
Spring-boot-starter-data-jpa | Responsável por conectar a aplicação Spring com o banco de dados | 2.7.9 |
Spring-boot-starter-web | Responsável pela camada MVC do Spring | 2.7.9 |
Project-lombok | Biblioteca para reduzir a verbosidade do código | 1.18.20 |
Mapstruct-processor | Responsável por gerar os mappers de conversão de objetos | 1.4.2 |
Spring Validation | Responsável por validar os objetos de entrada da API | 2.7.9 |
Junit 5 | Biblioteca para criação de testes de unidade | 5.8.1 |
Jacoco-maven-plugin | Responsável por gerar o relatório de cobertura de testes do Sonar | 0.8.7 |
Método | Endpoint | Descrição |
---|---|---|
GET | "/api/v1/clientes" | Retorna todos os clientes cadastrados |
GET | "/api/v1/clientes/{cpf}" | Retorna o cliente com o cpf informado |
POST | "/api/v1/clientes" | Cadastra um novo cliente |
PUT | "/api/v1/clientes/{cpf}" | Atualiza o cliente com o cpf informado |
DELETE | "/api/v1/clientes/{cpf}" | Deleta o cliente com o cpf informado |
Ao atualizar um cliente (PUT), os campos que não forem informados serão mantidos.
Método | Endpoint | Descrição |
---|---|---|
GET | "/api/v1/clientes/{cpf}/emprestimos | Retorna todos os empréstimos do cliente com o cpf informado |
GET | "/api/v1/clientes/{cpf}/emprestimos/{id}" | Retorna o empréstimo do cliente com o cpf informado e o id informado |
POST | "/api/v1/clientes/{cpf}/emprestimos" | Cadastra um novo empréstimo para o cliente com o cpf informado |
DELETE | "/api/v1/clientes/{cpf}/emprestimos/{id}" | Deleta o empréstimo do cliente com o cpf informado e o id informado |
Para facilitar o teste dos endpoints, foi criado uma collection no Postman com todos os endpoints e exemplos de requisições.
Para facilitar o entendimento do projeto, segue abaixo um json de exemplo para cada recurso.
{
"nome": "Frodo Bolseiro",
"cpf": "81599250004",
"telefone": "11999999999",
"rendimentoMensal": 100000,
"rua": "1 Bagshot Row, Condado",
"numero": 1123,
"cep": "04111-111"
}
- O campo CPF é utilizado como identificador do cliente, portanto não pode ser repetido e deve ser um CPF válido.
- O campo telefone deve ser um número de telefone válido celular ou fixo ( 10 ou 11 dígitos) sem máscara.
- O campo rendimentoMensal deve ser um número positivo.
- O campo CEP deve ser um CEP válido no formato 00000-000.
{
"valorInicial": 1.00,
"dataInicio": "2017-01-13",
"dataFinal": "2017-01-13",
"relacionamento": "GOLD"
}
- O campo valorInicial deve ser um número positivo.
- O campo dataInicio deve ser uma data válida no formato yyyy-MM-dd.
- O campo dataFinal deve ser uma data válida no formato yyyy-MM-dd.
- O campo relacionamento descreve o relacionamento do cliente com a empresa este é utilizado para calcular o valor final do empréstimo. Os valores possíveis são: OURO, PRATA e BRONZE ou suas respectivas traduções em inglês (GOLD, SILVER e BRONZE).
curl --location --request GET 'http://localhost:8080/api/v1/clientes'
curl --location --request GET 'http://localhost:8080/api/v1/clientes/81599250004'
curl --location --request POST 'http://localhost:8080/api/v1/clientes' \
--header 'Content-Type: application/json' \
--data-raw '{
"nome": "Frodo Bolseiro",
"cpf": "81599250004",
"telefone": "11999999999",
"rendimentoMensal": 100000,
"rua": "1 Bagshot Row, Condado",
"numero": 1123,
"cep": "04111-111"
}'
curl --location --request PUT 'http://localhost:8080/api/v1/clientes/81599250004' \
--header 'Content-Type: application/json' \
--data-raw '{
"nome": "Frodo Bolseiro",
"cpf": "81599250004",
"telefone": "11999999999",
"rendimentoMensal": 1000000,
"rua": "Valfenda",
"numero": 1123,
"cep": "04111-111"
}'
curl --location --request DELETE 'http://localhost:8080/api/v1/clientes/81599250004'
curl --location --request GET 'http://localhost:8080/api/v1/clientes/81599250004/emprestimos'
curl --location --request GET 'http://localhost:8080/api/v1/clientes/81599250004/emprestimos/1'
curl --location --request POST 'http://localhost:8080/api/v1/clientes/81599250004/emprestimos' \
--header 'Content-Type: application/json' \
--data-raw '{
"valorInicial": 1.00,
"dataInicio": "2017-01-13",
"dataFinal": "2017-01-13",
"relacionamento": "GOLD"
}'
curl --location --request DELETE 'http://localhost:8080/api/v1/clientes/81599250004/emprestimos/1'
O banco de dados utilizado foi o H2, que é um banco de dados em memória. Para acessar o console do banco de dados, basta acessar a url http://localhost:8080/h2-console e inserir as informações abaixo:
Campo | Valor |
---|---|
Driver Class | org.h2.Driver |
JDBC URL | jdbc:h2:mem:emprestimo |
User Name | sa |
Password | {em branco} |
O relacionamento entre as entidades Cliente e Empréstimo é de um para muitos, ou seja, um cliente pode ter vários empréstimos, mas um empréstimo só pode ter um cliente. Além disso, o relacionamento entre as entidades Cliente e Endereço é de um para um, ou seja, um cliente só pode ter um endereço.
Caso tenha alguma dúvida, sugestão ou crítica, entre em contato comigo pelo email ou pelo LinkedIn.