Uma API REST completa para gerenciamento de fórum de discussões, desenvolvida com Spring Boot 3.5.4 e Java 17.
O FórumHub é uma API REST que replica o funcionamento de um fórum de discussões, similar ao fórum da Alura. Os usuários podem criar tópicos, responder a discussões, marcar soluções e gerenciar o status dos tópicos. A API implementa autenticação JWT, autorização baseada em roles e todas as operações CRUD necessárias.
- Autenticação e Autorização: Sistema completo com JWT e roles (USUARIO, MODERADOR, ADMIN)
- Gerenciamento de Tópicos: CRUD completo com validações e prevenção de duplicatas
- Sistema de Respostas: Usuários podem responder tópicos e marcar soluções
- Controle de Status: Tópicos podem ser abertos/fechados automaticamente
- Documentação Interativa: Swagger UI integrado
- Testes Abrangentes: Testes unitários e de integração com TestContainers
- Java 17
- Spring Boot 3.5.4
- Spring Security (Autenticação JWT)
- Spring Data JPA (Persistência de dados)
- MySQL (Banco de dados)
- Flyway (Migrações de banco)
- Lombok (Redução de boilerplate)
- SpringDoc OpenAPI (Documentação)
- JUnit 5 + Mockito (Testes unitários)
- TestContainers (Testes de integração)
O projeto segue uma arquitetura em camadas bem definida:
┌─────────────────┐
│ Controllers │ ← Endpoints REST, validação de entrada
├─────────────────┤
│ Services │ ← Lógica de negócio, regras de autorização
├─────────────────┤
│ Repositories │ ← Acesso a dados, queries customizadas
├─────────────────┤
│ Entities │ ← Entidades JPA, mapeamento do banco
└─────────────────┘
- User: Usuários do sistema com perfis de acesso
- Profile: Perfis de usuário (USUARIO, MODERADOR, ADMIN)
- Topic: Tópicos de discussão
- Response: Respostas aos tópicos
- Course: Cursos para categorização dos tópicos
- User ↔ Profile (N:N)
- User → Topic (1:N)
- User → Response (1:N)
- Course → Topic (1:N)
- Topic → Response (1:N)
- Java 17+
- Maven 3.6+
- MySQL 8.0+
- Docker (opcional, para testes)
- Crie um banco MySQL:
CREATE DATABASE forum_db;
CREATE USER 'forum_user'@'localhost' IDENTIFIED BY 'forum_pass';
GRANT ALL PRIVILEGES ON forum_db.* TO 'forum_user'@'localhost';- Configure as variáveis de ambiente (opcional):
export DB_USERNAME=forum_user
export DB_PASSWORD=forum_pass
export JWT_SECRET=meuSegredoSuperSecreto123456789012345678901234567890- Clone o repositório:
git clone <url-do-repositorio>
cd forum-api- Execute a aplicação:
mvn spring-boot:run- A API estará disponível em:
http://localhost:8080
# Testes unitários
mvn test
# Testes de integração (requer Docker)
mvn verifyAcesse a documentação interativa em: http://localhost:8080/swagger-ui.html
POST /auth/register- Registrar novo usuárioPOST /auth/login- Fazer login
GET /topicos- Listar tópicos (com paginação e filtros)GET /topicos/{id}- Obter tópico específicoPOST /topicos- Criar novo tópicoPUT /topicos/{id}- Atualizar tópicoDELETE /topicos/{id}- Deletar tópicoPUT /topicos/{id}/close- Fechar tópicoPUT /topicos/{id}/open- Reabrir tópico
POST /topicos/{id}/respostas- Criar respostaGET /topicos/{id}/respostas- Listar respostas do tópicoPUT /respostas/{id}/solucao- Marcar como soluçãoDELETE /respostas/{id}- Deletar resposta
A API utiliza JWT (JSON Web Tokens) para autenticação. Após o login, inclua o token no header:
Authorization: Bearer <seu-jwt-token>
- Registrar usuário:
curl -X POST http://localhost:8080/auth/register \
-H "Content-Type: application/json" \
-d '{
"nome": "João Silva",
"email": "joao@email.com",
"senha": "senha123"
}'- Fazer login:
curl -X POST http://localhost:8080/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "joao@email.com",
"senha": "senha123"
}'- Criar tópico:
curl -X POST http://localhost:8080/topicos \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"titulo": "Dúvida sobre Spring Security",
"mensagem": "Como configurar JWT no Spring Security?",
"cursoId": 1
}'O projeto possui cobertura abrangente de testes:
- Entities: Validação de regras de negócio
- Repositories: Queries customizadas
- Services: Lógica de negócio e autorização
- Controllers: Endpoints e validações
- API Completa: Testes end-to-end com banco real
- Segurança: Autenticação e autorização
- Cenários Complexos: Fluxos completos de usuário
- default: Configuração padrão
- dev: Configuração para desenvolvimento (logs detalhados)
- test: Configuração para testes
| Variável | Descrição | Padrão |
|---|---|---|
DB_USERNAME |
Usuário do banco | forum_user |
DB_PASSWORD |
Senha do banco | forum_pass |
JWT_SECRET |
Chave secreta JWT | mySecretKey... |
- Sistema de notificações
- Upload de arquivos/imagens
- Sistema de votação em respostas
- Moderação automática de conteúdo
- API de estatísticas
- Cache com Redis
- Rate limiting
- Faça um fork do projeto
- Crie uma branch para sua feature (
git checkout -b feature/AmazingFeature) - Commit suas mudanças (
git commit -m 'Add some AmazingFeature') - Push para a branch (
git push origin feature/AmazingFeature) - Abra um Pull Request
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
Desenvolvido como parte do Challenge Back End da Alura.
⭐ Se este projeto foi útil para você, considere dar uma estrela no repositório!