API backend em Spring Boot para gerenciamento de pacotes em um fluxo de supply chain. O projeto persiste os dados em PostgreSQL, publica eventos no RabbitMQ quando o status de um pacote muda e expõe endpoints REST para criação e atualização de status.
Importante: este backend deve ser utilizado em conjunto com o front-end do projeto, disponível em
../webneste mesmo monorepo.
Esta aplicação foi feita para registrar pacotes, acompanhar a evolução do status de entrega e disparar uma mensagem assíncrona quando houver mudança de status. O listener de RabbitMQ simula a notificação ao cliente após a atualização.
- Java 17
- Spring Boot 3
- Spring Web
- Spring Data JPA
- Spring Validation
- Spring AMQP / RabbitMQ
- PostgreSQL
- Lombok
src/main/java/com/supplychain/supply_chain_api/
├── config/ # Configuração do RabbitMQ
├── controller/ # Endpoints REST
├── domain/
│ ├── entity/ # Entidade Pacote
│ ├── enums/ # Status de entrega
│ └── repository/ # Repositório JPA
├── dto/ # Objetos de entrada e evento
├── event/ # Listener de mensagens
└── service/ # Regra de negócio
- Criar pacote com código de rastreio e destinatário
- Atualizar status do pacote
- Persistir os dados no banco PostgreSQL
- Publicar evento no RabbitMQ ao alterar o status
- Consumir o evento em um listener que simula notificação por e-mail
Entidade principal da aplicação. Contém:
idcodigoRastreiodestinatariostatusdataCriacaoultimaAtualizacao
O enum EntregaStatus possui os valores:
PREPARACAOEM_TRANSITOSAIU_PARA_ENTREGAENTREGUEDEVOLVIDO
O front-end que consome esta API está neste repositório:
Os dois projetos foram pensados para rodar em conjunto:
- o front-end faz a interface com o usuário
- a API expõe os endpoints e cuida da persistência e mensageria
- Java 17
- Docker e Docker Compose
- Maven Wrapper incluído no projeto (
./mvnw)
O projeto usa PostgreSQL e RabbitMQ definidos no arquivo docker-compose.yml.
docker compose up -dSe o seu ambiente usar a sintaxe antiga, também funciona com:
docker-compose up -dSe no Linux aparecer bash: ./mvnw: Permissão negada, rode primeiro:
chmod +x mvnwSe ainda assim preferir, você também pode executar com:
bash ./mvnw spring-boot:run./mvnw spring-boot:runA aplicação deve iniciar na porta 8080.
As configurações locais estão em src/main/resources/application.properties:
- PostgreSQL em
localhost:5432 - banco
logistics_db - usuário
user - senha
password - RabbitMQ em
localhost:5672
O docker-compose.yml já sobe:
postgres:15-alpinerabbitmq:3.12-management
Quando o status de um pacote é alterado:
- a API atualiza o registro no banco
- publica um evento na exchange
supply-chain.exchange - roteia a mensagem com a chave
pacote.atualizado - o listener
OuvintePacoteconsome a filapacote.mudanca.status - a aplicação simula o envio de e-mail ao cliente
- POST
/api/pacotes
Exemplo de payload:
{
"destinatario": "João Silva",
"codigoRastreio": "PKG001"
}Resposta: 201 Created
- PATCH
/api/pacotes/{codigoRastreio}/status
Exemplo de payload:
{
"novoStatus": "EM_TRANSITO"
}Resposta: 204 No Content
curl -X POST http://localhost:8080/api/pacotes \
-H "Content-Type: application/json" \
-d '{
"destinatario": "João Silva",
"codigoRastreio": "PKG001"
}'curl -X PATCH http://localhost:8080/api/pacotes/PKG001/status \
-H "Content-Type: application/json" \
-d '{
"novoStatus": "EM_TRANSITO"
}'O projeto inclui a classe base de testes gerada pelo Spring Boot. Para executar os testes:
Se ocorrer o mesmo problema de permissão no Linux, use chmod +x mvnw uma vez ou execute:
bash ./mvnw test./mvnw test- Se PostgreSQL ou RabbitMQ não estiverem ativos, a API não sobe corretamente.
- Se você quiser usar a interface visual do RabbitMQ, acesse
http://localhost:15672. - O front-end deve ser executado junto com esta API para a experiência completa.