diff --git a/gatewayservice/gateway-service.js b/gatewayservice/gateway-service.js index f876606..4cbbf76 100644 --- a/gatewayservice/gateway-service.js +++ b/gatewayservice/gateway-service.js @@ -63,6 +63,41 @@ app.get('/updateCorrectAnswers', async (req, res) => { } }); +app.get('/updateIncorrectAnswers', async (req, res) => { + console.log(req.query) + const { username } = req.query; + try{ + const updateStatsResponse = await axios.get(userServiceUrl+ `/updateIncorrectAnswers?username=${username}`) + res.json(updateStatsResponse.data); + }catch(error){ + res.status(error.response.status).json({error: error.response.data.error}); + } +}); + +app.get('/updateCompletedGames', async (req, res) => { + console.log(req.query) + const { username } = req.query; + try{ + const updateStatsResponse = await axios.get(userServiceUrl+ `/updateCompletedGames?username=${username}`) + res.json(updateStatsResponse.data); + }catch(error){ + res.status(error.response.status).json({error: error.response.data.error}); + } +}); + + + +app.get('/getUserData', async (req, res) => { + console.log(req.query) + const { username } = req.query; + try{ + const getUserDataResponse = await axios.get(userServiceUrl+ `/getUserData?username=${username}`) + res.json(getUserDataResponse.data); + }catch(error){ + res.status(error.response.status).json({error: error.response.data.error}); + } +}); + // Start the gateway service const server = app.listen(port, () => { console.log(`Gateway Service listening at http://localhost:${port}`); diff --git a/userservice/authservice/auth-model.js b/userservice/authservice/auth-model.js index 7763b51..f8bd07e 100644 --- a/userservice/authservice/auth-model.js +++ b/userservice/authservice/auth-model.js @@ -4,6 +4,10 @@ const userSchema = new mongoose.Schema({ username: String, password: String, createdAt: Date, + correctAnswers:Number, + incorrectAnswers: Number, + completedGames: Number, + averageTime: Number }); const User = mongoose.model('User', userSchema); diff --git a/userservice/userservice/user-service.js b/userservice/userservice/user-service.js index 74747f1..3172ff1 100644 --- a/userservice/userservice/user-service.js +++ b/userservice/userservice/user-service.js @@ -63,10 +63,62 @@ app.get('/updateCorrectAnswers', async (req,res) => { } }) +app.get('/updateIncorrectAnswers', async (req,res) => { + console.log(req.query) + const { username } = req.query; + try { + const user = await User.findOne({ username }); + if (!user) { + return res.status(404).json({ success: false, message: 'Usuario no encontrado' }); + } + // Incrementa las respuestas incorrectas del usuario + user.incorrectAnswers += 1; + await user.save(); + return res.status(200).json({ success: true, message: 'Respuesta incorrecta actualizada con éxito' }); + } catch (error) { + console.error('Error al actualizar la respuesta correcta:', error); + return res.status(500).json({ success: false, message: 'Error al actualizar la respuesta incorrecta' }); + } +}) + + +app.get('/updateCompletedGames', async (req,res) => { + console.log(req.query) + const { username } = req.query; + try { + const user = await User.findOne({ username }); + if (!user) { + return res.status(404).json({ success: false, message: 'Usuario no encontrado' }); + } + user.completedGames += 1; + await user.save(); + return res.status(200).json({ success: true, message: 'Juegos completados actualizado con éxito' }); + } catch (error) { + console.error('Error al actualizar Juegos completados:', error); + return res.status(500).json({ success: false, message: 'Error al actualizar Juegos completados' }); + } +}) + + + const server = app.listen(port, () => { console.log(`User Service listening at http://localhost:${port}`); }); +app.get('/getUserData', async (req, res) => { + const { username } = req.query; + try { + const user = await User.findOne({ username }); + if (!user) { + return res.status(404).json({ success: false, message: 'Usuario no encontrado' }); + } + return res.status(200).json({ user }); + } catch (error) { + console.error('Error al obtener los datos de usuario:', error); + return res.status(500).json({ success: false, message: 'Error al obtener los datos de usuario' }); + } +}); + // Listen for the 'close' event on the Express.js server server.on('close', () => { // Close the Mongoose connection diff --git a/webapp/src/App.js b/webapp/src/App.js index 6ff208f..a5c5132 100644 --- a/webapp/src/App.js +++ b/webapp/src/App.js @@ -41,7 +41,6 @@ function App() { return ( <> - diff --git a/webapp/src/components/Estilos/juego.css b/webapp/src/components/Estilos/juego.css index a37a20d..65696de 100644 --- a/webapp/src/components/Estilos/juego.css +++ b/webapp/src/components/Estilos/juego.css @@ -9,6 +9,15 @@ text-align: center; } +.numPregunta { + position: fixed; + top:75px; + left: 25px; /*Colocar en la izq de la pantalla*/ + color: #fff; /* Color de texto */ + font-size: 38px; /*Tamaño numero*/ + font-weight: bold; /*Poner en negrita*/ +} + .temporizador { position: fixed; top:75px; diff --git a/webapp/src/components/Pages/Estadisticas.js b/webapp/src/components/Pages/Estadisticas.js index d6da9c9..1d085c4 100644 --- a/webapp/src/components/Pages/Estadisticas.js +++ b/webapp/src/components/Pages/Estadisticas.js @@ -1,11 +1,11 @@ // src/components/Login.js -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; import { Container, Typography, TextField, Button, Snackbar } from '@mui/material'; import '../Estilos/estadisticas.css'; import axios from 'axios'; -const Juego = ({isLogged}) => { +const Estadisticas = ({isLogged}) => { const apiEndpoint = process.env.REACT_APP_API_ENDPOINT || 'http://localhost:8000'; const [username, setUsername] = useState(''); @@ -15,19 +15,28 @@ const Juego = ({isLogged}) => { const [incorrectAnswers, setIncorrectAnswers] = useState(0); const [completedGames, setCompletedGames] = useState(0); const [averageTime, setAverageTime] = useState(0); + const [firstRender, setFirstRender] = useState(false); - const statsUser = async () => { - try { - const response = await axios.post(`${apiEndpoint}/login`, { username, password }); - const datos = response.data; - setCorrectAnswers(datos.correctAnswers); - setIncorrectAnswers(datos.incorrectAnswers); - setCompletedGames(datos.completedGames); - setAverageTime(datos.averageTime); - } catch (error) { - setError(error.response.data.error); - } - }; + useEffect(() => { + if (!firstRender) { + statsUser(); + setFirstRender(true); + } + }, [firstRender]) + + + async function statsUser(){ + try { + const response = await axios.get(`${apiEndpoint}/getUserData?username=${username}`); + const datos = response.data; + setCorrectAnswers(datos.correctAnswers); + setIncorrectAnswers(datos.incorrectAnswers); + setCompletedGames(datos.completedGames); + setAverageTime(datos.averageTime); + } catch (error) { + setError(error.response.data.error); + } + }; return ( @@ -57,4 +66,4 @@ const Juego = ({isLogged}) => { ); }; -export default Juego; +export default Estadisticas; diff --git a/webapp/src/components/Pages/Juego.js b/webapp/src/components/Pages/Juego.js index 60c7116..c936dc9 100644 --- a/webapp/src/components/Pages/Juego.js +++ b/webapp/src/components/Pages/Juego.js @@ -19,6 +19,7 @@ const Juego = ({isLogged, username, numPreguntas}) => { const [victoria, setVictoria] = useState(false) //Para saber si el temporizador se ha parado al haber respondido una respuesta const [pausarTemporizador, setPausarTemporizador] = useState(false) + const [restartTemporizador, setRestartTemporizador] = useState(false) const [firstRender, setFirstRender] = useState(false); @@ -28,7 +29,6 @@ const Juego = ({isLogged, username, numPreguntas}) => { const [arPreg, setArPreg] = useState([]) - //Variables para la obtencion y modificacion de estadisticas del usuario const apiEndpoint = process.env.REACT_APP_API_ENDPOINT || 'http://localhost:8000'; @@ -44,6 +44,7 @@ const Juego = ({isLogged, username, numPreguntas}) => { //Control de las estadísticas const updateCorrectAnswers = async () => { try { + const username = localStorage.getItem('username'); const response = await axios.get(`${apiEndpoint}/updateCorrectAnswers?username=${username}`); console.log('Respuesta correcta actualizada con éxito:', response.data); // Realizar otras acciones según sea necesario @@ -52,6 +53,24 @@ const Juego = ({isLogged, username, numPreguntas}) => { // Manejar el error de acuerdo a tus necesidades } }; + + const updateIncorrectAnswers = async () => { + try { + const response = await axios.get(`${apiEndpoint}/updateIncorrectAnswers?username=${username}`); + console.log('Respuesta incorrecta actualizada con éxito:', response.data); + } catch (error) { + console.error('Error al actualizar la respuesta incorrecta:', error); + } + }; + + const updateCompletedGames = async () => { + try { + const response = await axios.get(`${apiEndpoint}/updateCompletedGames?username=${username}`); + console.log('Juegos completados actualizado con éxito:', response.data); + } catch (error) { + console.error('Error al actualizar Juegos completados:', error); + } + }; //// //Función que genera un numero de preguntas determinado @@ -88,6 +107,8 @@ const Juego = ({isLogged, username, numPreguntas}) => { setPregunta(arPreg[numPreguntaActual].pregunta) setResCorr(arPreg[numPreguntaActual].resCorr) setResFalse(arPreg[numPreguntaActual].resFalse) + //Poner temporizador a 20 de nuevo + setRestartTemporizador(false); } @@ -106,6 +127,7 @@ const Juego = ({isLogged, username, numPreguntas}) => { setVictoria(true) } else{ + updateIncorrectAnswers(); setVictoria(false) } //storeResult(victoria) @@ -181,6 +203,7 @@ const Juego = ({isLogged, username, numPreguntas}) => { //Función que finaliza la partida (redirigir/mostrar stats...) function finishGame(){ + updateCompletedGames(); //TODO } @@ -196,13 +219,20 @@ const Juego = ({isLogged, username, numPreguntas}) => { setNumPreguntaActual(numPreguntaActual+1) console.log(numPreguntaActual) updateGame(); - + //Recargar a 20 el temporizador + setRestartTemporizador(true); + setPausarTemporizador(false); } + const handleRestart = () => { + setRestartTemporizador(false); // Cambia el estado de restart a false, se llama aqui desde Temporizador.js + }; + return ( - +

{numPreguntaActual} / {numPreguntas}

+

{pregunta}

diff --git a/webapp/src/components/Temporizador.js b/webapp/src/components/Temporizador.js index 26eb9fb..a3e4866 100644 --- a/webapp/src/components/Temporizador.js +++ b/webapp/src/components/Temporizador.js @@ -1,13 +1,17 @@ import React, { useState, useEffect } from 'react'; -const Temporizador =({tiempoInicial, tiempoAcabado, pausa})=> { +const Temporizador =({restart, tiempoInicial, tiempoAcabado, pausa, handleRestart})=> { //Constante que va restando segundos const [tiempoSegundos, setTiempoSegundos] = useState(tiempoInicial); - useEffect(() => { let intervalID; + if(restart){ + setTiempoSegundos(tiempoInicial); + pausa=false; + handleRestart(); + } if (tiempoSegundos > 0 && !pausa) { intervalID = setInterval(() => {