- Introdução
- Informações Técnicas
- Requisitos para executar a aplicação
- Como usar
- Cobertura de Testes
- Classes não Testadas
Essa é uma API REST criada com Spring Boot 2.1.12.RELEASE que utiliza o MongoDB como Banco de Dados.
A aplicação tem como principais requisitos criar Filmes e expor uma busca dos mesmos a partir do nível de censura.
O fluxo de negócio foi controlado a partir de Exceptions RuntimeException
, afetando inclusive as respostas da API.
Foi criada uma camada de objetos Request e Response a partir da Controller, para os contratos de entrada e saída. Para a conversão dos modelos foi utilizada uma interface de Transformação de objetos, onde cada implementação faz a conversão de um tipo externo para um tipo mais interno, e vice-versa.
Embora não fosse um requisito, foi implementada a paginação na busca de filmes, que facilmente pode ser extendida com ordenação.
Para uma maior flexibilidade e segurança, utilizei os dois produtos da Hashicorp, o Consul
para deixar as propriedades que por ventura possam necessitar de alterações, enfim, facilitando e deixando externa as propriedades não sensíveis que a aplicação necessita, e o por fim, as informações sensíveis ficam no Vault
, protegidas e criptografadas.
O setup do Consul
, Vault
e do MongoDB
foi feito através do arquivo docker-compose
. No caso do Consul, há uma pasta com o setup inicial das propriedades: data/consul/
, lá o arquivo data.json
define as chaves e valores.
Numa aplicação real, a pipeline de deploy já pode ler os arquivos de setup e recriar as propriedades dependendo do ambiente que for executada.
O Software foi construído utilizando a seguinte stack:
- Linux Mint 19 - Porque o MacBook está bem caro :-(
- IntelliJ IDEA - A IDE que amo e que me fez evoluir muito como profissional
- Java 11 - THE PROGRAMMING LANGUAGE
- Spring Boot 2.1.12 - O framework que utilizo diariamente
- MongoDB - NoSQL Database
- Consul - Gestão das Propriedades da aplicação
- Vault - Gestão das Propriedades Sensíveis da Aplicação
- Lombok - Framework para reduzir código boilerplate
- SpringFox - Geração de Documentação da API com Swagger
- Maven - Gestão de Dependências e Automação de Tarefas no Projeto
- JUnit - Bibilioteca para Testes
- AssertJ - assertThat() como um PROFISSIONAL
- Mockito - Essencial para mockar dependências e comportamentos
- Fixture Factory - Biblioteca escrita por Brasileiros para geração de Fixtures de Teste
- Jacoco - Biblioteca para análise de cobertura de código
A arquitetura foi separada em alguns pacotes principais:
- Config: Classes de Configuração
- Controller
- Request: Objetos de Entrada da API
- Response: Objetos de Saída da API
- Transformer: Classes de Transformação de Modelos
- Model: Entidades e Domínios
- Service: Interface e Implementação das Regras de Negócio
- Repository: Interface de Acesso ao MongoDB
- Exceptions:
RuntimeExcpetion
de Negócio
Primeiramente, você precisa gerar o pacote jar
com o mvn
:
$ mvn clean package
Então você está pronto para executar o comando:
$ docker-compose up --build -d
Em poucos segundos a aplicação estará funcional na porta 8080, então você pode navegar para Swagger UI
Swagger Documentation pode ser encontrada AQUI e pode ser importada no Postman, por examplo.
Quando quiser parar a aplicação e todas as suas dependências, basta executar o comando abaixo:
$ docker-compose up --build -d
Tentei me concentrar no CORE BUSINESS, testando as partes que fazem sentido testar, e algumas partes não foram testadas propositalmente.
- Para todas as classes testadas, a cobertura é de 100% de Linhas, Métodos e Branches.
- A cobertura é medida pela biblioteca Jacoco que disponibiliza um relatório HTML que pode ser encontra na pasta
target/site/jacoco/index.html
. - As validações das regras foram feitas via Bean Validation no Objeto de Request, todas as validações foram feitas nos testes da
MovieController
FixtureFactory
foi utilizado para a criação dos stubs para teste, a biblioteca é bem flexível e simples.
Exceptions
não foram testadas.MoviechallengeApplication
não foi testada.JacksonConfig
,SwaggerConfig
eWebSecurityConfig
não foram testadas- O pacote
model
não foi testado DTOs
dentro derequest
eresponse
não foram testados