Repositório de resposta ao desafio bip-teste-integrado.
Criar uma solução completa em camadas (DB → EJB → Backend → Frontend), corrigindo o bug no BeneficioEjbService e entregando uma aplicação funcional de gerenciamento de benefícios.
| # | Tarefa | Status |
|---|---|---|
| 1 | Executar db/schema.sql e db/seed.sql |
✅ Concluído |
| 2 | Corrigir bug no BeneficioEjbService |
✅ Concluído |
| 3 | Implementar backend CRUD + integração com EJB | ✅ Concluído |
| 4 | Desenvolver frontend Angular consumindo backend | ✅ Concluído |
| 5 | Implementar testes | ✅ Concluído |
| 6 | Documentar (Swagger + README) | ✅ Concluído |
| 7 | CI com GitHub Actions | ✅ Concluído |
Problemas identificados em BeneficioEjbService e correções aplicadas:
| # | Problema original | Correção aplicada |
|---|---|---|
| 1 | Transferência não verificava saldo antes de debitar | Adicionada validação de saldo insuficiente com exceção |
| 2 | Sem locking, gerava race condition em operações concorrentes | Aplicado PESSIMISTIC_WRITE lock na consulta |
| 3 | Rollback não garantido em caso de falha | @TransactionAttribute(REQUIRED) garante rollback automático |
O BeneficioEjbService utiliza @PersistenceContext e @TransactionAttribute do Jakarta EE,
que requerem um container EJB (ex: WildFly) para injeção e gerenciamento de transações.
No contexto Spring Boot embarcado, essas anotações conflitam com o gerenciamento de transações do Spring, tornando inviável a execução direta do EJB.
Solução adotada:
- O
ejb-moduleé mantido como dependência Maven dobackend-module - A entidade
Beneficioé compartilhada entre os dois módulos - A lógica de transferência corrigida no EJB foi replicada no
BeneficioServiceusando@Transactionaldo Spring - O
EjbConfigdocumenta essa decisão arquitetural
Essa abordagem preserva a separação em camadas e a correção dos bugs, adaptando a integração ao ambiente Spring Boot sem perda de funcionalidade.
| Camada | Tecnologia |
|---|---|
| Banco de dados | PostgreSQL 15 (Docker) |
| Módulo EJB | Java 17 + Jakarta EE |
| Backend | Spring Boot 3.2.5 + Spring Data JPA |
| Documentação | Swagger / OpenAPI 3.0 |
| Frontend | Angular 20 + Angular Material |
| Testes | JUnit 5 + Mockito |
| CI | GitHub Actions |
- Java 17
- Maven 3.8+
- Node.js 18+ e npm
- Angular CLI (
npm install -g @angular/cli) - Docker
docker run --name postgres-desafio \
-e POSTGRES_DB=beneficios \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=postgres \
-p 5432:5432 -d postgres:15Linux/Mac:
docker exec -i postgres-desafio psql -U postgres -d beneficios < db/schema.sql
docker exec -i postgres-desafio psql -U postgres -d beneficios < db/seed.sqlWindows (PowerShell):
Get-Content db/schema.sql | docker exec -i postgres-desafio psql -U postgres -d beneficios
Get-Content db/seed.sql | docker exec -i postgres-desafio psql -U postgres -d beneficiosmvn -B -f ejb-module clean install
⚠️ Este passo é obrigatório antes de rodar o backend. Oejb-moduleprecisa estar instalado no repositório Maven local (.m2) para que obackend-moduleconsiga encontrá-lo como dependência.
mvn -f backend-module spring-boot:runcd frontend/beneficios-app
npm install
ng serve| Recurso | URL |
|---|---|
| Frontend | http://localhost:4200 |
| API REST | http://localhost:8080/api/v1/beneficios |
| Swagger UI | http://localhost:8080/swagger-ui.html |
# Backend
mvn -f backend-module test
# Frontend
cd frontend/beneficios-app && ng testPipeline configurado com GitHub Actions (.github/workflows/ci.yml). A cada push ou pull_request:
- Configura JDK 17 (Temurin) com cache Maven
- Build e install do
ejb-module - Build e testes do
backend-module
bip-fullstack/
├── .github/
│ └── workflows/
│ └── ci.yml
├── db/
│ ├── schema.sql
│ └── seed.sql
├── ejb-module/ # Regras de negócio (bug corrigido)
├── backend-module/ # API REST Spring Boot
├── frontend/
│ └── beneficios-app/ # UI Angular
└── docs/
└── README.md
| Método | Endpoint | Descrição |
|---|---|---|
GET |
/api/v1/beneficios |
Lista todos os benefícios |
GET |
/api/v1/beneficios/ativos |
Lista benefícios ativos |
GET |
/api/v1/beneficios/{id} |
Busca por ID |
POST |
/api/v1/beneficios |
Cria novo benefício |
PUT |
/api/v1/beneficios/{id} |
Atualiza benefício |
DELETE |
/api/v1/beneficios/{id} |
Remove benefício |
POST |
/api/v1/beneficios/transferir |
Transfere valor entre benefícios |
Documentação interativa disponível no Swagger UI após subir o backend.
| Arquivo | Alteração |
|---|---|
ejb-module/.../BeneficioEjbService.java |
Correção dos 3 bugs: validação de saldo, PESSIMISTIC_WRITE lock, rollback |
ejb-module/.../Beneficio.java |
@DecimalMin alterado para inclusive = true para permitir transferência do saldo total |
backend-module/pom.xml |
Exclusão de jakarta.ejb-api e jakarta.persistence-api para evitar conflito JTA |
backend-module/.../BeneficioService.java |
Transferência implementada diretamente com @Transactional e em.flush() |
backend-module/.../EjbConfig.java |
Bean removido, classe mantida com documentação da decisão arquitetural |
frontend/.../transferencia.component.ts |
Adicionado controle de loading para evitar múltiplos envios |
frontend/.../transferencia.component.html |
Botão desabilitado durante processamento |