- Java 21
- Maven 3.9+
mvn clean install
mvn spring-boot:runProbar con curl (todas las respuestas usan ApiResponse):
# GET all (200)
curl -s http://localhost:8080/api/v1/blueprints | jq
# GET autor existente (200)
curl -s http://localhost:8080/api/v1/blueprints/john | jq
# GET autor inexistente (404)
curl -i http://localhost:8080/api/v1/blueprints/unknown | jq
# GET blueprint inexistente por autor/nombre (404)
curl -i http://localhost:8080/api/v1/blueprints/john/unknown | jq
# POST crear (201)
curl -i -X POST http://localhost:8080/api/v1/blueprints \
-H 'Content-Type: application/json' \
-d '{ "author":"john","name":"kitchen","points":[{"x":1,"y":1},{"x":2,"y":2}] }'
# POST duplicado (409)
curl -i -X POST http://localhost:8080/api/v1/blueprints \
-H 'Content-Type: application/json' \
-d '{ "author":"john","name":"kitchen","points":[{"x":1,"y":1}]}'
# PUT agregar punto (202)
curl -i -X PUT http://localhost:8080/api/v1/blueprints/john/kitchen/points \
-H 'Content-Type: application/json' \
-d '{ "x":3,"y":3 }'Si deseas activar filtros de puntos (reducción de redundancia, undersampling, etc.), implementa nuevas clases que implementen
BlueprintsFiltery cámbialas porIdentityFiltercon@Primaryo usando configuración de Spring.
Abrir en navegador:
- Swagger UI: http://localhost:8080/swagger-ui.html
- OpenAPI JSON: http://localhost:8080/v3/api-docs
src/main/java/edu/eci/arsw/blueprints
├── model/ # Entidades de dominio: Blueprint, Point
├── persistence/ # Interfaz + repositorios (InMemory, Postgres)
│ └── impl/ # Implementaciones concretas
├── services/ # Lógica de negocio y orquestación
├── filters/ # Filtros de procesamiento (Identity, Redundancy, Undersampling)
├── controllers/ # REST Controllers (BlueprintsAPIController)
└── config/ # Configuración (Swagger/OpenAPI, etc.)
Esta separación sigue el patrón capas lógicas (modelo, persistencia, servicios, controladores), facilitando la extensión hacia nuevas tecnologías o fuentes de datos.
- Revisa el paquete
modelcon las clasesBlueprintyPoint. - Entiende la capa
persistenceconInMemoryBlueprintPersistence. - Analiza la capa
services(BlueprintsServices) y el controladorBlueprintsAPIController.
docker-compose.yml - Define el servicio PostgreSQL:
services:
postgres:
image: postgres:16
container_name: blueprints-postgres
environment:
POSTGRES_DB: blueprintsdb
POSTGRES_USER: blueprintuser
POSTGRES_PASSWORD: blueprintpass
ports:
- "5432:5432"
volumes:
- postgres-data:/var/lib/postgresql/data
- ./init-db.sql:/docker-entrypoint-initdb.d/init.sql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U blueprintuser -d blueprintsdb"]
interval: 10s
timeout: 5s
retries: 5
volumes:
postgres-data:init-db.sql - Script de inicialización:
- Crea tabla
blueprints(id, author, name) - Crea tabla
points(id, blueprint_id, x, y, point_order) - Inserta 4 blueprints de prueba con sus puntos
- Se ejecuta solo la primera vez.
application.properties - Configuración Spring Boot:
# PostgreSQL
spring.datasource.url=jdbc:postgresql://localhost:5432/blueprintsdb
spring.datasource.username=blueprintuser
spring.datasource.password=blueprintpass
# JPA/Hibernate
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
# Docker Compose automático
spring.docker.compose.enabled=true
spring.docker.compose.lifecycle-management=start_and_stoppom.xml - Dependencias necesarias:
<!-- PostgreSQL Driver -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<!-- Spring Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- Docker Compose Support -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-docker-compose</artifactId>
<optional>true</optional>
</dependency>Cuando ejecutas mvn spring-boot:run, Spring Boot automáticamente:
- Detecta
docker-compose.ymlen la raíz del proyecto - Levanta PostgreSQL con
docker compose up - Espera a que esté listo
- Ejecuta
init-db.sql(solo la primera vez) - Conecta la aplicación a la base de datos
- Detiene PostgreSQL al cerrar la aplicación
# Consultar blueprints
docker exec blueprints-postgres psql -U blueprintuser -d blueprintsdb -c "SELECT * FROM blueprints;"
# Consultar puntos
docker exec blueprints-postgres psql -U blueprintuser -d blueprintsdb -c "SELECT * FROM points;"
# Contar puntos totales
docker exec blueprints-postgres psql -U blueprintuser -d blueprintsdb -c "SELECT COUNT(*) FROM points;"- Cambia el path base de los controladores a
/api/v1/blueprints. - Usa códigos HTTP correctos:
200 OK(consultas exitosas).201 Created(creación).202 Accepted(actualizaciones).400 Bad Request(datos inválidos).404 Not Found(recurso inexistente).
- Implementa una clase genérica de respuesta uniforme:
Ejemplo JSON:
public record ApiResponse<T>(int code, String message, T data) {}
{ "code": 200, "message": "execute ok", "data": { "author": "john", "name": "house", "points": [...] } }
- Configura
springdoc-openapien el proyecto. - Expón documentación automática en
/swagger-ui.html. - Anota endpoints con
@Operationy@ApiResponse.
- Implementa filtros:
- RedundancyFilter: elimina puntos duplicados consecutivos.
- UndersamplingFilter: conserva 1 de cada 2 puntos.
- Activa los filtros mediante perfiles de Spring (
redundancy,undersampling).
-
Repositorio en GitHub con:
- Código fuente actualizado.
- Configuración PostgreSQL (
application.ymlo script SQL). - Swagger/OpenAPI habilitado.
- Clase
ApiResponse<T>implementada.
-
Documentación:
- Informe de laboratorio con instrucciones claras.
- Evidencia de consultas en Swagger UI y evidencia de mensajes en la base de datos.
- Breve explicación de buenas prácticas aplicadas.
| Criterio | Peso |
|---|---|
| Diseño de API (versionamiento, DTOs, ApiResponse) | 25% |
| Migración a PostgreSQL (repositorio y persistencia correcta) | 25% |
| Uso correcto de códigos HTTP y control de errores | 20% |
| Documentación con OpenAPI/Swagger + README | 15% |
| Pruebas básicas (unitarias o de integración) | 15% |
Bonus:
- Imagen de contenedor (
spring-boot:build-image). - Métricas con Actuator.



