API REST de nivel producción construida con Java 17, Spring Boot 3.2 y arquitectura hexagonal para la gestión empresarial, productos, clientes y órdenes.
Este proyecto implementa Arquitectura Hexagonal (Ports & Adapters) con separación clara de responsabilidades:
src/main/java/com/litethinking/enterprise/
├── domain/ # Lógica de negocio pura (sin dependencias externas)
│ ├── model/ # Entidades de dominio y Value Objects
│ ├── port/ # Interfaces (puertos de entrada y salida)
│ └── exception/ # Excepciones de dominio
├── application/ # Casos de uso y orquestación
│ ├── usecase/ # Servicios de aplicación
│ ├── dto/ # Data Transfer Objects
│ └── mapper/ # Mappers (MapStruct)
├── infrastructure/ # Implementaciones técnicas
│ ├── persistence/ # JPA entities y repositorios
│ ├── security/ # JWT, BCrypt, configuración de seguridad
│ ├── integration/ # reCAPTCHA, AWS SES, PDF
│ └── config/ # Configuraciones de Spring
└── interfaces/ # Adaptadores de entrada
├── rest/ # Controllers REST
└── exception/ # Exception handlers globales
- Java 17
- Spring Boot 3.2.1
- PostgreSQL (base de datos principal)
- Spring Security + JWT (autenticación stateless)
- BCrypt (hashing de contraseñas, cost 12)
- MapStruct (mapeo de objetos)
- Hibernate/JPA (ORM)
- Swagger/OpenAPI (documentación)
- Google reCAPTCHA v3 (protección de login)
- AWS SES (envío de correos)
- iText7 (generación de PDF)
- JUnit 5 + Mockito (testing)
- JDK 17 o superior
- Maven 3.8+
- PostgreSQL 14+
- Cuenta de Google Cloud (reCAPTCHA)
- Cuenta de AWS (SES para correos)
Ejecutar el script SQL proporcionado para crear el esquema completo:
-- Ver archivo: database/schema.sqlEl modelo incluye:
- Seguridad:
roles,usuarios - Catálogos:
monedas,categorias - Negocio:
empresas,productos,producto_precios,producto_categoria - Transaccional:
clientes,estados_orden,ordenes,orden_detalles - Monitoreo:
excepciones_sistema
Crear archivo .env o configurar en el sistema:
# Database
DB_HOST=localhost
DB_PORT=5432
DB_NAME=enterprise_db
DB_USER=postgres
DB_PASSWORD=your_password
# Security
JWT_SECRET=your-256-bit-secret-key-minimum-32-characters-long
RECAPTCHA_SECRET=your-recaptcha-secret-key
# AWS
AWS_REGION=us-east-1
AWS_ACCESS_KEY=your-access-key
AWS_SECRET_KEY=your-secret-key
AWS_SES_FROM=noreply@yourdomain.com
AWS_SES_ENABLED=true
# Server
SERVER_PORT=8080# Compilar
mvn clean install
# Ejecutar
mvn spring-boot:run
# O directamente
java -jar target/enterprise-api-1.0.0.jarLa aplicación estará disponible en: http://localhost:8080
Swagger UI: http://localhost:8080/swagger-ui.html
OpenAPI JSON: http://localhost:8080/api-docs
Nota: Swagger requiere autenticación JWT. Primero hacer login y copiar el token en "Authorize".
POST /api/v1/auth/login
POST /api/v1/auth/register
POST /api/v1/empresas
GET /api/v1/empresas
GET /api/v1/empresas/{nit}
PUT /api/v1/empresas/{nit}
DELETE /api/v1/empresas/{nit}
POST /api/v1/productos
GET /api/v1/productos
GET /api/v1/productos/{codigo}
PUT /api/v1/productos/{codigo}
DELETE /api/v1/productos/{codigo}
POST /api/v1/ordenes
GET /api/v1/ordenes
GET /api/v1/ordenes/{id}
PUT /api/v1/ordenes/{id}/estado
GET /api/v1/inventario/pdf?empresaNit={nit}
POST /api/v1/inventario/enviar-pdf
- ADMIN: Acceso completo a todas las operaciones
- EXTERNO: Solo lectura de empresas y productos
- Contraseñas hasheadas con BCrypt (cost 12)
- Tokens JWT con expiración de 24 horas
- Login protegido con Google reCAPTCHA v3
- Validación de roles con
@PreAuthorize - Headers de seguridad configurados
- CORS configurado
Respuestas estandarizadas:
{
"timestamp": "2024-01-15T10:30:00",
"status": 400,
"error": "Bad Request",
"message": "Descripción del error",
"path": "/api/v1/empresas"
}Códigos HTTP:
200: Éxito201: Recurso creado400: Validación fallida401: No autenticado403: Sin permisos404: Recurso no encontrado409: Conflicto de negocio422: Entidad no procesable500: Error interno
Los errores críticos se registran automáticamente en excepciones_sistema.
# Ejecutar todos los tests
mvn test
# Solo tests unitarios
mvn test -Dtest=*UnitTest
# Solo tests de integración
mvn test -Dtest=*IntegrationTest
# Con cobertura
mvn test jacoco:report- Hexagonal Architecture: Separación de capas
- Repository Pattern: Acceso a datos
- Factory Pattern: Creación de entidades complejas
- Strategy Pattern: Validaciones de estados
- Adapter Pattern: Integraciones externas (reCAPTCHA, AWS)
- Mapper Pattern: Conversión de objetos (MapStruct)
- DTO Pattern: Transferencia de datos
- Single Responsibility: Cada clase tiene una única responsabilidad
- Open/Closed: Extensible sin modificar código existente
- Liskov Substitution: Interfaces bien definidas
- Interface Segregation: Interfaces específicas
- Dependency Inversion: Dependencias hacia abstracciones
# Construir JAR
mvn clean package -DskipTests
# Transferir a EC2
scp target/enterprise-api-1.0.0.jar ec2-user@your-ec2-ip:/home/ec2-user/
# Conectar y ejecutar
ssh ec2-user@your-ec2-ip
nohup java -jar enterprise-api-1.0.0.jar &eb init -p corretto-17 enterprise-api
eb create enterprise-api-env
eb deploydocker build -t enterprise-api .
docker tag enterprise-api:latest your-ecr-repo/enterprise-api:latest
docker push your-ecr-repo/enterprise-api:latestINSERT INTO roles (nombre, descripcion) VALUES
('ADMIN', 'Administrador con acceso completo'),
('EXTERNO', 'Usuario externo con acceso de solo lectura');-- Password: Admin123! (hasheado con BCrypt cost 12)
INSERT INTO usuarios (correo, password, rol_id, activo) VALUES
('admin@litethinking.com', '$2a$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewY5GyYKKMQzzzm6', 1, true);INSERT INTO monedas (codigo_iso, nombre, simbolo) VALUES
('COP', 'Peso Colombiano', '$'),
('USD', 'Dólar Estadounidense', '$'),
('EUR', 'Euro', '€');INSERT INTO estados_orden (nombre) VALUES
('PENDIENTE'),
('PAGADA'),
('ANULADA');Usuario Administrador:
- Correo:
admin@litethinking.com - Password:
Admin123!
Usuario Externo:
- Correo:
externo@litethinking.com - Password:
Externo123!
Los logs se almacenan en:
- Consola: Desarrollo
- Archivo:
logs/application.log(rotación diaria) - Base de datos:
excepciones_sistema(errores críticos)
MIT License