Enterprise-grade GraphQL Task Management System
Task API es una solución backend moderna, escalable y robusta para la gestión de tareas y proyectos. Implementada con Spring Boot 4.0.5 y GraphQL, proporciona una API tipo-segura y eficiente para operaciones de CRUD sobre tareas y categorías, con soporte completo para paginación, filtrado y soft-deletes.
Diseñada siguiendo principios de arquitectura limpia (Clean Architecture) y diseño dirigido por el dominio (DDD)
✅ GraphQL API moderna - Queries y Mutations fuertemente tipadas
✅ MongoDB - Persistencia NoSQL con transacciones de réplica
✅ Paginación avanzada - Soporte para offset/limit con metadatos de navegación
✅ Soft-deletes - Eliminación lógica de tareas y categorías
✅ Arquitectura limpia - Separación clara entre capas (Controller → Service → Repository → Infrastructure)
✅ Docker ready - Docker Compose con MongoDB y aplicación pre-configurados
✅ Manejo de errores robusto - Excepciones personalizadas con transformación a respuestas GraphQL
✅ CORS habilitado - Soporte para orígenes cruzados
✅ Java 25 - Aprovecha las características más recientes de la plataforma
- Java 25 o superior
- Maven 3.8+
- Docker & Docker Compose (opcional, pero recomendado)
- MongoDB 6.0+ (si no usas Docker)
docker-compose up -dEsto iniciará:
- MongoDB con réplica configurada (puerto 27017)
- Task API en el puerto 8080
- GraphQL disponible en
http://localhost:8080/graphql
docker-compose up -d mongodb mongo-init-replica./mvnw clean package./mvnw spring-boot:runLa API estará disponible en http://localhost:8080/graphql
GraphQL Request
↓
[Controller] - GraphQL entry points (@QueryMapping, @MutationMapping)
↓
[Service] - Business Logic & Pagination
↓
[Repository Interface] - Domain contracts
↓
[Repository Adapter] - MongoDB implementation
↓
[MongoDB] - Persistent Data Store
| Directorio | Propósito |
|---|---|
controller/ |
Endpoints GraphQL (Queries y Mutations) |
application/service/ |
Lógica de negocio e interfaces de servicios |
application/dto/ |
Data Transfer Objects para API contracts |
application/mapper/ |
Conversión DTO ↔ Domain Models |
domain/model/ |
Modelos core (Task, Category) |
domain/repository/ |
Interfaces de repositorios (contratos) |
domain/exception/ |
Excepciones personalizadas (NotFoundException, etc.) |
infrastructure/repository/ |
Implementaciones de repositorios (MongoDB adapters) |
infrastructure/model/ |
MongoDB document models (@Document) |
application/config/ |
Configuración (CORS, MongoDB, GraphQL) |
- URL:
http://localhost:8080/graphql - UI interactiva:
http://localhost:8080/graphiql(GraphQL Playground)
query {
findAllTasks(offset: 0, limit: 10, categoryIds: ["ID_CATEGORIA"]) {
items {
id
title
description
completed
categoryId
category { id name }
createdAt
updatedAt
}
pageInfo {
offset
limit
totalCount
hasNextPage
hasPreviousPage
}
}
}query {
taskById(id: "TASK_ID") {
id
title
description
completed
category { id name }
}
}query {
categories(offset: 0, limit: 10) {
items {
id
name
isActive
createdAt
updatedAt
}
pageInfo {
offset
limit
totalCount
hasNextPage
hasPreviousPage
}
}
}query {
categoryById(id: "CATEGORY_ID") {
id
name
isActive
}
}mutation CreateTask($input: TaskInput!) {
createTask(input: $input) {
id
title
description
completed
categoryId
}
}Variables:
{
"input": {
"title": "Implementar autenticación",
"description": "Agregar JWT a la API",
"completed": false,
"categoryId": null
}
}mutation UpdateTask($id: ID!, $input: TaskUpdateInput!) {
updateTask(id: $id, input: $input) {
id
title
description
completed
}
}mutation {
toggleTask(id: "TASK_ID") {
id
completed
}
}mutation {
toggleDeleteTask(id: "TASK_ID") {
id
deleted
}
}mutation CreateCategory($input: CategoryInput!) {
createCategory(input: $input) {
id
name
isActive
}
}Variables:
{
"input": {
"name": "Trabajo"
}
}mutation UpdateCategory($id: ID!, $input: CategoryUpdateInput!) {
updateCategory(id: $id, input: $input) {
id
name
isActive
}
}mutation {
toggleDeleteCategory(id: "CATEGORY_ID") {
id
deleted
}
}./mvnw test./mvnw test -Dtest=TaskApiApplicationTests
./mvnw test -Dtest=TaskApiApplicationTests#testMethodName| Variable | Descripción | Default |
|---|---|---|
SPRING_DATA_MONGODB_URI |
URI de conexión MongoDB | mongodb://localhost:27017/task_db |
SERVER_PORT |
Puerto del servidor | 8080 |
SPRING_PROFILES_ACTIVE |
Perfil activo (dev, prod) | - |
JAVA_OPTS |
Opciones JVM adicionales | - |
spring.data.mongodb.uri=${SPRING_DATA_MONGODB_URI:mongodb://localhost:27017/task_db}
server.port=8080docker build -t task-api:latest .docker-compose up --buildLa aplicación estará disponible en: http://localhost:8080/graphql
- Interfaces en:
domain/repository/(contratos) - Implementaciones en:
infrastructure/repository/(adapters) - Los servicios manejan paginación, validación y lógica de negocio
- Los repositorios retornan modelos de dominio (no documentos MongoDB)
- Excepciones personalizadas:
NotFoundException,ValidationException - Transformadas automáticamente por
GraphQlExceptionHandler - Respuestas en formato GraphQL estándar
- Modelos incluyen campo
deleted: Boolean - Queries filtran automáticamente registros eliminados (a menos que se especifique)
toggleDelete*cambia el estado:deleted = !deleted
- Anotaciones
@Validen inputs GraphQL - Validaciones adicionales en capa de servicios
| Componente | Versión |
|---|---|
| Java | 25 |
| Spring Boot | 4.0.5 |
| Spring GraphQL | Latest |
| Spring Data MongoDB | Latest |
| MongoDB | 6.0+ |
| Maven | 3.8+ |
| Docker | Latest |
# Verifica que MongoDB esté corriendo
docker-compose logs mongodb
# Reinicia los servicios
docker-compose down && docker-compose up -d# Cambia el puerto en docker-compose.yml
ports:
- "8081:8080"
# O establece variable de entorno
export SERVER_PORT=8081# Limpia el proyecto
./mvnw clean
# Ejecuta tests con output detallado
./mvnw test -X- Paginación optimizada - Soporte para grandes volúmenes de datos
- Índices MongoDB - Configurables para queries comunes
- Lazy loading - Categorías se cargan bajo demanda
- Connection pooling - Configurado por defecto en Spring Data MongoDB
Última actualización: Abril 2026
Versión: 0.0.1-SNAPSHOT