Una API REST para la gestión de tareas con autenticación JWT, construida con Spring Boot. Diseñada con arquitectura limpia y mejores prácticas de desarrollo backend.
Registro e inicio de sesión de usuarios. Autenticación JWT. Encriptación de contraseñas con BCrypt. Roles de usuario (USER, ADMIN). Endpoints protegidos con Spring Security.
CRUD de tareas. Estados: TODO, IN_PROGRESS, DONE. Prioridades: LOW, MEDIUM, HIGH. Asignación de tareas a usuarios. Fechas de vencimiento. Auditoría automática (createdAt, updatedAt)
Búsqueda por texto (título y descripción) Filtros por estado, prioridad, usuario. Filtros por rango de fechas. Paginación y ordenamiento. Consultas con JPA.
Swagger/OpenAPI 3.0. Interfaz interactiva de API. Ejemplos de peticiones y respuestas.
Tests unitarios con JUnit 5 y Mockito. Tests de integración. Manejo de excepciones. Validaciones con Bean Validation. DTOs para separación de capas.
Dockerfile multi-stage. Docker Compose. Health checks. Logs.
task-management-api/
├── src/
│ ├── main/
│ │ ├── java/com/taskmanager/
│ │ │ ├── config/ # Configuración (Security, OpenAPI)
│ │ │ ├── controller/ # REST Controllers
│ │ │ ├── dto/ # Data Transfer Objects
│ │ │ ├── entity/ # JPA Entities
│ │ │ ├── exception/ # Excepciones
│ │ │ ├── repository/ # Spring Data JPA Repositories
│ │ │ ├── security/ # JWT, Filters, UserDetails
│ │ │ └── service/ # Lógica de negocio
│ │ └── resources/
│ │ ├── application.yml # Configuración principal
│ │ └── application-test.yml # Configuración de tests
│ └── test/ # Tests unitarios e integración
├── docker-compose.yml # Orquestación de contenedores
├── Dockerfile # Imagen de la aplicación
└── pom.xml # Dependencias Maven
Controller → Service → Repository → Database ↓ ↓ DTO Entity
| Tecnología | Versión | Propósito |
|---|---|---|
| Java | 17 | Lenguaje |
| Spring Boot | 3.2.0 | Framework |
| Spring Security | 6.x | Autenticación y autorización |
| Spring Data JPA | 3.x | Acceso a datos |
| MySQL | 8.0 | Base de datos relacional |
| JWT (jjwt) | 0.12.3 | Tokens de autenticación |
| Lombok | Latest | Reducción de boilerplate |
| SpringDoc OpenAPI | 2.3.0 | Documentación de API |
| JUnit 5 | 5 | Testing |
| Mockito | 5 | Mocking tests |
| Docker | Latest | Contenedorización |
Antes de comenzar, asegúrate de tener instalado:
Java 17 o superior.
Maven 3.8+ o usa el wrapper incluido (./mvnw).
MySQL 8.0 (o usa Docker Compose).
Docker y Docker Compose (opcional pero recomendado).
# Clonar el repositorio
git clone https://github.com/tuusuario/task-management-api.git
cd task-management-api
# Levantar todo con Docker Compose
docker-compose up -d
# La API estará disponible en http://localhost:8080# Clonar el repositorio
git clone https://github.com/tuusuario/task-management-api.git
cd task-management-api
# Configurar MySQL
# Crea la base de datos: taskmanager_db
# Actualizar application.yml con tus credenciales de MySQL
# Compilar y ejecutar
./mvnw clean install
./mvnw spring-boot:run
# O usando Maven instalado
mvn clean install
mvn spring-boot:run# Compilar el proyecto
./mvnw clean package -DskipTests
# Ejecutar el JAR
java -jar target/task-management-api-1.0.0.jarUna vez que la aplicación esté corriendo, accede a:
Swagger UI: http://localhost:8080/swagger-ui.html OpenAPI JSON: http://localhost:8080/api-docs
| Método | Endpoint | Descripción |
|---|---|---|
| POST | /api/auth/register |
Registrar nuevo usuario |
| POST | /api/auth/login |
Iniciar sesión |
| Método | Endpoint | Descripción |
|---|---|---|
| POST | /api/tasks |
Crear tarea |
| GET | /api/tasks |
Listar todas las tareas |
| GET | /api/tasks/{id} |
Obtener tarea por ID |
| GET | /api/tasks/my-tasks |
Mis tareas creadas |
| GET | /api/tasks/assigned |
Tareas asignadas a mí |
| GET | /api/tasks/search |
Buscar y filtrar tareas |
| PUT | /api/tasks/{id} |
Actualizar tarea |
| DELETE | /api/tasks/{id} |
Eliminar tarea |
curl -X POST http://localhost:8080/api/auth/register \
-H "Content-Type: application/json" \
-d '{
"username": "johndoe",
"email": "john@example.com",
"password": "password123",
"fullName": "John Doe"
}'Respuesta:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"type": "Bearer",
"userId": 1,
"username": "johndoe",
"email": "john@example.com",
"role": "USER"
}curl -X POST http://localhost:8080/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"username": "johndoe",
"password": "password123"
}'curl -X POST http://localhost:8080/api/tasks \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN_HERE" \
-d '{
"title": "Implementar API de usuarios",
"description": "Crear endpoints CRUD para gestión de usuarios",
"status": "TODO",
"priority": "HIGH",
"dueDate": "2025-12-31T23:59:59"
}'Respuesta:
{
"id": 1,
"title": "Implementar API de usuarios",
"description": "Crear endpoints CRUD para gestión de usuarios",
"status": "TODO",
"priority": "HIGH",
"dueDate": "2025-12-31T23:59:59",
"assignedTo": null,
"createdBy": {
"id": 1,
"username": "johndoe",
"email": "john@example.com"
},
"createdAt": "2025-06-03T10:30:00",
"updatedAt": "2025-06-03T10:30:00"
}curl -X GET "http://localhost:8080/api/tasks?page=0&size=10&sortBy=createdAt&sortDir=desc" \
-H "Authorization: Bearer YOUR_TOKEN_HERE"curl -X GET "http://localhost:8080/api/tasks/search?status=TODO&priority=HIGH&search=API" \
-H "Authorization: Bearer YOUR_TOKEN_HERE"curl -X PUT http://localhost:8080/api/tasks/1 \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN_HERE" \
-d '{
"title": "Implementar API de usuarios",
"description": "Crear endpoints CRUD para gestión de usuarios",
"status": "IN_PROGRESS",
"priority": "HIGH",
"dueDate": "2025-12-31T23:59:59"
}'curl -X DELETE http://localhost:8080/api/tasks/1 \
-H "Authorization: Bearer YOUR_TOKEN_HERE"docker build -t task-management-api:1.0.0 .docker run -p 8080:8080 \
-e SPRING_DATASOURCE_URL=jdbc:mysql://host.docker.internal:3306/taskmanager_db \
-e SPRING_DATASOURCE_USERNAME=root \
-e SPRING_DATASOURCE_PASSWORD=root \
task-management-api:1.0.0# Iniciar servicios
docker-compose up -d
# Ver logs
docker-compose logs -f
# Detener servicios
docker-compose down
# Limpiar todo
docker-compose down -v| Variable | Descripción | Valor por Defecto |
|---|---|---|
SPRING_DATASOURCE_URL |
URL de conexión a MySQL | jdbc:mysql://localhost:3306/taskmanager_db |
SPRING_DATASOURCE_USERNAME |
Usuario de MySQL | root |
SPRING_DATASOURCE_PASSWORD |
Contraseña de MySQL | root |
JWT_SECRET |
Clave secreta para JWT | (ver application.yml) |
JWT_EXPIRATION |
Duración del token (ms) | 86400000 (24h) |
SERVER_PORT |
Puerto de la aplicación | 8080 |
default: Configuración para desarrollo local. test: Configuración para tests (usa H2 en memoria).
Access Token: Válido por 24 horas.
Refresh Token: Válido por 7 días.
Algoritmo: HS256.
Header: Authorization: Bearer {token}
/api/auth/register
/api/auth/login
/swagger-ui/**
/api-docs/**
Todos los endpoints de /api/tasks/** requieren autenticación.
{
"id": Long,
"username": String (unique),
"email": String (unique),
"password": String (encrypted),
"fullName": String,
"role": Enum (USER, ADMIN),
"active": Boolean,
"createdAt": LocalDateTime,
"updatedAt": LocalDateTime
}{
"id": Long,
"title": String,
"description": String,
"status": Enum (TODO, IN_PROGRESS, DONE),
"priority": Enum (LOW, MEDIUM, HIGH),
"dueDate": LocalDateTime,
"assignedTo": User (optional),
"createdBy": User,
"createdAt": LocalDateTime,
"updatedAt": LocalDateTime
}Separación de capas (Controller, Service, Repository). DTOs para comunicación entre capas. Inyección de dependencias.
Repository Pattern. Builder Pattern (Lombok). Exception Handler. Validaciones con Bean Validation.
Password encoding con BCrypt. JWT stateless authentication. CORS configurado. SQL Injection prevention (JPA).
Paginación en consultas. Lazy loading en relaciones JPA. Connection pooling (HikariCP). Índices en base de datos.
Código explicativo. Logs. Tests. Documentación.
# Ejecutar todos los tests
mvn test
# Ejecutar tests unitarios
mvn test -Dtest="*Test"
# Ejecutar tests de integración
mvn test -Dtest="*IT"El proyecto incluye:
12 tests unitarios. Tests de controllers (AuthController, TaskController). Tests de servicios (AuthService, TaskService). Mocking con Mockito. Base de datos H2 en memoria para tests.
El proyecto utiliza JetBrains Annotations para mejorar la seguridad del código:
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@NotNull // El valor nunca puede ser null
public Task createTask(@NotNull TaskRequest request) {
// ...
}
@Nullable // El valor puede ser null
public Task findById(Long id) {
return taskRepository.findById(id).orElse(null);
}Las entidades usan @Builder.Default para valores predeterminados:
@Builder.Default
private Status status = Status.TODO;
@Builder.Default
private Priority priority = Priority.MEDIUM;# Compilar el proyecto
mvn clean compile
# Compilar y empaquetar (sin tests)
mvn clean package -DskipTests
# Compilar, testear y empaquetar
mvn clean install[ ] Notificaciones por email. [ ] Tareas recurrentes. [ ] Etiquetas y categorías. [ ] Comentarios en tareas. [ ] Adjuntar archivos. [ ] Dashboard con métricas. [ ] Exportar tareas (PDF, Excel). [ ] API de notificaciones en tiempo real (WebSocket). [ ] Integración con calendarios.
Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.
EduAC Email: eabacam84@gmail.com LinkedIn: www.linkedin.com/in/eduardo-abato-desarrollador
Spring Boot Team por el excelente framework. Comunidad de Java y Spring. Contribuidores de las librerías utilizadas.