Este proyecto es una API REST para la gestión de matrículas estudiantiles, desarrollada con Spring Boot WebFlux y MongoDB. El despliegue se realiza fácilmente usando Docker Compose.
- API reactiva para operaciones CRUD de matrícula, estudiante, curso y usuario.
- Seguridad JWT y roles (admin, user).
- Inicialización automática de datos de usuario y roles.
- Conexión a MongoDB en contenedor.
- src/main/java/com/mitocode/model: Entidades principales (
Matricula,Estudiante,Curso,User,Role). - src/main/java/com/mitocode/repo: Repositorios reactivos para MongoDB.
- src/main/java/com/mitocode/controller: Controladores y handlers para endpoints REST.
- docker-compose.yml: Orquestación de MongoDB y la app backend.
- Dockerfile: Construcción de la imagen backend.
- Docker y Docker Compose instalados.
- Java 21+ (solo si deseas compilar localmente).
- Maven (solo si deseas compilar localmente).
git clone <url-del-repo>
cd spring-webflux-matriculamvn clean package -DskipTestsdocker compose up -d --buildEsto creará y levantará dos contenedores:
mongodb: Base de datos MongoDB en puerto 27017matricula_app: Backend Spring Boot en puerto 8080
Puedes probar el estado de la app con:
curl http://localhost:8080/actuator/healthNota: Cambia
<jwt-token>por el token real recibido en el login.
- Descripción: Obtiene un token JWT válido.
- URL completa:
http://localhost:8080/login - Body ejemplo:
{ "username": "admin", "password": "admin123" } - Curl:
curl -X POST http://localhost:8080/login \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"admin123"}'
- Respuesta exitosa:
{ "token": "<jwt-token>" }
- Descripción: Lista todos los cursos
- URL completa:
http://localhost:8080/api/v2/cursos - Curl:
curl -H "Authorization: Bearer <jwt-token>" http://localhost:8080/api/v2/cursos
- Descripción: Obtiene curso por ID
- URL completa:
http://localhost:8080/api/v2/cursos/ID_CURSO - Curl:
curl -H "Authorization: Bearer <jwt-token>" http://localhost:8080/api/v2/cursos/ID_CURSO
- Descripción: Crea nuevo curso
- URL completa:
http://localhost:8080/api/v2/cursos- Body ejemplo:
{ "nombre": "Ciencias Naturales", "siglas": "MAT101", "estado": true }
- Body ejemplo:
- Curl:
curl -X POST http://localhost:8080/api/v2/cursos \ -H "Authorization: Bearer <jwt-token>" \ -H "Content-Type: application/json" \ -d '{ "nombre": "Ciencias Naturales", "siglas": "MAT101", "estado": true }'
- Descripción: Actualiza curso
- URL completa:
http://localhost:8080/api/v2/cursos/ID_CURSO - Body ejemplo:
{ "nombre": "Matemáticas Avanzadas", "descripcion": "Curso avanzado" } - Curl:
curl -X PUT http://localhost:8080/api/v2/cursos/ID_CURSO \ -H "Authorization: Bearer <jwt-token>" \ -H "Content-Type: application/json" \ -d '{"nombre":"Matemáticas Avanzadas","descripcion":"Curso avanzado"}'
- Descripción: Elimina curso
- URL completa:
http://localhost:8080/api/v2/cursos/ID_CURSO - Curl:
curl -X DELETE http://localhost:8080/api/v2/cursos/ID_CURSO \ -H "Authorization: Bearer <jwt-token>"
- Descripción: Lista todos los estudiantes
- URL completa:
http://localhost:8080/api/v2/estudiantes - Curl:
curl -H "Authorization: Bearer <jwt-token>" http://localhost:8080/api/v2/estudiantes
- Descripción: Obtiene estudiante por ID
- URL completa:
http://localhost:8080/api/v2/estudiantes/ID_ESTUDIANTE - Curl:
curl -H "Authorization: Bearer <jwt-token>" http://localhost:8080/api/v2/estudiantes/ID_ESTUDIANTE
- Descripción: Lista estudiantes ordenados por edad ascendente
- URL completa:
http://localhost:8080/api/v2/estudiantes/ordenados/asc - Curl:
curl -H "Authorization: Bearer <jwt-token>" http://localhost:8080/api/v2/estudiantes/ordenados/asc
- Descripción: Lista estudiantes ordenados por edad descendente
- URL completa:
http://localhost:8080/api/v2/estudiantes/ordenados/desc - Curl:
curl -H "Authorization: Bearer <jwt-token>" http://localhost:8080/api/v2/estudiantes/ordenados/desc
- Descripción: Crea nuevo estudiante
- URL completa:
http://localhost:8080/api/v2/estudiantes- Body ejemplo:
{ "nombres": "Juan", "apellidos": "Pérez", "dni": "12345678", "edad": 22 }
- Body ejemplo:
- Curl:
curl -X POST http://localhost:8080/api/v2/estudiantes \ -H "Authorization: Bearer <jwt-token>" \ -H "Content-Type: application/json" \ -d '{ "nombres": "Juan", "apellidos": "Pérez", "dni": "12345678", "edad": 22 }'
- Descripción: Actualiza estudiante
- URL completa:
http://localhost:8080/api/v2/estudiantes/ID_ESTUDIANTE - Body ejemplo:
{ "id": "ID_ESTUDIANTE", "nombres": "Juan", "apellidos": "Pérez", "dni": "12345678", "edad": 23 } - Curl:
curl -X PUT http://localhost:8080/api/v2/estudiantes/ID_ESTUDIANTE \ -H "Authorization: Bearer <jwt-token>" \ -H "Content-Type: application/json" \ -d '{ "id": "ID_ESTUDIANTE", "nombres": "Juan", "apellidos": "Pérez", "dni": "12345678", "edad": 23 }'
- Descripción: Elimina estudiante
- URL completa:
http://localhost:8080/api/v2/estudiantes/ID_ESTUDIANTE - Curl:
curl -X DELETE http://localhost:8080/api/v2/estudiantes/ID_ESTUDIANTE \ -H "Authorization: Bearer <jwt-token>"
- Descripción: Lista todas las matrículas
- URL completa:
http://localhost:8080/api/matriculas - Curl:
curl -H "Authorization: Bearer <jwt-token>" http://localhost:8080/api/matriculas
- Descripción: Obtiene una matrícula por ID
- URL completa:
http://localhost:8080/api/matriculas/ID_MATRICULA - Curl:
curl -H "Authorization: Bearer <jwt-token>" http://localhost:8080/api/matriculas/ID_MATRICULA
- Descripción: Crea una nueva matrícula
- URL completa:
http://localhost:8080/api/matriculas - Body ejemplo:
{ "estudiante": { "id": "689e4252e4d37407a79cd9ee" }, "cursos": [ { "id": "689e8467fd811545a3c4c79c" } ], "fechaMatricula": "2024-08-14" } - Curl:
curl -X POST http://localhost:8080/api/matriculas \ -H "Authorization: Bearer <jwt-token>" \ -H "Content-Type: application/json" \ -d '{ "estudiante": { "id": "689e4252e4d37407a79cd9ee" }, "cursos": [ { "id": "689e8467fd811545a3c4c79c" } ], "fechaMatricula": "2024-08-14" }'
- Descripción: Actualiza una matrícula existente
- URL completa:
http://localhost:8080/api/matriculas/ID_MATRICULA - Body ejemplo:
{ "estudiante": { "id": "689e4252e4d37407a79cd9ee" }, "cursos": [ { "id": "689e8467fd811545a3c4c79c" } ], "fechaMatricula": "2024-08-15" } - Curl:
curl -X PUT http://localhost:8080/api/matriculas/ID_MATRICULA \ -H "Authorization: Bearer <jwt-token>" \ -H "Content-Type: application/json" \ -d '{ "estudiante": { "id": "689e4252e4d37407a79cd9ee" }, "cursos": [ { "id": "689e8467fd811545a3c4c79c" } ], "fechaMatricula": "2024-08-15" }'
- Descripción: Elimina una matrícula
- URL completa:
http://localhost:8080/api/matriculas/ID_MATRICULA - Curl:
curl -X DELETE http://localhost:8080/api/matriculas/ID_MATRICULA \ -H "Authorization: Bearer <jwt-token>"
Nota: Todos los endpoints (excepto
/login) requieren autenticación JWT en el headerAuthorization. Puedes obtener el token usando el endpoint de login.
Al iniciar, se crean los siguientes usuarios por defecto:
- admin / admin123 (roles: ADMIN, USER)
- user / user123 (rol: USER)
- Si el backend no arranca, revisa los logs con:
docker logs matricula_app
- Si MongoDB no responde, revisa los logs con:
docker logs mongodb
- Si cambias el código Java, recuerda recompilar y reconstruir la imagen:
mvn clean package -DskipTests docker compose up -d --build
Proyecto de Daniel Picuasi Duque, con MITOCODE - Proyecto Final Spring Webflux. Uso libre para fines educativos.