Skip to content

Proyecto final

El objetivo es construir una API Spring Boot de tienda online con productos, pedidos, seguridad, PostgreSQL, observabilidad, tests y despliegue.

Arquitectura

mermaid
flowchart LR
  C["Cliente"] --> API["Spring Boot API"]
  API --> DB["PostgreSQL"]
  API --> AUTH["JWT/OAuth2"]
  API --> MET["Actuator/Metrics"]
  CI["CI/CD"] --> API

Modulos funcionales

  • Productos.
  • Pedidos.
  • Usuarios/autenticacion.
  • Errores compartidos.
  • Observabilidad.

Endpoints

txt
GET    /api/products
GET    /api/products/{id}
POST   /api/products
PUT    /api/products/{id}
DELETE /api/products/{id}
POST   /api/orders
GET    /api/orders/{id}

Modelo base

sql
CREATE TABLE products (
  id BIGSERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  sku TEXT NOT NULL UNIQUE,
  price NUMERIC(12,2) NOT NULL CHECK (price >= 0),
  stock INT NOT NULL CHECK (stock >= 0)
);

CREATE TABLE orders (
  id BIGSERIAL PRIMARY KEY,
  status TEXT NOT NULL,
  created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

Caso de uso: crear pedido

txt
1. Validar request.
2. Comprobar productos.
3. Comprobar stock.
4. Crear pedido.
5. Descontar stock.
6. Confirmar transaccion.
7. Devolver respuesta.

Debe ejecutarse dentro de transaccion.

Tests minimos

  • Crear producto valido.
  • Rechazar producto con precio negativo.
  • Buscar producto inexistente devuelve 404.
  • Crear pedido descuenta stock.
  • Pedido sin stock devuelve conflicto.
  • Endpoint protegido exige autenticacion.
  • Repositorio funciona con PostgreSQL real mediante Testcontainers.

Observabilidad

Configurar:

txt
/actuator/health
/actuator/metrics
/actuator/prometheus

Logs con correlation id.

Docker Compose

yaml
services:
  api:
    build: .
    environment:
      SPRING_PROFILES_ACTIVE: prod
      SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/shop
      SPRING_DATASOURCE_USERNAME: shop
      SPRING_DATASOURCE_PASSWORD: shop
    ports:
      - "8080:8080"
    depends_on:
      - db

  db:
    image: postgres:16
    environment:
      POSTGRES_USER: shop
      POSTGRES_PASSWORD: shop
      POSTGRES_DB: shop
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

Entregable

La API final debe tener:

  • CRUD de productos.
  • Creacion de pedidos transaccional.
  • Validacion y errores consistentes.
  • Seguridad en endpoints de escritura.
  • Migraciones SQL.
  • Tests unitarios, web y de integracion.
  • Actuator y metricas.
  • Dockerfile y Compose.
  • Pipeline CI.