Este backend forma parte del proyecto TuWebYa, una aplicación real desarrollada para gestionar clientes, formularios y proyectos dentro de un flujo profesional de creación de páginas web.
La API está construida con Spring WebFlux y sigue una arquitectura hexagonal (ports & adapters).
Incluye un sistema completo de autenticación y autorización con JWT, gestión de usuarios, formularios de negocio y proyectos asignados.
El objetivo principal es ofrecer una API segura, escalable y reactiva que sirva como base para el frontend del proyecto.
👉 Backend Repository:
https://github.com/Viid21/S5_02_WebHostingProject.git
👉 Frontend Repository (conectado a esta API):
https://github.com/Viid21/S5_02_WebHostingProject_frontend.git
Frontend (React) → Backend API (Spring WebFlux) → MongoDB → Docker → Local Production
- 🔐 Autenticación JWT (access + refresh tokens)
- 🧩 Arquitectura Hexagonal (domain → application → infra)
- ⚡ Spring WebFlux (reactivo)
- 🗄️ MongoDB como base de datos
- 🧱 Control de roles (USER, ADMIN, SUPERADMIN)
- 📄 Gestión de formularios
- 📁 Gestión de proyectos asignados al usuario
- 👤 Gestión completa de usuarios
La API implementa un sistema de seguridad basado en:
- JWT Access Token → usado para autenticar cada request
- JWT Refresh Token → permite obtener un nuevo access token
- JwtAuthenticationFilter → intercepta cada request y valida el token
- SecurityContextService → obtiene el usuario autenticado en cada endpoint
Flujo básico:
1. Usuario se registra o inicia sesión
2. API devuelve accessToken + refreshToken
3. El frontend guarda ambos tokens
4. Cada request protegida incluye Authorization: Bearer <token>
5. Si expira, se llama a /auth/refresh
A continuación tienes TODOS los endpoints reales basados en tus controllers.
Registra un usuario y devuelve tokens JWT.
Devuelve accessToken + refreshToken.
Envía un email para recuperar contraseña.
Genera un nuevo access token usando el refresh token.
Valida si el token actual es válido.
Envía un formulario público.
Comprueba si existe un formulario asociado a un email.
Comprueba si el usuario autenticado ya tiene formulario.
Crea un formulario para el usuario autenticado.
Actualiza el formulario del usuario autenticado.
Asigna un administrador a un formulario (solo roles altos).
Obtiene el formulario del usuario autenticado.
Devuelve el proyecto asignado al usuario autenticado.
Crea un usuario (solo roles altos).
Devuelve los datos del usuario autenticado.
Devuelve todos los usuarios (según rol).
Devuelve un usuario por ID.
Actualiza datos del usuario.
Actualiza la contraseña del usuario.
Elimina un usuario.
Cambia el rol de un usuario (solo superadmin).
Este proyecto se ejecuta completamente mediante Docker usando un docker-compose.yml que levanta:
- PostgreSQL 16 → Base de datos de usuarios
- MongoDB 7 → Formularios y proyectos
- Backend Spring WebFlux → API principal
A continuación tienes la guía exacta basada en tu configuración real.
Desde la raíz del backend:
docker compose up -dEsto levantará automáticamente:
| Servicio | Contenedor | Puerto | Descripción |
|---|---|---|---|
| PostgreSQL | tuwebya-users-db |
5432 | Base de datos de usuarios |
| MongoDB | tuwebya-mongodb |
27017 | Base de datos de formularios y proyectos |
| Backend | tuwebya-backend |
8080 | API Spring WebFlux |
Tu docker-compose.yml define exactamente esto:
db:
image: postgres:16
container_name: tuwebya-users-db
environment:
POSTGRES_USER: vid
POSTGRES_PASSWORD: Estegosaurio9000
POSTGRES_DB: tuwebya-users
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- tuwebya-netmongodb:
image: mongo:7
container_name: tuwebya-mongodb
ports:
- "27017:27017"
volumes:
- mongodb_data:/data/db
networks:
- tuwebya-netbackend:
build: .
container_name: tuwebya-backend
depends_on:
- db
- mongodb
environment:
SPRING_R2DBC_URL: r2dbc:postgresql://db:5432/tuwebya-users
SPRING_R2DBC_USERNAME: vid
SPRING_R2DBC_PASSWORD: Estegosaurio9000
SPRING_DATA_MONGODB_URI: mongodb://mongodb:27017/tuwebya
SECURITY_JWT_SECRET: "aP9xL2mS8vQ4tZ7rC6bN1kH3yW5uE0fG"
ports:
- "8080:8080"
networks:
- tuwebya-netEstas son las variables que tu backend necesita para funcionar:
| Variable | Descripción |
|---|---|
SPRING_R2DBC_URL |
Conexión reactiva a PostgreSQL |
SPRING_R2DBC_USERNAME |
Usuario de PostgreSQL |
SPRING_R2DBC_PASSWORD |
Contraseña de PostgreSQL |
SPRING_DATA_MONGODB_URI |
Conexión a MongoDB |
SECURITY_JWT_SECRET |
Clave secreta para firmar JWT |
Ejemplo real (el que ya usas):
SPRING_R2DBC_URL=r2dbc:postgresql://db:5432/tuwebya-users
SPRING_R2DBC_USERNAME=vid
SPRING_R2DBC_PASSWORD=Estegosaurio9000
SPRING_DATA_MONGODB_URI=mongodb://mongodb:27017/tuwebya
SECURITY_JWT_SECRET=aP9xL2mS8vQ4tZ7rC6bN1kH3yW5uE0fGSi tu Dockerfile es el típico de Spring Boot, debería verse así:
FROM eclipse-temurin:21-jdk
WORKDIR /app
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"](Si tu Dockerfile real es distinto, me lo pasas y lo ajusto.)
Si quieres arrancarlo sin contenedores:
./mvnw spring-boot:runAsegúrate de tener MongoDB y PostgreSQL levantados.
El frontend se conecta a:
http://localhost:8080
En tu .env del frontend:
VITE_API_URL=http://localhost:8080Puedes probar la API con:
- Postman
- Thunder Client
- cURL
Ejemplo:
curl -X GET http://localhost:8080/auth/validate \
-H "Authorization: Bearer <token>"Solución: llamar a /auth/refresh.
Configurar CorsGlobalConfig.java.
Verificar que el contenedor está levantado:
docker psEl frontend se conecta a esta API mediante:
VITE_API_URL=http://localhost:8080
Repositorio del frontend:
👉 https://github.com/Viid21/S5_02_WebHostingProject_frontend.git
Este backend implementa:
- Seguridad JWT
- Arquitectura hexagonal
- Endpoints reactivos con WebFlux
- Gestión de usuarios, formularios y proyectos
- Integración con MongoDB
- Ejecución mediante Docker
Una base sólida y profesional para el proyecto TuWebYa.