Quest‑Hub es una plataforma web que permite a los usuarios buscar videojuegos y comparar sus precios entre diferentes tiendas digitales.
La aplicación combina datos obtenidos en tiempo real desde APIs externas con la información almacenada en la base de datos para ofrecer resultados rápidos y actualizados.
Quest‑Hub recopila:
- Ofertas actuales mediante la API de CheapShark
- Información detallada de videojuegos desde Steam API
- Datos persistentes en PostgreSQL (videojuegos, géneros, tiendas, ofertas, etc...)
El objetivo es ayudar a los jugadores a encontrar el mejor precio disponible en cada momento.
- React
- Vite
- CSS
- JavaScript
- TypeScript
- Spring Boot
- Java
- PostgreSQL
-
CheapShark: https://apidocs.cheapshark.com/
Quest‑Hub almacena:
- Usuarios
- Videojuegos
- Bundles
- Géneros
- Tiendas
- Ofertas actuales
- Wishlist por usuario
- Relaciones entre las distintas entidades
- Ofertas asociadas a su Tienda correspondiente
- Videos/Imagenes asociados a cada juego
❗ El proyecto no almacena historial de precios ni genera gráficos de tendencias de momento. Solo guarda las ofertas actuales y las actualiza periódicamente.
Incluye tablas como:
usuariovideojuegoybundlegeneroygenero_videojuegotiendaofertawishlistywishlist_itemmoviecapturas
CheapShark API ───┐
Steam API ────────┤
↓
┌──> Backend (Spring Boot) ──> PostgreSQL
│ │
│ │
└────────────── React Frontend <────┘
Lógica del flujo:
- El frontend solicita datos al backend.
- El backend consulta la base de datos:
- Si los datos existen y están actualizados → se devuelven.
- Si no existen o están desactualizados → se consulta a las APIs externas.
- Los datos obtenidos se guardan/actualizan en la base de datos.
- El backend envía la respuesta al frontend.
- 🔍 Búsqueda de ofertas de videojuegos
- 💸 Comparación de precios entre tiendas digitales
- 📄 Información detallada de cada juego
- 🏷️ Ofertas actualizadas periódicamente (aprox. 8h)
- 👤 Registro y sesiones de usuarios
- ⭐ Wishlist por usuario
- 🎬 Trailers y vídeos asociados a cada juego
- 📮 Notificaciones de descuentos: En desarrollo
- 🎚️ Filtros avanzados (precio, tienda, género, valoración…)
Obtiene la información detallada de un videojuego o bundle con todas sus ofertas asociadas.
- Path Parameter:
id(long) — ID del videojuego o bundle (requerido)
Lista todas las tiendas digitales disponibles con sus logos e iconos.
- Ninguno
Retorna el precio más alto registrado entre todas las ofertas activas.
- Ninguno
Obtiene un listado paginado de ofertas con soporte para filtros avanzados y ordenamiento.
Paginación (Spring Data):
page(int, default: 0) — Número de página (0-indexed)size(int, default: 20) — Cantidad de items por páginasort(string) — Campo y dirección de ordenamiento. Ej:sort=precioOferta,descosort=ahorro,asc
Filtros (FiltrosOfertas):
titulo(string, opcional) — Nombre del juego a buscarminPrecio(double, opcional) — Precio mínimo en USDmaxPrecio(double, opcional) — Precio máximo en USDminAhorro(double, opcional) — Descuento mínimo en porcentajetiers(string[], opcional) — Géneros del juego. Ej:tiers=Action&tiers=RPGreviews(string[], opcional) — Filtro por rating. Ej:reviews=Overwhelmingly Positive&reviews=PositiveinicioOferta(LocalDateTime, opcional) — Fecha mínima de oferta. Formato:2026-05-16T10:00:00tiendaIds(long[], opcional) — IDs de tiendas. Ej:tiendaIds=1&tiendaIds=2
GET /api/ofertas?page=0&size=10&sort=precioOferta,asc&titulo=Counter&minPrecio=5.99&maxPrecio=29.99&tiers=Action&tiendaIds=1
Sincroniza un nuevo usuario en el sistema o actualiza su registro existente.
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"email": "usuario@gmail.com"
}Elimina la cuenta del usuario autenticado y todos sus datos asociados (wishlist, preferencias, etc).
Authorization(string, requerido) — Token JWT. Formato:Bearer eyJhbGc...
Obtiene el estado actual de preferencias de notificaciones del usuario.
- Query Parameter:
id(UUID, requerido) — ID del usuario
Actualiza las preferencias de notificaciones del usuario.
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"preferencia": true
}Alterna un videojuego o bundle entre la wishlist del usuario (añade si no existe, elimina si existe).
Authorization(string, requerido) — Token JWT. Formato:Bearer eyJhbGc...
Elimina un item específico de la wishlist del usuario autenticado.
Authorization(string, requerido) — Token JWT. Formato:Bearer eyJhbGc...
itemId(long, requerido) — ID del videojuego o bundle a eliminar
Obtiene la lista completa de videojuegos y bundles en la wishlist del usuario autenticado.
Authorization(string, requerido) — Token JWT. Formato:Bearer eyJhbGc...
Inicia manualmente la sincronización de ofertas desde CheapShark.
Inicia manualmente la sincronización de tiendas.
Inicia la sincronización total de toda la base de datos.
- Java 11+ para el backend
- Node.js 16+ y npm para el frontend
- PostgreSQL 12+ para la base de datos
- Git para clonar el repositorio
- Navega a la carpeta del backend:
cd Backend- Configura la conexión a PostgreSQL en
application.properties:
spring.datasource.url=jdbc:postgresql://localhost:5432/videogames_db
spring.datasource.username=tu_usuario
spring.datasource.password=tu_contraseña
spring.jpa.hibernate.ddl-auto=update- Compila e inicia la aplicación:
mvn spring-boot:runEl servidor estará disponible en http://localhost:8080
- Navega a la carpeta del frontend:
cd Front- Instala las dependencias:
npm install- Inicia el servidor de desarrollo:
npm run dev- Construye para producción:
npm run buildLa aplicación estará disponible en http://localhost:5173
A1ebyte - Freddy De Andrade Bernabeu
KerinR432 - Kerin Aguilera
MoBaSell - Mohamed Bada Sellami
Estado: En desarrollo 🔧
Última actualización: 2026-05-21
