API utilizada para entrega de fase 6 Containerization Strategy do MBA da FIAP de Arquitetura de Soluções.
O mercado de startups brasileiras vem crescendo cada vez mais, e em 2019 já tivemos novos unicórnios (termo utilizado para startups que chegaram no valor de mercado de 1 bilhão de dólares), algumas delas são:
- 99: Aplicativo de transporte disruptivo, sendo uma das principais concorrentes da Uber no Brasil.
- iFood: Abrange grande parte do mercado de delivery de comida por aplicativo, tornando o modo de pedir comida mais simplificado.
- Nubank: Fintech pioneira no segmento financeiro, inovou com seu cartão de crédito sem anuidade e serviços com a NuConta.
- PagSeguro: Nascida do grupo UOL, a Fintech é referência de inovação e qualidade no acirrado mercado de meios de pagamentos presenciais com suas maquininhas.
Imagine agora que você é o Arquiteto de Soluções um desses 4 unicórnios de sucesso, e a sua missão é:
Implementar um Microsserviço em Docker de uma aplicação presente no diagrama arquitetural proposto. O código do Microsserviço deve ser hospedado em um GitHub público e conter as camadas Domain, Repository, Service e Controller.
O projeto utiliza o fluxo de versionamento GitHub flow.
Instruções
O Java 11 pode tanto ser instalado através da JDK contida no site da Oracle ou no site do OpenJDK
Como alternativa é possível utilizar o SDKMan e instalar o Java através do comando:
foo@bar:~$ sdk install java <version>Para listagem de todas as versões do Java disponíveis, execute o comando:
foo@bar:~$ sdk list javaInstruções
O projeto foi concebido para que a instalação do Gradle fosse opcional, para tanto, é possível rodar as configurações do projeto após instalação do Java pelos arquivos gradle.bat em sistemas Windows e gradlew em sistemas Unix, que interagem com o arquivo gradle-wrapper.jar contido na pasta gradle/wrapper na raiz do projeto.
Caso mesmo assim se deseje rodar o projeto pelo Gradle na máquina, o mesmo pode ser instalado através do site.
Como alternativa é possível utilizar o SDKMan e instalar o Maven através do comando:
foo@bar:~$ sdk install gradlePara listagem de todas as versões do Gradle disponíveis, execute o comando:
foo@bar:~$ sdk list gradle.
├── build
│ ├── generated
│ │ ├── openapi-code-server
│ │ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── org
│ │ │ └── openapi
│ │ │ └── pedido
│ │ │ └── server
│ │ │ ├── api
│ │ │ │ ├── ApiUtil.java
│ │ │ │ └── V1Api.java
│ │ │ └── model
│ │ │ ├── Erro.java
│ │ │ ├── Item.java
│ │ │ ├── ItemPedidoRequest.java
│ │ │ ├── ParametroInvalido.java
│ │ │ ├── PedidoId.java
│ │ │ ├── Pedido.java
│ │ │ └── PedidoPostRequest.java
│ │ └── source
│ │ └── kapt
│ │ └── main
│ │ └── br
│ │ └── com
│ │ └── fiap
│ │ └── mba
│ │ └── mspedido
│ │ ├── converters
│ │ ├── dtos
│ │ └── models
│ ├── libs
│ │ └── ms-fiap-pedido-0.0.1-SNAPSHOT.jar
│ └── reports
│ └── detekt
├── build.gradle
├── config
│ ├── detekt
│ └── sonarqube
│ └── sonarqube-h2.yml
├── docker-compose.yml
├── Dockerfile
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── plugins
│ ├── configs
│ │ └── detekt
│ │ └── config.yml
│ ├── docs.gradle
│ ├── ides.gradle
│ ├── jacoco.gradle
│ ├── kotlin.gradle
│ ├── lint.gradle
│ ├── mapstruct.gradle
│ ├── openapi.gradle
│ ├── security.gradle
│ └── sonarqube.gradle
├── README.md
├── settings.gradle
└── src
├── main
│ ├── kotlin
│ │ └── br
│ │ └── com
│ │ └── fiap
│ │ └── mba
│ │ └── mspedido
│ │ ├── configs
│ │ ├── converters
│ │ ├── dtos
│ │ ├── exceptions
│ │ ├── factories
│ │ ├── models
│ │ ├── repositories
│ │ ├── resources
│ │ │ └── impl
│ │ ├── services
│ │ │ └── impl
│ │ └── MsPedidoApplication.kt
│ └── resources
│ ├── application-dev.yaml
│ ├── application.yaml
│ ├── i18n
│ │ └── messages_pt.properties
│ └── openapi
│ └── pedido-api.yaml
└── test
└── kotlin
└── br
└── com
└── fiap
└── mba
└── mspedidofoo@bar:~$ git clone https://github.com/arthurfnsc/ms-fiap-pedido.git
foo@bar:~$ cd ms-fiap-pedidoO projeto pode ser executado em ambiente Linux ou Windows, sendo os comandos diferenciando por duas opções Linux e Windows respectivamente
foo@bar:ms-fiap-pedido [./gradlew | gradlew.bat] clean build Isso gerará um arquivo JAR que usaremos com o Dockerfile e docker-compose
Em seguida é preciso rodar o docker-compose
foo@bar:ms-fiap-pedido docker-compose up --buildA aplicação estará rodando na porta 8080 em http://localhost:8080/mspedido/swagger-ui/
Foram criadas 2 rotas, a fim de exercitar os conceitos:
Exemplo de payload:
{
"cpf": "00000000000",
"horario_entrega": "2020-09-20T23:44:03.089Z",
"id_cupom": "123",
"id_endereco": "456",
"id_forma_pagamento": "789",
"id_restaurante": "987",
"itens": [
{
"id_item": "123",
"observacao": "minha observacao a",
"quantidade": 2
},
{
"id_item": "456",
"observacao": "minha observacao b",
"quantidade": 4
}
]
}Exemplo de request
curl -X POST "http://localhost:8080/mspedido/v1/pedidos" \
-H "accept: application/json" -H "Content-Type: application/json" \
-d "{\"cpf\":\"00000000000\",\"horario_entrega\":\"2020-09-20T23:44:03.089Z\",\"id_cupom\":\"123\",\"id_endereco\":\"456\",\"id_forma_pagamento\":\"789\",\"id_restaurante\":\"987\",\"itens\":[{\"id_item\":\"123\",\"observacao\":\"minha observacao a\",\"quantidade\":2},{\"id_item\":\"456\",\"observacao\":\"minha observacao b\",\"quantidade\":4}]}"
Exemplo de request
curl -X GET "http://localhost:8080/mspedido/v1/pedidos/5f67e9918b7efc2640093105" \
-H "accept: application/json"
foo@bar:ms-fiap-pedido [./gradlew | gradlew.bat] dependencyUpdatesfoo@bar:ms-fiap-pedido [./gradlew | gradlew.bat] dokkafoo@bar:ms-fiap-pedido [./gradlew | gradlew.bat] projectReportfoo@bar:ms-fiap-pedido [./gradlew | gradlew.bat] auditfoo@bar:ms-fiap-pedido [./gradlew | gradlew.bat] dependencyCheckAggregatefoo@bar:ms-fiap-pedido [./gradlew | gradlew.bat] testA task de test está associada à task jacocoTestReport (para mais informações plugins/jacoco.gradle)
Os Testes de Mutantes são bem úteis para se descobrir comportamentos inesperados no nosso código que não estão cobertos.
Para executá-los no projeto utilize a task:
foo@bar:ms-fiap-pedido [./gradlew | gradlew.bat] pitestO SonarQube é uma ferramenta de análise estática de código. Nesse projeto colocamos um arquivo com o docker-compose na pasta config/sonarqube/sonarqube-h2.yml caso se deseje executar a análise em ambiente local. Para tanto, execute os seguintes comandos:
foo@bar:ms-fiap-pedido docker-compose -f config/sonarqube/sonarqube-h2.yml upO SonarQube estará disponível na porta 9000. Para o usuário defaut o login é admin e a senha é admin.
Com o SonarQube em execução rode o comando:
foo@bar:ms-fiap-pedido [./gradlew | gradlew.bat] sonarqubeÉ comum ao importar o projeto em uma IDE que classes contidas nos pacotes org.openapi.pedido.server apresentem erros de compilação.
Isso ocorre porque ao utilizar a estratégia de API First é necessário a geração das classes para que o projeto possa compilar.
A geração das classes se encontra atrelada ao goal compileKotlin no
ciclo de vida do Gradle, e pode ser melhor detalhado em
"plugins/openapi.gradle na raiz do projeto.
compileKotlin.dependsOn(
generateApiServer
)
sourceSets.main.java.srcDir "$apiServerOutput/src/main/java"Uma das formas de resolver o problema é a execução da task compileKotlin
foo@bar:ms-fiap-pedido [./gradlew | gradlew.bat] compileKotlinOu a execução de outras tasks que tenham relação direta com o compileKotlin, como build ou bootRun.
As classes geradas se encontrarão no diretório org.openapi.pedido.server dentro do projeto application/rest-api
.
└── build
└── generated
└── openapi-code-server
└── src
└── main
└── java
└── org
└── openapi
└── pedido
└── server
├── api
└── modelMesmo após a geração de classes, é comum algumas IDEs ainda não sincronizarem
as novas classes no projeto aberto, para tanto, lembre-se de sincronizar o
projeto para que as novas classes entrem no classpath do projeto, e com isso,
possam ser importadas por outras classes.