Skip to content

efernandalima/bip-fullstack

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🏗️ Solução — Desafio Fullstack Integrado

Repositório de resposta ao desafio bip-teste-integrado.

CI Java Spring Boot Angular PostgreSQL


🎯 Objetivo

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.


✅ Tarefas entregues

# 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

🐛 Bug corrigido — EJB

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

🏛️ Decisão arquitetural — Integração EJB + Spring Boot

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 do backend-module
  • A entidade Beneficio é compartilhada entre os dois módulos
  • A lógica de transferência corrigida no EJB foi replicada no BeneficioService usando @Transactional do Spring
  • O EjbConfig documenta 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.


🚀 Tecnologias utilizadas

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

⚙️ Pré-requisitos


🏃 Como rodar

1. Subir o banco de dados

docker run --name postgres-desafio \
  -e POSTGRES_DB=beneficios \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=postgres \
  -p 5432:5432 -d postgres:15

Linux/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.sql

Windows (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 beneficios

2. Instalar o módulo EJB

mvn -B -f ejb-module clean install

⚠️ Este passo é obrigatório antes de rodar o backend. O ejb-module precisa estar instalado no repositório Maven local (.m2) para que o backend-module consiga encontrá-lo como dependência.

3. Rodar o backend

mvn -f backend-module spring-boot:run

4. Rodar o frontend

cd frontend/beneficios-app
npm install
ng serve

5. Acessar

Recurso URL
Frontend http://localhost:4200
API REST http://localhost:8080/api/v1/beneficios
Swagger UI http://localhost:8080/swagger-ui.html

🧪 Testes

# Backend
mvn -f backend-module test

# Frontend
cd frontend/beneficios-app && ng test

🔄 CI/CD

Pipeline configurado com GitHub Actions (.github/workflows/ci.yml). A cada push ou pull_request:

  1. Configura JDK 17 (Temurin) com cache Maven
  2. Build e install do ejb-module
  3. Build e testes do backend-module

📁 Estrutura do projeto

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

📡 Endpoints da API

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.


📝 Alterações realizadas em relação ao template original

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

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors