Sistema desarrollado con Java 17 + Spring Boot 3 aplicando Clean Architecture (Hexagonal).
Prueba_Assessment/
├── backend/ # API REST con Spring Boot
│ ├── src/
│ │ ├── main/java/com/assessment/projectmanagement/
│ │ │ ├── domain/ # Entidades de dominio (sin frameworks)
│ │ │ ├── application/ # Casos de uso y puertos
│ │ │ ├── infrastructure/ # Adaptadores (JPA, Security, Config)
│ │ │ └── presentation/ # Controllers REST
│ │ └── test/ # Pruebas unitarias
│ ├── Dockerfile
│ └── pom.xml
├── frontend/ # Interfaz de usuario
│ ├── index.html # Aplicación HTML + JavaScript
│ └── nginx.conf # Configuración de Nginx
├── docker-compose.yml
└── README.md
backend/src/main/java/com/assessment/projectmanagement/
├── domain/ # Entidades y excepciones de dominio (sin dependencias de frameworks)
│ ├── model/ # User, Project, Task, ProjectStatus
│ └── exception/ # DomainException, BusinessRuleException, etc.
├── application/ # Casos de uso y puertos
│ ├── port/
│ │ ├── in/ # Puertos de entrada (casos de uso)
│ │ └── out/ # Puertos de salida (repositorios, audit, notification)
│ └── service/ # Implementación de casos de uso
├── infrastructure/ # Adaptadores e implementaciones
│ ├── adapter/ # AuditLogAdapter, NotificationAdapter
│ ├── config/ # SecurityConfig, OpenApiConfig, UseCaseConfig
│ ├── persistence/ # JPA entities, repositories, adapters
│ └── security/ # JWT, CurrentUserAdapter
└── presentation/ # Controladores REST
├── controller/ # AuthController, ProjectController, TaskController
├── dto/ # Request/Response DTOs
└── exception/ # GlobalExceptionHandler
docker compose upLa aplicación estará disponible en:
- Frontend: http://localhost:3000
- Backend API: http://localhost:8080
- Swagger UI: http://localhost:8080/swagger-ui.html
- API Docs: http://localhost:8080/api-docs
# Con Maven
./mvnw spring-boot:run
# O compilar y ejecutar
./mvnw clean package
java -jar target/project-management-1.0.0.jarUsuario pre-cargado en la base de datos:
- Email:
admin@example.com - Password:
admin123
O registra un nuevo usuario desde el frontend o usando la API:
# Registrar usuario
curl -X POST http://localhost:8080/api/auth/register \
-H "Content-Type: application/json" \
-d '{"username":"testuser","email":"test@example.com","password":"admin123"}'
# Login
curl -X POST http://localhost:8080/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"admin@example.com","password":"admin123"}'POST /api/auth/register- Registrar usuarioPOST /api/auth/login- Login (retorna JWT)
POST /api/projects- Crear proyectoGET /api/projects- Listar proyectos del usuarioPATCH /api/projects/{id}/activate- Activar proyecto
POST /api/projects/{projectId}/tasks- Crear tareaGET /api/projects/{projectId}/tasks- Listar tareasPATCH /api/tasks/{id}/complete- Completar tarea
- Un proyecto solo puede activarse si tiene al menos una tarea activa
- Solo el propietario puede modificar un proyecto o sus tareas
- Una tarea completada no puede modificarse
- Todas las eliminaciones son lógicas (soft delete)
- La activación de proyectos y la finalización de tareas generan auditoría y notificación
cd backend && mvn testLas pruebas cubren los casos críticos:
ActivateProject_WithTasks_ShouldSucceedActivateProject_WithoutTasks_ShouldFailActivateProject_ByNonOwner_ShouldFailCompleteTask_AlreadyCompleted_ShouldFailCompleteTask_ShouldGenerateAuditAndNotification
-
Arquitectura Hexagonal: El dominio es completamente independiente de frameworks. Los casos de uso definen puertos que son implementados por adaptadores.
-
JWT Stateless: Autenticación sin estado usando tokens JWT. No se almacenan sesiones.
-
Soft Delete: Las eliminaciones son lógicas (campo
deleted) para mantener trazabilidad. -
PostgreSQL en Docker: Base de datos relacional para producción, H2 embebida para desarrollo local.
-
Swagger/OpenAPI: Documentación automática de la API con soporte para autenticación JWT.
-
Frontend Simple: HTML + JavaScript vanilla para demostrar la integración sin agregar complejidad innecesaria.
- Java 17
- Spring Boot 3.2
- Spring Security + JWT
- Spring Data JPA
- PostgreSQL / H2
- Springdoc OpenAPI (Swagger)
- JUnit 5 + Mockito
- Docker + Docker Compose