Plataforma colaborativa para gerenciamento de atividades e grupos com autenticação segura via JWT, notificações em tempo real, controle granular de permissões e perfis de usuários especializados.
O Spring-Uniflow é uma solução enterprise para gerenciamento colaborativo de atividades educacionais, integrando funcionalidades avançadas de segurança, autorização granular e comunicação em tempo real. Ideal para instituições que necessitam de uma plataforma robusta para coordenar grupos, atividades e pagamentos.
- 🔐 Autenticação JWT - Segurança de ponta com tokens JWT e refresh token
- 👥 Perfis Especializados - Estudantes, Professores e Administradores com permissões distintas
- 🔔 Notificações em Tempo Real - Sistema de notificações para grupos e broadcast
- 📊 Controle de Permissões Granular - Autorização baseada em authorities específicas
- 💳 Gestão de Pagamentos - Integração com sistema de assinaturas e pagamentos
- 📚 Gerenciamento de Atividades - Criação, entrega e avaliação de atividades
- 🏫 Estrutura Educacional - Disciplinas, turmas, subgrupos e membros com papéis
- 📖 Documentação Swagger/OpenAPI - API completamente documentada
- 🛡️ Validação Robusta - Validação em cascata de dados de entrada
- Java 21 - Linguagem principal
- Spring Boot 3.5.0 - Framework web e IoT
- Spring Security - Autenticação e autorização
- Spring Data JPA - Camada de persistência
- JWT (Auth0) - Gerenciamento de tokens
- Jakarta Validation - Validação de beans
- Lombok - Redução de boilerplate
- PostgreSQL - Banco de dados relacional
- H2 Database - Banco em memória para testes
- SpringDoc OpenAPI 3.0 - Documentação automática da API
- Jackson Databind - Serialização JSON avançada
- JUnit 5 - Framework de testes unitários
- Mockito - Mock objects para testes
- Maven - Gerenciador de dependências
- Docker & Docker Compose - Containerização
- Java 21 ou superior
- Maven 3.8 ou superior
- PostgreSQL 15 ou superior
- Docker 20.10+ (opcional, para containerização)
- Git para versionamento
Configure as seguintes variáveis no arquivo .env ou application.properties:
# Banco de Dados PostgreSQL
SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/uniflow
SPRING_DATASOURCE_USERNAME=postgres
SPRING_DATASOURCE_PASSWORD=sua_senha_aqui
SPRING_JPA_HIBERNATE_DDL_AUTO=update
# Segurança - JWT
JWT_SECRET_KEY=sua_chave_secreta_super_segura_aqui_com_minimo_32_caracteres
JWT_EXPIRATION_TIME=3600000
JWT_REFRESH_EXPIRATION_TIME=86400000
# Aplicação
SERVER_PORT=8080
SERVER_SERVLET_CONTEXT_PATH=/api
SPRING_APPLICATION_NAME=uniflow
# Swagger/OpenAPI
SPRINGDOC_SWAGGER_UI_ENABLED=true
SPRINGDOC_API_DOCS_PATH=/v3/api-docs-
Clone o repositório
git clone https://github.com/RaphaelMun1z/Spring-Uniflow.git cd Spring-Uniflow -
Configure o banco de dados PostgreSQL
# Criar banco de dados createdb uniflow # Ou via psql psql -U postgres -c "CREATE DATABASE uniflow;"
-
Configure as variáveis de ambiente
# Copie o arquivo de exemplo (se existir) cp .env.example .env # Edite com suas credenciais nano .env
-
Instale as dependências e compile
mvn clean install
-
Execute a aplicação
mvn spring-boot:run
-
Verifique a disponibilidade
# A API estará disponível em: # http://localhost:8080 # Documentação Swagger: # http://localhost:8080/swagger-ui.html
Crie o arquivo docker-compose.yml na raiz do projeto:
version: '3.9'
services:
postgres:
image: postgres:15-alpine
container_name: uniflow-postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: uniflow
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- uniflow-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
app:
build:
context: .
dockerfile: Dockerfile
container_name: uniflow-app
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/uniflow
SPRING_DATASOURCE_USERNAME: postgres
SPRING_DATASOURCE_PASSWORD: postgres
JWT_SECRET_KEY: ${JWT_SECRET_KEY:-sua-chave-secreta-padrao-aqui}
SPRING_JPA_HIBERNATE_DDL_AUTO: update
ports:
- "8080:8080"
depends_on:
postgres:
condition: service_healthy
networks:
- uniflow-network
restart: unless-stopped
volumes:
postgres_data:
driver: local
networks:
uniflow-network:
driver: bridgePara executar com Docker Compose:
# Construir e iniciar todos os serviços
docker-compose up -d
# Verificar logs
docker-compose logs -f app
# Parar os serviços
docker-compose down| Método | Endpoint | Descrição | Autenticação |
|---|---|---|---|
POST |
/auth/signin |
Login com credenciais | ❌ |
POST |
/auth/signup |
Registrar novo usuário | ❌ |
PUT |
/auth/refresh/{email} |
Renovar token JWT | ❌ |
POST |
/auth/forgot-password |
Solicitar redefinição de senha | ❌ |
POST |
/auth/reset-password |
Redefinir senha com token | ❌ |
| Método | Endpoint | Descrição | Autenticação |
|---|---|---|---|
GET |
/api/me |
Obter perfil do usuário logado | ✅ |
PATCH |
/api/me |
Atualizar perfil pessoal | ✅ |
GET |
/api/me/assinaturas |
Listar assinaturas do usuário | ✅ |
GET |
/api/me/pagamentos |
Histórico de pagamentos | ✅ |
GET |
/api/me/grupos |
Listar grupos do usuário | ✅ |
| Método | Endpoint | Descrição | Autenticação |
|---|---|---|---|
GET |
/api/assinantes/{id} |
Obter perfil público de assinante | ✅ |
GET |
/api/assinantes |
Listar todos os assinantes | ✅ ADMIN |
| Método | Endpoint | Descrição | Autenticação |
|---|---|---|---|
POST |
/api/pagamentos |
Processar novo pagamento | ✅ |
POST |
/api/pagamentos/registrar-externo |
Registrar pagamento externo | ✅ ADMIN |
GET |
/api/pagamentos/assinantes/{id} |
Histórico de pagamentos | ✅ ADMIN |
| Método | Endpoint | Descrição | Autenticação |
|---|---|---|---|
POST |
/api/grupos |
Criar novo grupo | ✅ |
GET |
/api/grupos |
Listar todos os grupos | ✅ |
GET |
/api/grupos/{id} |
Detalhes do grupo | ✅ |
PATCH |
/api/grupos/{id} |
Editar grupo | ✅ |
DELETE |
/api/grupos/{id} |
Excluir grupo | ✅ |
POST |
/api/grupos/{id}/convite |
Entrar em grupo com convite | ✅ |
POST |
/api/disciplinas |
Criar disciplina | ✅ ADMIN |
GET |
/api/disciplinas |
Listar disciplinas | ✅ |
PUT |
/api/disciplinas/{id} |
Atualizar disciplina | ✅ ADMIN |
| Método | Endpoint | Descrição | Autenticação |
|---|---|---|---|
POST |
/api/turmas/{id}/atividades-avaliativas |
Criar atividade avaliativa | ✅ PROFESSOR |
POST |
/api/turmas/{id}/subgrupos |
Criar subgrupo de turma | ✅ PROFESSOR |
PATCH |
/api/turmas/{id}/membros/{membroId} |
Alterar papel do membro | ✅ PROFESSOR |
| Método | Endpoint | Descrição | Autenticação |
|---|---|---|---|
GET |
/api/atividades-entrega/{id} |
Detalhes da entrega | ✅ |
PATCH |
/api/atividades-entrega/{id} |
Entregar atividade | ✅ ESTUDANTE |
POST |
/api/atividades-entrega/{id}/avaliar |
Avaliar entrega | ✅ PROFESSOR |
| Método | Endpoint | Descrição | Autenticação |
|---|---|---|---|
POST |
/api/notificacoes/enviar-para-grupo |
Enviar notificação para grupo | ✅ ADMIN |
POST |
/api/notificacoes/enviar-broadcast |
Enviar notificação broadcast | ✅ ADMIN |
GET |
/api/notificacoes |
Listar notificações | ✅ ADMIN |
| Método | Endpoint | Descrição | Autenticação |
|---|---|---|---|
GET |
/api/admin/usuarios |
Listar usuários do sistema | ✅ ADMIN |
GET |
/api/admin/planos |
Listar planos de assinatura | ✅ ADMIN |
POST |
/api/admin/planos |
Criar novo plano | ✅ ADMIN |
PUT |
/api/admin/planos/{id} |
Atualizar plano | ✅ ADMIN |
DELETE |
/api/admin/planos/{id} |
Deletar plano | ✅ ADMIN |
curl -X POST http://localhost:8080/auth/signup \
-H "Content-Type: application/json" \
-d '{
"nome": "João Silva",
"email": "joao@example.com",
"senha": "SenhaSegura@123",
"tipoUsuario": "ESTUDANTE"
}'Resposta (201 Created):
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"nome": "João Silva",
"email": "joao@example.com",
"tipoUsuario": "ESTUDANTE",
"dataCriacao": "2024-01-15T10:30:00Z"
}curl -X POST http://localhost:8080/auth/signin \
-H "Content-Type: application/json" \
-d '{
"email": "joao@example.com",
"senha": "SenhaSegura@123"
}'Resposta (200 OK):
{
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"tipo": "Bearer",
"expiracao": 3600
}curl -X POST http://localhost:8080/api/grupos \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
-d '{
"nome": "Projeto IA 2024",
"descricao": "Grupo de estudo em Inteligência Artificial",
"disciplinaId": "disc-001"
}'Resposta (201 Created):
{
"id": "grupo-001",
"nome": "Projeto IA 2024",
"descricao": "Grupo de estudo em Inteligência Artificial",
"criador": "João Silva",
"dataCriacao": "2024-01-15T11:00:00Z",
"membros": 1
}curl -X GET http://localhost:8080/api/me \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."Resposta (200 OK):
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"nome": "João Silva",
"email": "joao@example.com",
"tipoUsuario": "ESTUDANTE",
"dataCriacao": "2024-01-15T10:30:00Z",
"ultimaAtualizacao": "2024-01-15T10:30:00Z"
}curl -X PUT http://localhost:8080/auth/refresh/joao@example.com \
-H "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."Resposta (200 OK):
{
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"tipo": "Bearer",
"expiracao": 3600
}Spring-Uniflow/
├── src/
│ ├── main/
│ │ ├── java/io/github/raphaelmuniz/uniflow/
│ │ │ ├── controllers/ # Endpoints REST
│ │ │ │ ├── autorizacao/ # Autenticação e autorização
│ │ │ │ ├── usuario/ # Gerenciamento de usuários
│ │ │ │ ├── grupo/ # Grupos, turmas e disciplinas
│ │ │ │ ├── atividade/ # Atividades e entregas
│ │ │ │ ├── assinatura/ # Assinaturas e pagamentos
│ │ │ │ └── notificacao/ # Notificações
│ │ │ ├── services/ # Lógica de negócio
│ │ │ ├── entities/ # Modelos JPA
│ │ │ ├── dto/ # DTOs (Request/Response)
│ │ │ ├── repositories/ # Acesso a dados
│ │ │ ├── config/ # Configurações (Security, etc)
│ │ │ ├── security/ # Implementações de segurança
│ │ │ ├── exceptions/ # Exceções customizadas
│ │ │ └── UnifloApplication.java # Classe principal
│ │ └── resources/
│ │ ├── application.properties # Configurações padrão
│ │ └── application-prod.properties # Configurações produção
│ └── test/
│ └── java/ # Testes unitários e de integração
├── pom.xml # Dependências Maven
├── docker-compose.yml # Orquestração de containers
├── Dockerfile # Imagem Docker da aplicação
└── README.md # Este arquivo
- MVC Pattern - Separação entre Controllers, Services e Repositories
- DTO Pattern - Transferência de dados entre camadas
- Repository Pattern - Abstração de acesso a dados via Spring Data JPA
- Dependency Injection - Injeção de dependências com Spring
- Security by Design - JWT, roles e authorities desde a concepção
- 🔐 Autenticação JWT - Tokens assinados com chave privada segura
- 🔄 Refresh Token - Renovação segura de tokens de acesso
- 👮 Autorização Granular - Controle baseado em roles (ADMIN, PROFESSOR, ESTUDANTE) e authorities específicas
- 🛡️ Spring Security - Framework robusto de segurança
- 🔒 Criptografia de Senhas - Uso de algoritmos seguros (BCrypt)
- 📝 Validação de Entrada - Jakarta Validation em todos os DTOs
- 🚫 CORS Configurável - Proteção contra requisições não autorizadas
- 🔑 Controle de Acesso -
@PreAuthorizeem endpoints sensíveis - 📋 Auditoria - Rastreamento de ações críticas (criação, atualização, exclusão)
- 🌐 HTTPS Ready - Suporte para comunicação segura
- Senhas armazenadas com hash seguro
- Tokens com expiração configurável
- Separação clara de responsabilidades de segurança
- Validação em múltiplas camadas
- Tratamento de erros sem exposição de dados sensíveis
# Rodar todos os testes
mvn test
# Rodar testes de uma classe específica
mvn test -Dtest=NomeTestClass
# Rodar com cobertura de código
mvn test jacoco:report
# Gerar relatório de cobertura
mvn jacoco:report# Com banco de dados H2 em memória
mvn verify
# Com PostgreSQL real (requer DB ativa)
mvn verify -Dspring.profiles.active=integration- JUnit 5 - Framework de testes
- Mockito - Criação de mocks para isolamento de testes
- Hamcrest - Matchers para assertions mais legíveis
- Spring Boot Test - Suporte para testes de integração
Sintoma: org.postgresql.util.PSQLException: Connection to localhost:5432 refused
Solução:
# Verificar se PostgreSQL está rodando
sudo systemctl status postgresql
# Iniciar PostgreSQL se necessário
sudo systemctl start postgresql
# Verificar se banco de dados existe
psql -U postgres -l | grep uniflow
# Se não existir, criar:
psql -U postgres -c "CREATE DATABASE uniflow;"Sintoma: JWT signature does not match locally computed signature ou JWT claims set cannot be parsed
Solução:
# Garantir que JWT_SECRET_KEY está definida corretamente
# Mínimo 32 caracteres recomendado
export JWT_SECRET_KEY="sua-chave-super-segura-com-minimo-32-caracteres"
# Reiniciar a aplicação
mvn spring-boot:runSintoma: 403 Forbidden ao fazer requisições autenticadas
Solução:
- Verificar se token JWT está correto no header
Authorization: Bearer {token} - Verificar se o usuário tem as authorities necessárias:
# Ver authorities do usuário curl -X GET http://localhost:8080/api/me \ -H "Authorization: Bearer {seu-token}"
- Verificar permissões no banco de dados
Sintoma: [ERROR] Failed to execute goal... durante mvn clean install
Solução:
# Limpar cache Maven
mvn clean
# Forçar download de dependências
mvn dependency:resolve-plugins
# Tentar build novamente
mvn clean install -USintoma: Address already in use: bind
Solução:
# Encontrar processo usando porta 8080
lsof -i :8080
# Matar processo (Unix/Linux/Mac)
kill -9 <PID>
# Ou usar porta diferente
mvn spring-boot:run -Dspring-boot.run.arguments="--server.port=8081"Sintoma: docker-compose up retorna erro
Solução:
# Verificar logs
docker-compose logs app
# Parar e remover containers
docker-compose down -v
# Reconstruir imagem
docker-compose build --no-cache
# Iniciar novamente
docker-compose up -dContribuições são bem-vindas! Siga este guia para contribuir:
# Clique no botão "Fork" no GitHub
# Ou clone seu fork
git clone https://github.com/SEU-USERNAME/Spring-Uniflow.git
cd Spring-Uniflow# Atualizar branch main local
git checkout main
git pull upstream main
# Criar nova branch para sua feature
git checkout -b feature/descricao-da-feature
# Exemplo de nomes válidos:
# feature/novo-endpoint-usuarios
# bugfix/corrigir-validacao-jwt
# docs/melhorar-documentacao-api# Editar arquivos necessários
# Manter commits atômicos e com mensagens descritivas
git add .
git commit -m "Adicionar nova funcionalidade X
- Descrição detalhada da mudança
- Por que esta mudança é necessária
- Como testar"# Push para seu fork
git push origin feature/descricao-da-feature
# Ir para GitHub e criar Pull Request
# Descrever mudanças, relacionar issues se houver
# Esperar review da comunidade- Use Java 21 com features modernas
- Siga Google Java Style Guide
- Adicione Javadoc para métodos públicos
- Escreva testes unitários para novas funcionalidades
- Use lombok para reduzir boilerplate
- Mantenha cobertura de código > 80%
# Rodar testes
mvn clean test
# Verificar cobertura
mvn jacoco:report
# Formatar código
mvn spotless:apply
# Build final
mvn clean package- 📖 Documentação Swagger - Disponível localmente
- 📚 Spring Boot Documentation
- 🔐 Spring Security Guide
- 🐛 Issues do Projeto
- Descrever comportamento esperado vs observado
- Incluir stack trace e versões do ambiente
- 💬 Discussões no GitHub Discussions
- 🤝 Pull Requests são sempre bem-vindos
- 📧 Entre em contato via issues para dúvidas maiores
Spring-Uniflow © 2024 | Desenvolvido com ☕ Java e 🚀 Spring Boot