Proyecto desarrollado como parte del Challenge Back End - Alura Latam.
El objetivo es construir una API REST para un foro de discusión, donde estudiantes y profesores pueden crear tópicos, responderlos y mantener la colaboración.
Ahora la API cuenta con autenticación y autorización con JWT 🔐.
- Java 17
- Spring Boot 3
- Spring Data JPA
- Spring Validation
- Flyway (migraciones de base de datos)
- MySQL 8
- Lombok
- Auth0 Java JWT
git clone https://github.com/aantoa/foroHub.git
cd foro-hub
CREATE DATABASE foro_hub;
En tu sistema o en IntelliJ IDEA / Spring Boot run configuration, define:
DB_HOST=localhost
DB_NAME=foro_hub
DB_USER=usuario
DB_PASSWORD=password
JWT_SECRET=clave_secreta
Estas variables son usadas en applications.properties
Migraciones gestionadas con Flyway (db/migration):
V1__create_table_usuarios.sqlV2__create_table_perfiles.sqlV3__create_table_usuarios_perfiles.sqlV4__create_table_cursos.sqlV5__create_table_topicos.sqlV6__create_table_respuestas.sql
Además, se incluyen semillas iniciales (INSERT) para:
- Usuarios (perfiles
ROLE_ADMIN,ROLE_MODERATOR,ROLE_PROFESSOR,ROLE_USER) - Cursos
- Usuario administrador (
admin@forohub.com / admin123) - Usuario estudiante (
user_student@forohub.com / user123)
./mvnw spring-boot:run
o desde IntelliJ ejecutando la clase principal ForoHubApplication.
Por defecto, la app levanta en:
http://localhost:8080
- Login:
POST /auth/login- Ingresa credenciales ingresadas de usuario: email y password y devuelve un token
- Una vez obtenido el token, este se debe enviar en el header de cada request
-
Crear un tópico:
POST /topicos- Validaciones:
- No permitir tópicos duplicados con mismo título y mensaje.
- Usuario y curso deben existir en BD.
- Errores controlados:
400→ Datos inválidos.404→ Usuario/curso no existe.422→ Duplicado.
-
Listar tópicos
-
GET /topicos -
Devuelve un listado resumido de todos los tópicos creados.
-
Filtros opcionales
anio(Integer) – Año de creación del tópico (ej.2025)cursoId(Long) – Id del curso
-
Se pueden combinarlos libremente:
- Todos:
GET /topicos - Por año:
GET /topicos?anio=2025 - Por curso:
GET /topicos?cursoId=1 - Por año y curso:
GET /topicos?anio=2025&cursoId=1
- Todos:
-
-
Listar detalle de un tópico
GET /topicos/{id}- Devuelve los datos de un tópico específico.
404si no existe.
-
Actualizar un tópico:
PUT /topicos/{id}- Se pueden modificar:
titulo,mensaje,status,cursoId. - Valida duplicados y existencia de curso.
404o422según corresponda.
-
Eliminar un tópico:
DELETE /topicos/{id}- Elimina solo si existe, en caso contrario devuelve
404.
Centralizado en GlobalExceptionHandler:
- 404: recurso no encontrado (
EntityNotFoundException) - 400: validaciones de campos (
MethodArgumentNotValidException) - 422: recurso duplicado (
DuplicateResourceException)
- Request
{
"email": "user_student@forohub.com",
"password": "user123"
}- Response
{
"token": "eyJhbGciOiJIUzI1NiJ9...",
"type": "Bearer"
}POST /topicos
{
"titulo": "Problema con JPA",
"mensaje": "No me reconoce la anotación @Entity.",
"autorId": 1,
"cursoId": 1
}PUT /topicos/1
{
"titulo": "Problema con Maven",
"mensaje": "Error al compilar.",
"status": "CERRADO",
"cursoId": 1
}DELETE /topicos/1Proyecto desarrollado como parte del Challenge Back End de Alura Latam.















