From 9633e93cfe8b0fef1eee21de2eaab9ee7b07a4d8 Mon Sep 17 00:00:00 2001 From: Lara Date: Fri, 29 Mar 2024 15:12:40 +0100 Subject: [PATCH 1/5] update incorrect answer en bbdd --- gatewayservice/gateway-service.js | 11 +++++++++++ userservice/userservice/user-service.js | 17 +++++++++++++++++ webapp/src/components/Pages/Juego.js | 11 +++++++++++ 3 files changed, 39 insertions(+) diff --git a/gatewayservice/gateway-service.js b/gatewayservice/gateway-service.js index f876606..e880564 100644 --- a/gatewayservice/gateway-service.js +++ b/gatewayservice/gateway-service.js @@ -63,6 +63,17 @@ 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}); + } +}); + // Start the gateway service const server = app.listen(port, () => { console.log(`Gateway Service listening at http://localhost:${port}`); diff --git a/userservice/userservice/user-service.js b/userservice/userservice/user-service.js index 74747f1..75bbe2e 100644 --- a/userservice/userservice/user-service.js +++ b/userservice/userservice/user-service.js @@ -63,6 +63,23 @@ 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 correctas 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' }); + } +}) const server = app.listen(port, () => { console.log(`User Service listening at http://localhost:${port}`); }); diff --git a/webapp/src/components/Pages/Juego.js b/webapp/src/components/Pages/Juego.js index e22cab3..cdea132 100644 --- a/webapp/src/components/Pages/Juego.js +++ b/webapp/src/components/Pages/Juego.js @@ -36,6 +36,16 @@ const Juego = ({isLogged, username}) => { // 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); + // Realizar otras acciones según sea necesario + } catch (error) { + console.error('Error al actualizar la respuesta incorrecta:', error); + // Manejar el error de acuerdo a tus necesidades + } + }; //// @@ -71,6 +81,7 @@ const Juego = ({isLogged, username}) => { } else{ setVictoria(false) + updateIncorrectAnswers(); } //storeResult(victoria) cambiarColorBotones(respuesta, true); From a181559b81171fea593dabfb863a78455a266e5d Mon Sep 17 00:00:00 2001 From: Lara Date: Fri, 29 Mar 2024 16:46:12 +0100 Subject: [PATCH 2/5] Cambios stats --- gatewayservice/gateway-service.js | 11 ++++++++ userservice/userservice/user-service.js | 14 ++++++++++ webapp/src/components/Pages/Estadisticas.js | 30 ++++++++++++--------- webapp/src/components/Pages/Juego.js | 6 ++--- 4 files changed, 45 insertions(+), 16 deletions(-) diff --git a/gatewayservice/gateway-service.js b/gatewayservice/gateway-service.js index e880564..00a6817 100644 --- a/gatewayservice/gateway-service.js +++ b/gatewayservice/gateway-service.js @@ -74,6 +74,17 @@ app.get('/updateIncorrectAnswers', async (req, res) => { } }); +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/userservice/user-service.js b/userservice/userservice/user-service.js index 75bbe2e..1eb6845 100644 --- a/userservice/userservice/user-service.js +++ b/userservice/userservice/user-service.js @@ -84,6 +84,20 @@ 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/components/Pages/Estadisticas.js b/webapp/src/components/Pages/Estadisticas.js index d6da9c9..3ce6f09 100644 --- a/webapp/src/components/Pages/Estadisticas.js +++ b/webapp/src/components/Pages/Estadisticas.js @@ -1,5 +1,5 @@ // 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'; @@ -16,18 +16,22 @@ const Juego = ({isLogged}) => { const [completedGames, setCompletedGames] = useState(0); const [averageTime, setAverageTime] = useState(0); - 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(() => { + const statsUser = async () => { + 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); + } + }; + + statsUser(); + }); return ( diff --git a/webapp/src/components/Pages/Juego.js b/webapp/src/components/Pages/Juego.js index cdea132..5ade48c 100644 --- a/webapp/src/components/Pages/Juego.js +++ b/webapp/src/components/Pages/Juego.js @@ -28,6 +28,7 @@ const Juego = ({isLogged, username}) => { 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 @@ -36,14 +37,13 @@ const Juego = ({isLogged, username}) => { // 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); - // Realizar otras acciones según sea necesario } catch (error) { console.error('Error al actualizar la respuesta incorrecta:', error); - // Manejar el error de acuerdo a tus necesidades } }; //// @@ -80,8 +80,8 @@ const Juego = ({isLogged, username}) => { setVictoria(true) } else{ - setVictoria(false) updateIncorrectAnswers(); + setVictoria(false) } //storeResult(victoria) cambiarColorBotones(respuesta, true); From e20ba359dca00f09c866aefe5f6ddcc626e3e009 Mon Sep 17 00:00:00 2001 From: Lara Date: Sat, 30 Mar 2024 13:56:32 +0100 Subject: [PATCH 3/5] Num pregunta actual que se vea en front --- userservice/authservice/auth-model.js | 4 ++++ webapp/src/components/Estilos/juego.css | 9 +++++++++ webapp/src/components/Pages/Juego.js | 1 + 3 files changed, 14 insertions(+) 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/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/Juego.js b/webapp/src/components/Pages/Juego.js index e018a3e..84a8346 100644 --- a/webapp/src/components/Pages/Juego.js +++ b/webapp/src/components/Pages/Juego.js @@ -213,6 +213,7 @@ const Juego = ({isLogged, username, numPreguntas}) => { return ( +

{numPreguntaActual} / {numPreguntas}

{pregunta}

From ce78913ae075e49f3686cc8917e54d6fc865cd21 Mon Sep 17 00:00:00 2001 From: Lara Date: Sat, 30 Mar 2024 15:02:24 +0100 Subject: [PATCH 4/5] Arreglo de Temporizador y cambios en Stats --- gatewayservice/gateway-service.js | 13 +++++++++++++ userservice/userservice/user-service.js | 23 ++++++++++++++++++++++- webapp/src/App.js | 1 - webapp/src/components/Pages/Juego.js | 25 +++++++++++++++++++++++-- webapp/src/components/Temporizador.js | 16 ++++++++++++++-- 5 files changed, 72 insertions(+), 6 deletions(-) diff --git a/gatewayservice/gateway-service.js b/gatewayservice/gateway-service.js index 00a6817..4cbbf76 100644 --- a/gatewayservice/gateway-service.js +++ b/gatewayservice/gateway-service.js @@ -74,6 +74,19 @@ app.get('/updateIncorrectAnswers', async (req, res) => { } }); +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; diff --git a/userservice/userservice/user-service.js b/userservice/userservice/user-service.js index 1eb6845..3172ff1 100644 --- a/userservice/userservice/user-service.js +++ b/userservice/userservice/user-service.js @@ -71,7 +71,7 @@ app.get('/updateIncorrectAnswers', async (req,res) => { if (!user) { return res.status(404).json({ success: false, message: 'Usuario no encontrado' }); } - // Incrementa las respuestas correctas del usuario + // 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' }); @@ -80,6 +80,27 @@ app.get('/updateIncorrectAnswers', async (req,res) => { 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}`); }); 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/Pages/Juego.js b/webapp/src/components/Pages/Juego.js index 84a8346..d570a71 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); @@ -27,6 +28,8 @@ const Juego = ({isLogged, username, numPreguntas}) => { const [numPreguntaActual, setNumPreguntaActual] = useState(0) const [arPreg, setArPreg] = useState([]) + + //Variables para la obtencion y modificacion de estadisticas del usuario @@ -62,6 +65,15 @@ const Juego = ({isLogged, username, numPreguntas}) => { 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 @@ -98,6 +110,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); } @@ -192,6 +206,7 @@ const Juego = ({isLogged, username, numPreguntas}) => { //Función que finaliza la partida (redirigir/mostrar stats...) function finishGame(){ + updateCompletedGames(); //TODO } @@ -207,14 +222,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..3dff967 100644 --- a/webapp/src/components/Temporizador.js +++ b/webapp/src/components/Temporizador.js @@ -1,13 +1,25 @@ 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; + console.log("recargado efectivamente") + console.log(restart) + if(restart){ + setTiempoSegundos(tiempoInicial); + pausa=false; + handleRestart(); + } + + console.log(restart); + console.log(tiempoInicial); + console.log(tiempoSegundos); + console.log(pausa); + if (tiempoSegundos > 0 && !pausa) { intervalID = setInterval(() => { From d0f7a0cc18846dc3d2d62ec8297ba41e3f892323 Mon Sep 17 00:00:00 2001 From: Lara Date: Sun, 31 Mar 2024 21:23:20 +0200 Subject: [PATCH 5/5] Correcion Stats --- webapp/src/components/Pages/Estadisticas.js | 39 ++++++++++++--------- webapp/src/components/Pages/Juego.js | 3 -- webapp/src/components/Temporizador.js | 8 ----- 3 files changed, 22 insertions(+), 28 deletions(-) diff --git a/webapp/src/components/Pages/Estadisticas.js b/webapp/src/components/Pages/Estadisticas.js index 3ce6f09..1d085c4 100644 --- a/webapp/src/components/Pages/Estadisticas.js +++ b/webapp/src/components/Pages/Estadisticas.js @@ -5,7 +5,7 @@ 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,23 +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); - useEffect(() => { - const statsUser = async () => { - 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); - } - }; - + 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 ( @@ -61,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 d570a71..c936dc9 100644 --- a/webapp/src/components/Pages/Juego.js +++ b/webapp/src/components/Pages/Juego.js @@ -28,9 +28,6 @@ const Juego = ({isLogged, username, numPreguntas}) => { const [numPreguntaActual, setNumPreguntaActual] = useState(0) 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'; diff --git a/webapp/src/components/Temporizador.js b/webapp/src/components/Temporizador.js index 3dff967..a3e4866 100644 --- a/webapp/src/components/Temporizador.js +++ b/webapp/src/components/Temporizador.js @@ -7,20 +7,12 @@ const Temporizador =({restart, tiempoInicial, tiempoAcabado, pausa, handleRestar useEffect(() => { let intervalID; - console.log("recargado efectivamente") - console.log(restart) if(restart){ setTiempoSegundos(tiempoInicial); pausa=false; handleRestart(); } - console.log(restart); - console.log(tiempoInicial); - console.log(tiempoSegundos); - console.log(pausa); - - if (tiempoSegundos > 0 && !pausa) { intervalID = setInterval(() => { setTiempoSegundos((prevTiempo) => prevTiempo - 1);