https://github.com/josivantarcio/api-portfolio
Sistema de Gestao de Portifolio
https://github.com/josivantarcio/api-portfolio
java maven postgresql postman springboot swagger
Last synced: 3 months ago
JSON representation
Sistema de Gestao de Portifolio
- Host: GitHub
- URL: https://github.com/josivantarcio/api-portfolio
- Owner: josivantarcio
- Created: 2025-11-25T11:50:30.000Z (7 months ago)
- Default Branch: main
- Last Pushed: 2025-11-27T18:45:11.000Z (7 months ago)
- Last Synced: 2025-11-30T05:29:22.705Z (7 months ago)
- Topics: java, maven, postgresql, postman, springboot, swagger
- Language: Java
- Homepage: https://www.linkedin.com/in/josevanoliveira/
- Size: 1.45 MB
- Stars: 1
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Sistema de Gestão de Portfólio de Projetos





API REST para gerenciamento de portfólio de projetos desenvolvida com Spring Boot 3.5.7, incluindo controle de membros, status, orçamentos e classificação de risco automatizada.
## Índice
- [Sobre o Projeto](#sobre-o-projeto)
- [Tecnologias Utilizadas](#tecnologias-utilizadas)
- [Funcionalidades](#funcionalidades)
- [Arquitetura](#arquitetura)
- [Pré-requisitos](#pré-requisitos)
- [Instalação](#instalação)
- [Configuração](#configuração)
- [Executando a Aplicação](#executando-a-aplicação)
- [Executando os Testes](#executando-os-testes)
- [Documentação da API](#documentação-da-api)
- [Endpoints](#endpoints)
- [Regras de Negócio](#regras-de-negócio)
- [Segurança](#segurança)
- [Cobertura de Testes](#cobertura-de-testes)
- [Melhorias Futuras](#melhorias-futuras)
- [Autor](#autor)
- [Licença](#licença)
## Sobre o Projeto
Sistema backend desenvolvido para gerenciar portfólios de projetos empresariais, permitindo controle completo sobre projetos, membros de equipe, classificação de riscos e transições de status através de máquina de estados.
O projeto implementa princípios de Clean Architecture, segregando responsabilidades em camadas (Controller, Service, Repository), utilizando DTOs para comunicação externa e tratamento global de exceções.
## Tecnologias Utilizadas
- Java 21
- Spring Boot 3.5.7
- Spring Data JPA
- Spring Security (Basic Authentication)
- PostgreSQL 16
- H2 Database (ambiente de testes)
- Lombok
- Swagger/OpenAPI 3
- JaCoCo (análise de cobertura)
- JUnit 5
- Mockito
- Maven 3.8+
## Funcionalidades
### Gestão de Projetos
- CRUD completo de projetos
- Cálculo automático de classificação de risco baseado em orçamento e duração
- Máquina de estados para controle de status do projeto
- Validação de transições sequenciais de status
- Restrições de exclusão baseadas em status
- Gerenciamento de alocação de membros (1 a 10 membros por projeto)
- Paginação de resultados
- Geração de relatório consolidado do portfólio
### Gestão de Membros
- CRUD completo de membros da equipe
- Tipos de atribuição: FUNCIONARIO, TERCERIZADO, ACIONISTA
- Validação de limite de 3 projetos ativos simultâneos por membro
- Integração com API externa para busca de membros
### Recursos Adicionais
- Autenticação via Basic Auth
- Documentação interativa com Swagger UI
- Tratamento global de exceções
- Validação de entrada com Bean Validation
## Arquitetura
O projeto segue uma arquitetura em camadas baseada nos princípios de Clean Architecture:
### Estrutura de Pacotes
**Camada de Apresentação (Controller)**
- `controller/` - Endpoints REST da API
- `controller/mock/` - Mock para integração externa
**Camada de Aplicação**
- `dto/request/` - DTOs de entrada (requisições)
- `dto/response/` - DTOs de saída (respostas)
- `mapper/` - Conversores entre Entity e DTO
**Camada de Domínio (Model)**
- `model/entity/` - Entidades JPA (Projeto, Membro)
- `model/entity/enums/` - Enumerações do domínio
**Camada de Negócio (Service)**
- `service/` - Lógica de negócio e validações
**Camada de Persistência (Repository)**
- `repository/` - Interfaces JPA Repository
**Infraestrutura**
- `config/` - Configurações (Security, OpenAPI)
- `exception/` - Exceções customizadas e handlers globais
### Fluxo de Requisição
Cliente → Controller → Service → Repository → Database
↓ ↓
DTO Entity
### Responsabilidades por Camada
| Camada | Responsabilidade |
|--------|------------------|
| **Controller** | Recebe requisições HTTP, valida entrada, retorna respostas |
| **DTO** | Transferência de dados entre cliente e API |
| **Mapper** | Conversão bidirecional entre DTO e Entity |
| **Service** | Regras de negócio, validações, orquestração |
| **Repository** | Acesso e persistência de dados |
| **Entity** | Representação do modelo de domínio |
## Pré-requisitos
- Java Development Kit (JDK) 21 ou superior
- PostgreSQL 16 ou superior
- Maven 3.8 ou superior
- Git
## Instalação
### 1. Clone o repositório
git clone https://github.com/josivantarcio/api-portfolio.git
cd api-portfolio
### 2. Configure o banco de dados
Crie o banco de dados no PostgreSQL:
CREATE DATABASE db_portfolio;
## Configuração
Edite o arquivo `src/main/resources/application.yml`:
spring:
datasource:
url: jdbc:postgresql://localhost:5432/db_portfolio
username: seu_usuario
password: sua_senha
jpa:
hibernate:
ddl-auto: update
show-sql: true
## Executando a Aplicação
### Utilizando Maven Wrapper
./mvnw spring-boot:run
### Gerando e executando o JAR
./mvnw clean package
java -jar target/portfolioApi-0.0.1-SNAPSHOT.jar
A aplicação estará disponível em `http://localhost:8080`
## Executando os Testes
### Executar suite completa de testes
./mvnw test
### Gerar relatório de cobertura JaCoCo
./mvnw jacoco:report
O relatório será gerado em `target/site/jacoco/index.html`
## Documentação da API
A documentação interativa da API está disponível através do Swagger UI:
- **Swagger UI:** http://localhost:8080/swagger-ui.html
- **OpenAPI JSON:** http://localhost:8080/v3/api-docs
Utilize as credenciais de autenticação para testar os endpoints:
- Username: `admin`
- Password: `admin123`
## Endpoints
### Projetos
| Método HTTP | Endpoint | Descrição |
|-------------|----------|-----------|
| GET | `/api/projetos` | Lista todos os projetos (paginado) |
| GET | `/api/projetos/all` | Lista todos os projetos sem paginação |
| GET | `/api/projetos/{id}` | Busca projeto por ID |
| POST | `/api/projetos` | Cria novo projeto |
| PUT | `/api/projetos/{id}` | Atualiza projeto existente |
| DELETE | `/api/projetos/{id}` | Remove projeto (com validação de status) |
| PATCH | `/api/projetos/{id}/status` | Altera status do projeto |
| PATCH | `/api/projetos/{id}/avancar-status` | Avança para próximo status |
| POST | `/api/projetos/{id}/membros/{membroId}` | Adiciona membro ao projeto |
| DELETE | `/api/projetos/{id}/membros/{membroId}` | Remove membro do projeto |
| GET | `/api/projetos/relatorio` | Gera relatório consolidado do portfólio |
### Membros
| Método HTTP | Endpoint | Descrição |
|-------------|----------|-----------|
| GET | `/api/membros` | Lista todos os membros |
| GET | `/api/membros/{id}` | Busca membro por ID |
| POST | `/api/membros` | Cria novo membro |
| PUT | `/api/membros/{id}` | Atualiza membro existente |
| DELETE | `/api/membros/{id}` | Remove membro |
| GET | `/api/membros/mock` | Busca membros da API externa (mock) |
## Regras de Negócio
### Classificação Automática de Risco
A classificação de risco é calculada automaticamente com base no orçamento total e duração do projeto:
| Classificação | Critério |
|---------------|----------|
| BAIXO_RISCO | Orçamento ≤ R$ 100.000,00 E duração ≤ 3 meses |
| ALTO_RISCO | Orçamento > R$ 500.000,00 OU duração > 6 meses |
| MEDIO_RISCO | Casos intermediários |
### Máquina de Estados
Os projetos seguem transições sequenciais obrigatórias:
EM_ANALISE → ANALISE_REALIZADA → ANALISE_APROVADA →
INICIADO → PLANEJADO → EM_ANDAMENTO → ENCERRADO
└→ CANCELADO
### Restrições de Exclusão
Projetos nos seguintes status não podem ser excluídos:
- INICIADO
- EM_ANDAMENTO
- ENCERRADO
### Alocação de Membros
- Mínimo de 1 membro por projeto
- Máximo de 10 membros por projeto
- Cada membro pode estar alocado em no máximo 3 projetos ativos simultaneamente
- O gerente responsável deve estar entre os membros do projeto
## Segurança
A API utiliza Spring Security com autenticação Basic Auth. Todas as requisições devem incluir credenciais:
**Credenciais padrão:**
- Username: `admin`
- Password: `admin123`
**Exemplo de requisição com autenticação:**
curl -X GET http://localhost:8080/api/projetos
-u admin:admin123
-H "Content-Type: application/json"
## Cobertura de Testes
A aplicação possui 35 testes automatizados:
- Testes de unidade (Services): 21 testes
- Testes de integração (Controllers): 13 testes
- Teste de inicialização (Application): 1 teste
**Cobertura atual:** 42% de cobertura de código
**Distribuição por pacote:**
- controller: 83%
- service: 39%
- model.entity.enums: 68%
- config: 100%
## Melhorias Futuras
- Implementar autenticação JWT
- Adicionar cache com Redis
- Implementar auditoria de alterações
- Criar endpoints de relatórios avançados
- Adicionar testes de carga
- Implementar rate limiting
- Dockerizar a aplicação
- Configurar CI/CD pipeline
- Aumentar cobertura de testes para 70%+
## Autor
**Josevan Oliveira**
- GitHub: [@josivantarcio](https://github.com/josivantarcio)
- LinkedIn: [josevanoliveira](https://www.linkedin.com/in/josevanoliveira/)
## Licença
Este projeto foi desenvolvido como parte de um desafio técnico para avaliação de competências em desenvolvimento backend com Spring Boot.