Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/mtbassi/exerc4-itau-unibanco
Exercício 4: Princípios SOLID - Refatoração para aderir aos princípios SOLID com explicações no código.
https://github.com/mtbassi/exerc4-itau-unibanco
allure-report ci crud docker-compose dockerfile flyway github-actions h2 java junit maven mockito mysql rabbitmq solid spring-boot swagger
Last synced: about 13 hours ago
JSON representation
Exercício 4: Princípios SOLID - Refatoração para aderir aos princípios SOLID com explicações no código.
- Host: GitHub
- URL: https://github.com/mtbassi/exerc4-itau-unibanco
- Owner: mtbassi
- Created: 2025-01-12T21:10:53.000Z (3 days ago)
- Default Branch: main
- Last Pushed: 2025-01-12T21:30:11.000Z (3 days ago)
- Last Synced: 2025-01-12T22:25:34.320Z (3 days ago)
- Topics: allure-report, ci, crud, docker-compose, dockerfile, flyway, github-actions, h2, java, junit, maven, mockito, mysql, rabbitmq, solid, spring-boot, swagger
- Language: Java
- Homepage:
- Size: 1.07 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Microsserviço Spring Boot - Gestão de Produtos
Este repositório contém a implementação de um microsserviço desenvolvido em **Spring Boot** para gerenciar uma lista de produtos. Ele foi projetado com foco em **operações CRUD**, integração com **RabbitMQ**, e aderência aos **princípios SOLID**. Além disso, o projeto inclui testes automatizados, integração contínua, e suporte para execução com Docker.
## Funcionalidades
1. **CRUD de Produtos**: API RESTful para gerenciar produtos.
2. **Testes Automatizados**: Testes unitários com JUnit e Mockito.
3. **Mensageria**: Publicação de mensagens em RabbitMQ para novos produtos.
4. **Integração com MySQL:**: Banco de dados com migrações Flyway..
5. **Escalabilidade**: Configuração para rodar na AWS (ECS ou Lambda).
6. **Adesão a SOLID**: Código refatorado para boas práticas de design.---
## Exercícios Implementados
### Exercício 1: CRUD de Produtos
- API RESTful com operações de criação, leitura, atualização e exclusão de produtos.
### Exercício 2: Testes e CI/CD
- Testes unitários utilizando **JUnit** e **Mockito**.
- Pipeline de integração contínua configurado com **GitHub Actions**.### Exercício 3: Mensageria e AWS
- Publicação de mensagens em **RabbitMQ** ao criar produtos.
- Consumidor para ler mensagens da fila e registrar logs.
- Configuração para execução em **AWS ECS** ou **AWS Lambda**.### Exercício 4: Princípios SOLID
- Refatoração para aderir aos princípios SOLID com explicações no código.
### Exercício 5: Banco de Dados e Filtros
- Integração com banco de dados **MySQL** utilizando **Flyway**.
- ndpoint para buscar produtos com filtros (nome, categoria, preço).---
## Requisitos
- **Java 17+**
- **Spring Boot 3+**
- **Docker** e **Docker Compose**
- **MySQL**
- **RabbitMQ**
- Conta na AWS (opcional para deploy em ECS ou Lambda)---
## Como Rodar o Projeto Localmente com Docker
### Pré-requisitos
- Instale o [Docker](https://www.docker.com/) e o [Docker Compose](https://docs.docker.com/compose/).### Passos
1. Clone o repositório:
```bash
git clone https://github.com/mtbassi/exerc4-itau-unibanco.git
cd exerc4-itau-unibanco
```2. Compile o projeto:
```bash
./mvnw clean package
```3. Suba os serviços com Docker Compose:
```bash
docker-compose up --build
```4. Acesse a aplicação:
- **API local**: [`http://localhost:8080`](http://localhost:8080)
- **RabbitMQ (Admin)**: [`http://localhost:15672`](http://localhost:15672) (usuário: `user`, senha: `password`)---
## Endpoints da API
### 1. **Listar todos os produtos**
- **URL**: `/v1/produto`
- **Método**: `GET`
- **Descrição**: Retorna uma lista completa de todos os produtos cadastrados.
- **Resposta**:
- **200 OK**: Lista de produtos.
- **400 Bad Request**: Parâmetros inválidos.
- **500 Internal Server Error**: Erro no servidor.
- **Exemplo de resposta**:
```json
[
{
"id": 1,
"nome": "Produto A",
"preco": 100.0,
"categoria": "Categoria A"
}
]
```### 2. **Consultar produto por ID**
- **URL**: `/v1/produto/{id}`
- **Método**: `GET`
- **Descrição**: Retorna os detalhes de um produto específico com base no ID.
- **Resposta**:
- **200 OK**: Produto encontrado.
- **400 Bad Request**: Parâmetros inválidos.
- **422 Unprocessable Entity**: Produto não encontrado para o ID fornecido.
- **500 Internal Server Error**: Erro no servidor.
- **Exemplo de resposta**:
```json
{
"id": 1,
"nome": "Produto A",
"preco": 100.0,
"categoria": "Categoria A"
}
```
### 3. **Consultar produto por nome, preço e categoria**
- **URL**: `/v1/produto/busca`
- **Método**: `GET`
- **Descrição**: Retorna os detalhes de uma lista de produtos com base no nome, preço e categoria fornecidos. Os parâmetros são opcionais, permitindo consultas mais flexíveis.
- **Parâmetros**:
- `nome` (opcional): Nome do produto para filtro.
- `preco` (opcional): Preço do produto para filtro.
- `categoria` (opcional): Categoria do produto para filtro.
- **Resposta**:
- **200 OK**: Lista de produtos que atendem aos critérios fornecidos.
- **400 Bad Request**: Parâmetros inválidos.
- **422 Unprocessable Entity**: Nenhum produto encontrado para os critérios fornecidos.
- **500 Internal Server Error**: Erro no servidor.
- **Exemplo de resposta**:
```json
[
{
"id": 1,
"nome": "Produto A",
"descricao": "Descrição do produto A",
"preco": 100.0,
"categoria": "Categoria A"
},
{
"id": 2,
"nome": "Produto B",
"descricao": "Descrição do produto B",
"preco": 150.0,
"categoria": "Categoria B"
}
]
```### 4. **Cadastrar novo produto**
- **URL**: `/v1/produto`
- **Método**: `POST`
- **Descrição**: Realiza o cadastro de um novo produto utilizando os dados fornecidos no corpo da requisição.
- **Payload (Exemplo)**:
```json
{
"nome": "Produto B",
"preco": 150.0,
"categoria": "Categoria B"
}
```
- **Resposta**:
- **201 Created**: Produto cadastrado com sucesso.
- **400 Bad Request**: Parâmetros inválidos.
- **422 Unprocessable Entity**: Dados inválidos ou ausentes no cadastro.
- **500 Internal Server Error**: Erro no servidor.### 5. **Atualizar produto existente**
- **URL**: `/v1/produto/{id}`
- **Método**: `PUT`
- **Descrição**: Atualiza as informações de um produto com base no ID fornecido.
- **Payload (Exemplo)**:
```json
{
"nome": "Produto A Atualizado",
"preco": 120.0,
"categoria": "Categoria A"
}
```
- **Resposta**:
- **200 OK**: Produto atualizado com sucesso.
- **400 Bad Request**: Parâmetros inválidos.
- **422 Unprocessable Entity**: Produto não encontrado para o ID fornecido.
- **500 Internal Server Error**: Erro no servidor.### 6. **Deletar produto por ID**
- **URL**: `/v1/produto/{id}`
- **Método**: `DELETE`
- **Descrição**: Remove um produto do sistema utilizando o ID fornecido na requisição.
- **Resposta**:
- **204 No Content**: Produto deletado com sucesso.
- **400 Bad Request**: Parâmetros inválidos.
- **422 Unprocessable Entity**: Produto não encontrado para o ID fornecido.
- **500 Internal Server Error**: Erro no servidor.---
## Pipeline de CI/CD
- O projeto possui um pipeline configurado para:
- Executar testes automatizados a cada push.
- Gerar relatórios de cobertura de testes.### Configuração do Pipeline
O arquivo do pipeline está disponível em `.github/workflows/ci.yml`.## Relatório de Testes
Após a execução da pipeline, um relatório de testes gerado com Allure é publicado automaticamente no GitHub Pages. Você pode acessá-lo em:
- [`https://mtbassi.github.io/exerc4-itau-unibanco/`](https://mtbassi.github.io/exerc4-itau-unibanco/)
---
## Documentação da API
Acesse a documentação completa da API gerada com **Swagger**:
- [`http://localhost:8080/swagger-ui.html`](http://localhost:8080/swagger-ui.html)---
## Contribuição
Sinta-se à vontade para abrir issues e enviar pull requests com melhorias ou correções.---
## Licença
Este projeto é licenciado sob a [MIT License](LICENSE).