REST API para una tienda en línea de hongos medicinales construida con Spring Boot siguiendo arquitectura hexagonal (Ports & Adapters). Incluye integración con Stripe para pagos en línea.
- Java 17
- Spring Boot 4.0.5 (Spring 6 / Jakarta EE)
- Spring Security + JWT
- Spring Data JPA + PostgreSQL
- Stripe Java SDK 26.3.0
- Spring Boot Actuator
- Lombok
- JUnit 5
- Java 17+
- PostgreSQL corriendo en
localhost:5432 - Base de datos
setas_dbcreada - Cuenta de Stripe (claves de API)
Edita src/main/resources/application.properties con tus credenciales:
spring.datasource.url=jdbc:postgresql://localhost:5432/setas_db
spring.datasource.username=postgres
spring.datasource.password=tu_password
stripe.secret.key=sk_test_...
stripe.webhook.secret=whsec_...El esquema se gestiona automáticamente con
ddl-auto=update.
# Levantar la aplicación
./mvnw spring-boot:run
# Compilar y empaquetar (sin tests)
./mvnw clean package -DskipTests
# Ejecutar tests
./mvnw testLa API queda disponible en http://localhost:8080.
| Método | Ruta | Descripción |
|---|---|---|
| POST | /api/auth/register |
Registrar usuario → retorna JWT |
| POST | /api/auth/login |
Iniciar sesión → retorna JWT |
| GET | /api/auth/{email} |
Buscar usuario por email |
| DELETE | /api/auth/{id} |
Eliminar usuario |
| Método | Ruta | Rol | Descripción |
|---|---|---|---|
| POST | /api/products |
ADMIN | Crear producto |
| GET | /api/products |
— | Listar todos los productos |
| GET | /api/products/active |
— | Listar productos activos |
| GET | /api/products/{id} |
— | Obtener producto por id |
| DELETE | /api/products/{id} |
ADMIN | Eliminar producto (soft delete) |
| PATCH | /api/products/{id}/stock |
ADMIN | Actualizar stock — body: {"stock": N} |
| Método | Ruta | Rol | Descripción |
|---|---|---|---|
| POST | /api/orders |
CLIENT | Crear orden |
| GET | /api/orders |
ADMIN | Listar todas las órdenes |
| GET | /api/orders/{id} |
CLIENT / ADMIN | Obtener orden por id |
| GET | /api/orders/user |
CLIENT | Listar órdenes del usuario autenticado (email del JWT) |
| PUT | /api/orders/{orderId}/status |
ADMIN | Actualizar estado (?status=PENDING|PAID|CANCELLED) |
| Método | Ruta | Rol | Descripción |
|---|---|---|---|
| POST | /api/payments/{orderId} |
CLIENT | Crear PaymentIntent de Stripe para la orden |
Respuesta:
{
"clientSecret": "pi_xxx_secret_xxx",
"orderId": 1
}| Método | Ruta | Descripción |
|---|---|---|
| POST | /api/webhooks/stripe |
Recibir eventos de Stripe (público, validado por firma) |
Eventos manejados:
payment_intent.succeeded→ actualiza la orden aPAIDy reduce el stock de los productos.
- El cliente crea una orden (
POST /api/orders). - El cliente solicita un PaymentIntent (
POST /api/payments/{orderId}) → recibe unclientSecret. - El frontend completa el pago con Stripe usando el
clientSecret. - Stripe notifica al backend vía webhook → la orden pasa a
PAIDy se descuenta el stock.
El registro y login devuelven un token JWT. Inclúyelo en las peticiones protegidas:
Authorization: Bearer <token>
Los roles disponibles son ADMIN y CLIENT.
El proyecto implementa Clean Architecture con Ports & Adapters (Hexagonal). Ambos patrones son complementarios: Clean Architecture define las capas y la regla de dependencias (siempre hacia adentro), mientras que Hexagonal define cómo esas capas se comunican con el exterior a través de puertos y adaptadores.
domain/ ← Entidades y contratos (Clean Architecture: Entity layer)
model/ ← Entidades: Product, User, Order, OrderItem
port/in/ ← Puertos de entrada: interfaces de casos de uso (Hexagonal)
port/out/ ← Puertos de salida: interfaces de repositorios (Hexagonal)
application/ ← Lógica de aplicación (Clean Architecture: Use Case layer)
usecase/ ← Implementación de los casos de uso
infrastructure/ ← Adaptadores (Hexagonal) / Frameworks & Drivers (Clean Architecture)
persistence/ ← Adaptadores JPA (implementan los puertos de salida)
web/ ← Controllers REST (adaptadores de entrada)
web/dto/ ← DTOs de respuesta
config/ ← SecurityConfig, JwtService, JwtAuthFilter, StripeService