Informe técnico verificado · Hito 4

PortalTrip

Microservicio REST para cotizar y reservar viajes interdimensionales con Java 26, Spring Boot 4.1.1, PostgreSQL 17, Spring Data JPA, Docker Compose y contratos OpenAPI.

129 pruebas 100% instrucciones 100% ramas PostgreSQL real Swagger aislado por perfil

Resultado verificado

129 / 129

Pruebas Maven aprobadas, sin fallos, errores ni omisiones.

2390 / 2390

Instrucciones cubiertas por JaCoCo.

92 / 92

Ramas cubiertas por JaCoCo.

20 / 20

Aserciones Bruno aprobadas contra PostgreSQL real.

La revisión se hizo sobre el estado actual del repositorio. El comando final ./mvnw -B clean verify terminó con BUILD SUCCESS y cumplió los umbrales obligatorios de cobertura.

Arquitectura actual

Los controladores dependen de interfaces de servicio. Las implementaciones coordinan las reglas del dominio y acceden a repositorios Spring Data JPA. Las entidades de persistencia permanecen en infraestructura; los modelos del dominio no importan Spring ni Jakarta Persistence.

Solicitud HTTP
    │
    ▼
@RestController ──► interfaz Service ──► ServiceImpl
                                            │
                         ┌──────────────────┴──────────────────┐
                         ▼                                     ▼
                dominio puro                         JpaRepository
           invariantes y transiciones          entidades JPA + PostgreSQL
CapaResponsabilidadEvidencia
DominioModelos, cotización, validaciones y estados.Sin anotaciones JPA ni dependencias de framework.
AplicaciónInterfaces e implementaciones de casos de uso.Servicios de catálogo, cotización y reservas.
Infraestructura webControladores, DTOs, OpenAPI y manejo global de errores.Rutas versionadas bajo /api/v1.
Infraestructura JPAEntidades y cuatro repositorios Spring Data.JpaRepository<Entity, ID>.

Pilar 1 · API REST y errores semánticos

El servicio publica consultas de catálogo, cotización y ciclo de vida de reservas. Emplea GET para lectura, POST para creación/cotización y PATCH para transiciones.

OperaciónRutaResultado principal
Consultar catálogo/api/v1/locations, /characters, /episodes200 OK
Calcular cotizaciónPOST /api/v1/quotes200 OK
Crear reservaPOST /api/v1/reservations201 Created
Iniciar, completar o cancelarPATCH /api/v1/reservations/{id}/…200 OK o 409 Conflict

Perímetro de errores

Un @RestControllerAdvice centraliza los errores en un sobre uniforme con estado, mensaje, datos y marca de tiempo. La semántica comprobada es 400 para entrada HTTP inválida, 404 para recursos ausentes, 409 para transiciones de estado inválidas, 422 para reglas del dominio y 500 genérico para fallos inesperados.

También se corrigió una omisión: una lista de acompañantes ya no descarta silenciosamente IDs inexistentes. Cada ID solicitado debe resolverse o la creación termina en 404. Los errores 500 se registran en servidor, pero no filtran excepciones, trazas, rutas ni datos sensibles al cliente.

Pilar 2 · PostgreSQL, JPA y Docker

compose.yml levanta PostgreSQL 17 Alpine con volumen persistente, comprobación de salud y semillas SQL. La configuración acepta DB_NAME, DB_USER, DB_PASSWORD y DB_PORT, conservando valores locales por defecto.

126

ubicaciones persistidas

826

personajes persistidos

51

episodios persistidos

2

reservas reales tras las pruebas de humo

Las entidades LocationEntity, CharacterEntity, EpisodeEntity y ReservationEntity viven únicamente en infraestructura. Cuatro interfaces JPA resuelven el acceso CRUD y las consultas derivadas.

Pilar 3 · OpenAPI seguro por perfiles

Los controladores incluyen @Tag, @Operation y respuestas documentadas. Los once DTOs web incluyen descripciones, ejemplos, rangos y valores permitidos con @Schema o @ArraySchema. El contrato de desarrollo usa OpenAPI 3.0 para evitar una regresión de serialización de Springdoc 3.1.

PerfilSwagger UIOpenAPI JSONJPA
dev/swagger-ui.html habilitado/api-docs habilitadoddl-auto: update
testhabilitado para pruebas de contratohabilitado y verificadoH2 aislado
prod404404ddl-auto: validate

La prueba real del perfil productivo inició el servicio contra PostgreSQL, obtuvo 200 en /health y 404 en los dos endpoints de documentación.

Calidad, contratos y publicación

JaCoCo genera informes HTML y de consola durante test; verify bloquea el build si instrucciones o ramas bajan de 100%.

ContadorCubiertoResultado
Instrucciones2390 / 2390100%
Ramas92 / 92100%
Líneas500 / 500100%
Métodos157 / 157100%

GitHub Actions verifica pull requests y pushes a main, conserva artefactos Surefire y JaCoCo durante 14 días, y solo despliega Pages cuando el build de main finaliza correctamente.

Abrir el informe JaCoCo publicado · Abrir el repositorio

Colección Bruno

La colección versionada ejecuta ocho solicitudes secuenciales: salud, ubicaciones, cotización, creación, consulta, inicio, finalización y rechazo de cancelación de una reserva terminada. La ejecución real aprobó 8/8 solicitudes y 20/20 aserciones.

Ejecución local

# Base de datos persistente
docker compose up -d

# Aplicación en desarrollo
./mvnw spring-boot:run

# Pruebas, reporte y umbral de cobertura
./mvnw clean verify

# Contratos REST con Bruno
cd bruno
bru run --env-file environments/local.bru --bail

En desarrollo: Swagger UI en http://localhost:8080/swagger-ui.html, contrato JSON en http://localhost:8080/api-docs y salud en http://localhost:8080/health.