API REST desarrollada en Spring Boot 3.5 (Java 17) para una tienda de ropa online. Gestiona productos, ventas, usuarios, categorías, colores, tallas, materiales, marcas, métodos de pago/envío e imágenes (con subida a Cloudinary).
- Java 17 + Spring Boot 3.5.8
- Spring Data JPA (Hibernate) para persistencia
- Spring Security para autenticación/autorización
- Spring Validation para validación de datos
- PostgreSQL en producción / H2 en memoria para desarrollo local
- Springdoc OpenAPI (Swagger UI) para documentación de la API
- Cloudinary para almacenamiento y gestión de imágenes
- Lombok para reducir boilerplate
- Maven como gestor de dependencias y build
- Docker (multi-stage build) y Docker Compose para contenedores
- GitHub Actions para CI/CD hacia AWS (ECR + EC2 self-hosted runner)
demo/src/main/java/Proyecto_EFA/
├── ProductosApplication.java # Clase principal Spring Boot
├── demo/
│ ├── config/ # CloudinaryConfig, CorsConfig, DataLoader, SecurityConfig, SwaggerConfig
│ ├── controller/ # Endpoints REST (Producto, Venta, Usuario, Categoria, Color, Marca,
│ │ # Material, Talla, Estado, MetodoPago, MetodoEnvio, Imagen, Rol,
│ │ # ProductoVenta)
│ ├── dto/ # ItemVentaRequest, VentaRequest
│ ├── model/ # Entidades JPA (Producto, Venta, Usuario, Categoria, Color, Marca,
│ │ # Material, Talla, Imagen, Direccion, Comuna, Region, etc.)
│ ├── repository/ # Repositorios Spring Data JPA
│ └── service/ # Lógica de negocio por entidad
└── resources/
└── application.properties
- Productos: catálogo con categoría, color, marca, material, talla e imágenes asociadas.
- Ventas: registro de ventas y sus ítems (
VentaController,ProductoVentaController). - Usuarios y roles: gestión de usuarios y roles (
UsuarioController,RolController). - Ubicación: modelos de Región, Comuna y Dirección para envíos.
- Métodos de pago y envío: catálogos configurables (
MetodoPagoController,MetodoEnvioController). - Imágenes: subida y gestión vía Cloudinary (
ImagenController,CloudinaryService).
La configuración vive en application.properties y usa variables de entorno con valores por defecto para desarrollo local:
| Variable | Descripción | Por defecto (local) |
|---|---|---|
PORT |
Puerto del servidor | 8080 |
SPRING_DATASOURCE_URL |
URL de la base de datos | H2 en memoria |
SPRING_DATASOURCE_USERNAME / PASSWORD |
Credenciales BD | sa / vacío |
CLOUDINARY_URL |
Credenciales de Cloudinary | vacío |
- Documentación interactiva disponible en
/doc/swagger-ui.html(Swagger UI habilitado). - Consola H2 deshabilitada por defecto (
spring.h2.console.enabled=false). - Seguridad básica configurada con usuario
admin(verapplication.properties).
- Java 17
- Maven (o usar el wrapper
mvnwincluido)
cd demo
./mvnw spring-boot:runLa API quedará disponible en http://localhost:8080, y Swagger en http://localhost:8080/doc/swagger-ui.html.
Desde la raíz del proyecto, definiendo las variables de entorno necesarias (POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD, CLOUDINARY_URL, y las de la imagen ECR_REGISTRY/ECR_REPOSITORY/IMAGE_TAG si se usa la imagen ya publicada):
docker compose up -ddocker build -t proyecto-efa-backend .
docker run -p 8080:8080 proyecto-efa-backendEl workflow .github/workflows/ci.yml automatiza la integración continua:
- Build & pruebas: compila el proyecto (Maven) y ejecuta las pruebas automáticas para validar la calidad del código.
Se dispara en cada push a develop y en cada pull request hacia main.
Además, el workflow .github/workflows/deploy.yml permite el despliegue manual:
- Build & push: compila la imagen Docker y la publica en Amazon ECR.
- Deploy: en un runner self-hosted en EC2, hace pull de la nueva imagen y levanta el stack (
backend+db) con Docker Compose, limpiando imágenes antiguas.
Se ejecuta manualmente vía workflow_dispatch (botón "Run workflow"), y requiere las credenciales AWS configuradas como secretos en el repositorio.
El archivo MODELS.md contiene el detalle del modelo de datos del proyecto.
Este proyecto se gestiona siguiendo una estrategia de ramificación GitFlow, con el fin de asegurar la trazabilidad del código, la colaboración entre integrantes y la estabilidad de la rama de producción.
Elegimos GitFlow por sobre trunk-based development por las siguientes razones:
- El encargo exige explícitamente las ramas
main,develop,feature/*yhotfix/*, que es el modelo natural de GitFlow. - El proyecto se desarrolla en parejas y se integrará con lanzamientos de versiones planificados (releases) a lo largo del semestre, ideal para un producto tipo e-commerce.
- Las ramas de larga duración (
mainydevelop) separan claramente lo estable de lo que está en desarrollo. - Las ramas efímeras (
feature/*yhotfix/*) aíslan el trabajo y permiten la revisión mediante Pull Requests antes de integrar. - La rama
hotfix/*permite corregir problemas en producción sin esperar al siguiente release.
| Rama | Descripción |
|---|---|
main |
Rama de producción. Siempre estable. Solo recibe merges desde develop y hotfix/*. |
develop |
Rama de integración. Centraliza los features desarrollados. |
feature/<nombre> |
Nueva funcionalidad. Nace de develop y se integra vía Pull Request. |
hotfix/<nombre> |
Corrección de emergencia. Nace de main y se mezcla a main y de vuelta a develop. |
- Se usan minúsculas y guiones (
-) como separadores:feature/mejora-catalogo,hotfix/correccion-ventas. - Las
feature/*deben salir desdedevelopy referirse a una funcionalidad concreta, en inglés o español según el caso.
Seguimos una convención basada en Conventional Commits:
<tipo>(<ámbito>): <descripción>
Ejemplos:
feat(catalogo): agregar filtro por tallafix(ventas): corregir cálculo de totalesdocs(readme): documentar convenciones de ramasstyle(usuario): ordenar importsrefactor(pago): simplificar lógica del checkouttest(venta): agregar pruebas del serviciochore(deps): actualizar dependencias
Tipos usados: feat, fix, docs, style, refactor, test, chore.
- Los cambios de funcionalidad se integran a
developmediante Pull Requests. - Se utilizan merge de
--no-ff(con commit de merge) para conservar la trazabilidad del historial. - Una vez
developestá estable, se fusiona amain(release). - Las correcciones
hotfix/*se fusionan amainy se propagan también adevelop.
- Toda integración a
developy amainrequiere al menos una aprobación de un integrante del equipo. - Antes de aprobar se verifica el resultado del pipeline de CI (GitHub Actions) y el diff de la Pull Request.
- Las discusiones y resoluciones de conflictos se realizan dentro de los comentarios del Pull Request.
- Se evita el push directo a
mainydevelop; los cambios entran exclusivamente por Pull Request.
ci.yml: se ejecuta en cadapushadevelopy en cadapull_requesthaciamain. Realiza el build y las pruebas automáticas para validar la integración.deploy.yml: despliegue manual hacia Amazon ECR y EC2 (runner self-hosted) víaworkflow_dispatch(requiere credenciales AWS en los secretos del repositorio).
Los detalles de build, push y despliegue se encuentran en las secciones anteriores de este documento.
En este proyecto se utilizó IA como apoyo para mejorar la redacción de esta documentación y generar diagramas de apoyo. Todo el contenido técnico generado fue revisado y validado por el equipo. Las reflexiones y justificaciones técnicas son de autoría propia de los integrantes.