Skip to content

docenciait/spring-boot-examen

Repository files navigation

API REST de Gestión de Proyectos de Software

Sistema completo de gestión de proyectos de desarrollo de software con Spring Boot, JPA, MySQL y Docker.

🚀 Características

  • 3 Entidades JPA con relaciones (Desarrollador, Proyecto, Tarea)
  • DTOs para separación de capas
  • Validaciones completas con Bean Validation
  • Manejo de excepciones personalizado
  • Repositorios JPA con métodos personalizados
  • Servicios con lógica de negocio
  • Controladores REST CRUD completo
  • Tests unitarios con Mockito (24 tests)
  • Tests de integración con MockMvc (18 tests)
  • Docker Compose para MySQL

📋 Requisitos Previos

  • JDK 17 o superior
  • Maven 3.8+
  • Docker Desktop instalado y en ejecución
  • IntelliJ IDEA o cualquier IDE compatible con Spring Boot
  • Postman (opcional, para pruebas de API)

🛠️ Instalación y Configuración

1. Clonar el repositorio

git clone <url-del-repositorio>
cd practico

2. Levantar MySQL con Docker

docker-compose up -d

Esto levantará MySQL en el puerto 3306 con:

  • Base de datos: proyectosdb
  • Usuario: spring
  • Contraseña: spring

3. Verificar que MySQL está corriendo

docker ps
docker-compose logs mysql

4. Compilar el proyecto

mvn clean compile

5. Ejecutar los tests

mvn test

Deberías ver todos los tests pasando (42 tests en total).

6. Ejecutar la aplicación

mvn spring-boot:run

La aplicación estará disponible en: http://localhost:8080

📡 Endpoints de la API

Desarrolladores

GET    /api/desarrolladores              - Obtener todos los desarrolladores
GET    /api/desarrolladores/{id}         - Obtener desarrollador por ID
GET    /api/desarrolladores/activos      - Obtener desarrolladores activos
GET    /api/desarrolladores/especialidad/{especialidad} - Filtrar por especialidad
POST   /api/desarrolladores              - Crear nuevo desarrollador
PUT    /api/desarrolladores/{id}         - Actualizar desarrollador
DELETE /api/desarrolladores/{id}         - Eliminar desarrollador

Proyectos

GET    /api/proyectos                    - Obtener todos los proyectos
GET    /api/proyectos/{id}               - Obtener proyecto por ID
GET    /api/proyectos/activos            - Obtener proyectos activos
GET    /api/proyectos/estado/{estado}    - Filtrar por estado
GET    /api/proyectos/lider/{desarrolladorId} - Filtrar por líder
POST   /api/proyectos                    - Crear nuevo proyecto
PUT    /api/proyectos/{id}               - Actualizar proyecto
DELETE /api/proyectos/{id}               - Eliminar proyecto

Tareas

GET    /api/tareas                       - Obtener todas las tareas
GET    /api/tareas/{id}                  - Obtener tarea por ID
GET    /api/tareas/proyecto/{proyectoId} - Filtrar por proyecto
GET    /api/tareas/desarrollador/{desarrolladorId} - Filtrar por desarrollador
GET    /api/tareas/estado/{estado}       - Filtrar por estado
POST   /api/tareas                       - Crear nueva tarea
PUT    /api/tareas/{id}                  - Actualizar tarea
DELETE /api/tareas/{id}                  - Eliminar tarea

📝 Ejemplos de Uso

Crear un Desarrollador

curl -X POST http://localhost:8080/api/desarrolladores \
  -H "Content-Type: application/json" \
  -d '{
    "nombre": "Carlos",
    "apellido": "Martínez",
    "email": "carlos.martinez@devteam.com",
    "especialidad": "Backend",
    "nivelExperiencia": "SENIOR",
    "salarioMensual": 3500.00,
    "fechaContratacion": "2023-01-15"
  }'

Crear un Proyecto

curl -X POST http://localhost:8080/api/proyectos \
  -H "Content-Type: application/json" \
  -d '{
    "nombre": "Sistema de Gestión Hospitalaria",
    "codigo": "PRJ-2025-001",
    "descripcion": "API REST para gestión de pacientes y citas médicas",
    "cliente": "Hospital Central",
    "presupuesto": 50000.00,
    "fechaInicio": "2025-01-10",
    "fechaFinEstimada": "2025-06-30",
    "desarrolladorLiderId": 1,
    "tecnologias": "Java,Spring Boot,MySQL,Docker,React"
  }'

Crear una Tarea

curl -X POST http://localhost:8080/api/tareas \
  -H "Content-Type: application/json" \
  -d '{
    "proyectoId": 1,
    "desarrolladorAsignadoId": 2,
    "titulo": "Implementar módulo de autenticación JWT",
    "descripcion": "Crear endpoints de login, registro y refresh token",
    "prioridad": "ALTA",
    "horasEstimadas": 16,
    "fechaLimite": "2025-01-25"
  }'

Obtener todos los Desarrolladores

curl http://localhost:8080/api/desarrolladores

🧪 Testing

El proyecto incluye:

  • 24 tests unitarios de servicios con Mockito
  • 18 tests de integración con MockMvc

Para ejecutar solo tests unitarios:

mvn test -Dtest=*ServiceTest

Para ejecutar solo tests de integración:

mvn test -Dtest=*IntegrationTest

🏗️ Estructura del Proyecto

src/
├── main/
│   ├── java/es/iesguzman/proyectos/
│   │   ├── ProyectosApplication.java
│   │   ├── controller/          # Controladores REST
│   │   │   ├── DesarrolladorController.java
│   │   │   ├── ProyectoController.java
│   │   │   └── TareaController.java
│   │   ├── service/             # Lógica de negocio
│   │   │   ├── DesarrolladorService.java
│   │   │   ├── ProyectoService.java
│   │   │   └── TareaService.java
│   │   ├── repository/          # Acceso a datos
│   │   │   ├── DesarrolladorRepository.java
│   │   │   ├── ProyectoRepository.java
│   │   │   └── TareaRepository.java
│   │   ├── model/               # Entidades JPA
│   │   │   ├── Desarrollador.java
│   │   │   ├── Proyecto.java
│   │   │   └── Tarea.java
│   │   ├── dto/                 # Data Transfer Objects
│   │   │   ├── DesarrolladorDTO.java
│   │   │   ├── DesarrolladorCreateUpdateDTO.java
│   │   │   ├── ProyectoDTO.java
│   │   │   ├── ProyectoCreateUpdateDTO.java
│   │   │   ├── TareaDTO.java
│   │   │   ├── TareaCreateDTO.java
│   │   │   └── TareaUpdateDTO.java
│   │   └── exception/           # Manejo de excepciones
│   │       ├── ResourceNotFoundException.java
│   │       ├── ValidationException.java
│   │       ├── ConflictException.java
│   │       └── GlobalExceptionHandler.java
│   └── resources/
│       └── application.properties
└── test/
    └── java/es/iesguzman/proyectos/
        ├── service/             # Tests unitarios
        │   ├── DesarrolladorServiceTest.java
        │   ├── ProyectoServiceTest.java
        │   └── TareaServiceTest.java
        └── controller/          # Tests de integración
            ├── DesarrolladorControllerIntegrationTest.java
            ├── ProyectoControllerIntegrationTest.java
            └── TareaControllerIntegrationTest.java

🔧 Tecnologías Utilizadas

  • Java 17
  • Spring Boot 3.2.0
  • Spring Data JPA
  • MySQL 8.0
  • Lombok
  • Bean Validation
  • JUnit 5
  • Mockito
  • MockMvc
  • Docker & Docker Compose
  • Maven

🐳 Comandos Docker Útiles

# Levantar servicios
docker-compose up -d

# Detener servicios
docker-compose down

# Ver logs
docker-compose logs -f mysql

# Reiniciar servicios
docker-compose restart

# Eliminar todo (incluyendo volúmenes)
docker-compose down -v

# Conectarse a MySQL
docker exec -it proyectos-mysql mysql -u spring -p

📊 Validaciones Implementadas

Desarrollador

  • Nombre y apellido: 3-50 caracteres
  • Email único y formato válido
  • Salario entre 800 y 15,000
  • Fecha de contratación no posterior a hoy
  • Solo activos pueden liderar proyectos

Proyecto

  • Nombre: 5-100 caracteres, único
  • Código: formato PRJ-YYYY-XXX, único
  • Presupuesto: entre 1,000 y 500,000
  • Fecha fin posterior a fecha inicio
  • Líder debe ser SENIOR o LEAD

Tarea

  • Título: 10-200 caracteres
  • Horas estimadas: 1-200
  • Fecha límite posterior a hoy
  • Solo en proyectos EN_DESARROLLO o EN_PRUEBAS
  • Desarrollador debe estar activo

🔒 Manejo de Errores

La API devuelve respuestas estructuradas para todos los errores:

{
  "timestamp": "2025-11-22T10:30:00",
  "status": 404,
  "error": "Not Found",
  "message": "Desarrollador con id 99 no encontrado",
  "path": "/api/desarrolladores/99"
}

Códigos de estado HTTP:

  • 200 OK - Operación exitosa
  • 201 Created - Recurso creado
  • 204 No Content - Eliminación exitosa
  • 400 Bad Request - Error de validación
  • 404 Not Found - Recurso no encontrado
  • 409 Conflict - Conflicto de negocio

📚 Documentación Adicional

  • Ver archivo EXAMEN_PRACTICO_2DAW.md para especificaciones completas
  • Colección de Postman disponible en postman/

👥 Autor

Examen Práctico 2DAW - Desarrollo Web en Servidor
IES Guzmán El Bueno

📄 Licencia

Este proyecto es material educativo para el examen de 2DAW.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors