Skip to content

Eabacam/Task-management-api

Repository files navigation

Task Management API:

Java Spring Boot MySQL License

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.

Características:

Autenticación y Seguridad:

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.

Gestión de Tareas:

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 y Filtros:

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.

Documentación:

Swagger/OpenAPI 3.0. Interfaz interactiva de API. Ejemplos de peticiones y respuestas.

Calidad del Código:

Tests unitarios con JUnit 5 y Mockito. Tests de integración. Manejo de excepciones. Validaciones con Bean Validation. DTOs para separación de capas.

DevOps:

Dockerfile multi-stage. Docker Compose. Health checks. Logs.

Arquitectura:

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

Capas:

Controller → Service → Repository → Database ↓ ↓ DTO Entity

Tecnologías:

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

Requisitos:

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).

Inicio Rápido:

Opción 1: Con Docker Compose:

# 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

Opción 2: Ejecución Local:

# 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

Opción 3: Ejecutar JAR:

# Compilar el proyecto
./mvnw clean package -DskipTests

# Ejecutar el JAR
java -jar target/task-management-api-1.0.0.jar

Documentación de la API:

Una vez que la aplicación esté corriendo, accede a:

Swagger UI: http://localhost:8080/swagger-ui.html OpenAPI JSON: http://localhost:8080/api-docs

Endpoints Principales:

Autenticación:

Método Endpoint Descripción
POST /api/auth/register Registrar nuevo usuario
POST /api/auth/login Iniciar sesión

Tareas:

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

Ejemplos de Uso:

Registro de Usuario:

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"
}

Iniciar Sesión:

curl -X POST http://localhost:8080/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "username": "johndoe",
    "password": "password123"
  }'

Crear Tarea:

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"
}

Listar Tareas con Paginación:

curl -X GET "http://localhost:8080/api/tasks?page=0&size=10&sortBy=createdAt&sortDir=desc" \
  -H "Authorization: Bearer YOUR_TOKEN_HERE"

Buscar Tareas por Filtros:

curl -X GET "http://localhost:8080/api/tasks/search?status=TODO&priority=HIGH&search=API" \
  -H "Authorization: Bearer YOUR_TOKEN_HERE"

Actualizar Estado de Tarea:

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"
  }'

Eliminar Tarea:

curl -X DELETE http://localhost:8080/api/tasks/1 \
  -H "Authorization: Bearer YOUR_TOKEN_HERE"

Docker:

Construir Imagen:

docker build -t task-management-api:1.0.0 .

Ejecutar Contenedor:

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

Docker Compose:

# Iniciar servicios
docker-compose up -d

# Ver logs
docker-compose logs -f

# Detener servicios
docker-compose down

# Limpiar todo
docker-compose down -v

Configuración:

Variables de Entorno:

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

Perfiles de Spring:

default: Configuración para desarrollo local. test: Configuración para tests (usa H2 en memoria).


Seguridad:

JWT:

Access Token: Válido por 24 horas. Refresh Token: Válido por 7 días. Algoritmo: HS256. Header: Authorization: Bearer {token}

Endpoints Públicos:

/api/auth/register /api/auth/login /swagger-ui/** /api-docs/**

Endpoints Protegidos:

Todos los endpoints de /api/tasks/** requieren autenticación.

Modelo de Datos:

Entidad User:

{
  "id": Long,
  "username": String (unique),
  "email": String (unique),
  "password": String (encrypted),
  "fullName": String,
  "role": Enum (USER, ADMIN),
  "active": Boolean,
  "createdAt": LocalDateTime,
  "updatedAt": LocalDateTime
}

Entidad Task:

{
  "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
}

Características:

Arquitectura:

Separación de capas (Controller, Service, Repository). DTOs para comunicación entre capas. Inyección de dependencias.

Buenas Prácticas:

Repository Pattern. Builder Pattern (Lombok). Exception Handler. Validaciones con Bean Validation.

Seguridad:

Password encoding con BCrypt. JWT stateless authentication. CORS configurado. SQL Injection prevention (JPA).

Performance:

Paginación en consultas. Lazy loading en relaciones JPA. Connection pooling (HikariCP). Índices en base de datos.

Mantenibilidad:

Código explicativo. Logs. Tests. Documentación.

Desarrollo y Testing:

Ejecutar Tests:

# Ejecutar todos los tests
mvn test

# Ejecutar tests unitarios
mvn test -Dtest="*Test"

# Ejecutar tests de integración
mvn test -Dtest="*IT"

Tests:

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.

Calidad del Código:

Anotaciones de Nulabilidad:

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);
}

Builder Pattern con Lombok:

Las entidades usan @Builder.Default para valores predeterminados:

@Builder.Default
private Status status = Status.TODO;

@Builder.Default
private Priority priority = Priority.MEDIUM;

Compilación:

# Compilar el proyecto
mvn clean compile

# Compilar y empaquetar (sin tests)
mvn clean package -DskipTests

# Compilar, testear y empaquetar
mvn clean install

Roadmap Futuro:

[ ] 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.

Licencia:

Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.

Autor:

EduAC Email: eabacam84@gmail.com LinkedIn: www.linkedin.com/in/eduardo-abato-desarrollador

Agradecimientos:

Spring Boot Team por el excelente framework. Comunidad de Java y Spring. Contribuidores de las librerías utilizadas.

About

REST API for task management with JWT authentication - Spring Boot 3

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors