Store Sales Clean API é uma aplicação Spring Boot desenvolvida para gerenciar vendas de uma loja. A API permite o gerenciamento de produtos e categorias, seguindo os princípios de Clean Architecture e SOLID.
Este projeto implementa os princípios da Arquitetura Limpa (Clean Architecture) proposta por Robert C. Martin. A estrutura do projeto é organizada em camadas concêntricas:
O centro da aplicação contém:
- Domain: Entidades de negócio (Product, Category) que representam os conceitos fundamentais do domínio.
- Use Cases: Implementação das regras de negócio específicas da aplicação.
- Gateways (Ports): Interfaces que definem como o núcleo se comunica com sistemas externos.
Camada externa que contém:
- Presentation: Controllers REST que expõem a API.
- Persistence: Implementação do acesso a dados usando Spring Data JPA.
- Gateway Implementations (Adapters): Implementações concretas das interfaces de gateway.
- Configuration: Configurações do Spring e da aplicação.
- Testabilidade: As regras de negócio podem ser testadas independentemente da infraestrutura.
- Independência de Frameworks: O núcleo da aplicação não depende de frameworks externos.
- Independência de UI: A interface do usuário pode ser alterada sem afetar a lógica de negócio.
- Independência de Banco de Dados: O banco de dados pode ser substituído sem afetar o núcleo da aplicação.
Este projeto aplica os princípios SOLID:
Cada classe tem uma única responsabilidade. Por exemplo:
ProductController: Responsável apenas por lidar com requisições HTTP.CreateProductCaseImpl: Responsável apenas pela lógica de criação de produtos.ProductRepositoryGateway: Responsável apenas pelo acesso aos dados de produtos.
As classes são abertas para extensão, mas fechadas para modificação. Por exemplo:
- Novas funcionalidades podem ser adicionadas criando novas implementações de interfaces existentes.
As implementações de interfaces podem ser substituídas sem afetar o comportamento do programa. Por exemplo:
- Qualquer implementação de
ProductGatewaypode ser usada sem afetar o comportamento dos casos de uso.
Interfaces específicas são melhores que uma interface geral. Por exemplo:
CreateProductCaseeFindProductsCasesão interfaces separadas em vez de uma única interfaceProductCase.
Módulos de alto nível não dependem de módulos de baixo nível. Ambos dependem de abstrações. Por exemplo:
- Os casos de uso dependem de interfaces
Gateway, não de implementações concretas. - A injeção de dependências é usada para fornecer implementações concretas.
src/
├── main/
│ ├── java/
│ │ └── dev/
│ │ └── phquartin/
│ │ └── storesalescleanapi/
│ │ ├── core/
│ │ │ ├── domain/ # Entidades de domínio
│ │ │ ├── enums/ # Enumerações
│ │ │ ├── gateway/ # Interfaces de gateway (ports)
│ │ │ └── usecases/ # Casos de uso
│ │ │ ├── category/ # Casos de uso para categorias
│ │ │ └── product/ # Casos de uso para produtos
│ │ └── infra/
│ │ ├── configuration/ # Configurações
│ │ ├── exception/ # Tratamento de exceções
│ │ ├── gateway/ # Implementações de gateway
│ │ ├── mapper/ # Mapeadores
│ │ ├── persistence/ # Entidades e repositórios JPA
│ │ └── presentation/ # Controllers, requests e responses
│ └── resources/
│ ├── application.properties # Configurações da aplicação
│ └── db/
│ └── migration/ # Migrações Flyway
└── test/ # Testes
- Java 17+
- Docker e Docker Compose
- Maven
-
Clone o repositório:
git clone https://github.com/phquartin/StoreSalesCleanApi.git cd StoreSalesCleanApi -
Configure a variável de ambiente para a senha do MySQL:
export MYSQL_ROOT_PASSWORD=sua_senha -
Inicie o banco de dados MySQL:
docker-compose up -d -
Execute a aplicação:
./mvnw spring-boot:run -
A API estará disponível em:
http://localhost:8080
GET /products- Listar todos os produtosPOST /products- Criar um novo produto
GET /categories- Listar todas as categoriasPOST /categories- Criar uma nova categoria
- Spring Boot
- Spring Data JPA
- MySQL
- Flyway Migration
- Docker
- Maven
- Entidade de Vendas
- Outros metodos Http como DELETE
- DockerFile