API REST para un foro desarrollada con Spring Boot 3 como parte del Challenge de Alura Latam.
ForoHub es una API REST que permite gestionar tópicos de un foro, con autenticación JWT y todas las operaciones CRUD necesarias. Los usuarios autenticados pueden crear, listar, actualizar y eliminar tópicos.
- Java 21
- Spring Boot 3.3.2
- Spring Security
- Spring Data JPA
- H2 Database
- JWT (JSON Web Tokens)
- Swagger/OpenAPI 3
- Maven
- Bean Validation
- Java 21 o superior
- Maven 3.6+
- IDE (IntelliJ IDEA, Eclipse, VS Code)
- Clona el repositorio:
git clone <tu-repositorio>
cd forohub
- Ejecuta el proyecto:
mvn spring-boot:run
- La aplicación estará disponible en:
http://localhost:8080
La API utiliza JWT para autenticación. Para acceder a los endpoints protegidos:
POST /auth/login
Content-Type: application/json
{
"username": "admin",
"password": "admin123"
}
Respuesta:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
Incluye el token en el header Authorization
:
Authorization: Bearer <tu-token>
Método | Endpoint | Descripción | Autenticación |
---|---|---|---|
POST | /auth/login |
Iniciar sesión | No |
Método | Endpoint | Descripción | Autenticación |
---|---|---|---|
GET | /topicos |
Listar tópicos (paginado) | Sí |
POST | /topicos |
Crear nuevo tópico | Sí |
GET | /topicos/{id} |
Obtener detalle de tópico | Sí |
PUT | /topicos/{id} |
Actualizar tópico | Sí |
DELETE | /topicos/{id} |
Eliminar tópico | Sí |
Método | Endpoint | Descripción | Autenticación |
---|---|---|---|
GET | / |
Estado de la API | No |
GET | /health |
Health check | No |
Accede a la documentación interactiva en: http://localhost:8080/swagger-ui.html
- URL:
http://localhost:8080/h2-console
- JDBC URL:
jdbc:h2:mem:forohubdb
- Usuario:
sa
- Contraseña: (vacía)
Tabla: topicos
id
(Long, PK, Auto)titulo
(String, 160 chars, requerido)mensaje
(Text, requerido)fecha_creacion
(LocalDateTime, auto)estatus
(Enum: ABIERTO/CERRADO)autor
(String, 120 chars, requerido)curso
(String, 120 chars)activo
(Boolean, soft delete)
Tabla: usuarios
id
(Long, PK, Auto)username
(String, único, requerido)password
(String, encriptado, requerido)role
(String, default: ROLE_ADMIN)
POST http://localhost:8080/auth/login
Content-Type: application/json
{
"username": "admin",
"password": "admin123"
}
POST http://localhost:8080/topicos
Authorization: Bearer <token>
Content-Type: application/json
{
"titulo": "Error en compilación",
"mensaje": "Al ejecutar mvn compile me aparece este error...",
"autor": "admin",
"curso": "Java"
}
GET http://localhost:8080/topicos?page=0&size=10&sort=fechaCreacion,desc
Authorization: Bearer <token>
- Tópicos únicos: No se permiten tópicos duplicados (mismo título y mensaje)
- Validación de campos: Todos los campos obligatorios deben estar presentes
- Autenticación requerida: Todos los endpoints (excepto login) requieren autenticación JWT
- Soft delete: Los tópicos eliminados se marcan como inactivos por defecto
- Paginación: Listados paginados por defecto (10 items por página)
- ✅ CRUD completo de tópicos
- ✅ Autenticación y autorización JWT
- ✅ Validación de datos con Bean Validation
- ✅ Manejo global de excepciones
- ✅ Documentación automática con Swagger
- ✅ Paginación y ordenamiento
- ✅ Soft delete
- ✅ Prevención de duplicados
- ✅ Configuración por perfiles (dev/prod)
- ✅ Seeding de datos en desarrollo
src/main/java/com/alurachallenge/forohub/
├── api/
│ ├── dto/ # DTOs para requests/responses
│ ├── mapper/ # Mappers de entidades a DTOs
│ ├── AuthController.java
│ ├── RootController.java
│ └── TopicoController.java
├── infra/
│ ├── openapi/ # Configuración Swagger
│ ├── security/ # Configuración JWT y Security
│ ├── DevUserSeeder.java
│ └── GlobalExceptionHandler.java
├── model/
│ ├── Estatus.java
│ ├── Topico.java
│ └── Usuario.java
├── repository/
│ ├── TopicoRepository.java
│ └── UsuarioRepository.java
└── ForohubApplication.java
Daniel Reyes - Challenge Alura Latam
Este proyecto fue desarrollado como parte del Challenge de Alura Latam, implementando todas las funcionalidades requeridas y siguiendo las mejores prácticas de Spring Boot y seguridad con JWT.