diff --git a/gatewayservice/gateway-service.js b/gatewayservice/gateway-service.js index fafb7d2e..76f33380 100644 --- a/gatewayservice/gateway-service.js +++ b/gatewayservice/gateway-service.js @@ -132,15 +132,6 @@ app.get('/getFullQuestion', async (req, res) => { } }); -app.get('/actRanking', async (req, res) => { - try { - const rankingResponse = await axios.get(`${recordServiceUrl}/actRanking`); - res.json(rankingResponse.data); - } catch (error) { - res.status(500).json({ error: 'Error interno del servidor' }); - } -}); - ////////////////////////ranking app.post('/createUserRank', async (req, res) => { @@ -174,17 +165,6 @@ app.post('/updateRanking', async (req, res) => { } }); -app.post('/updateAllRanking', async (req, res) => { - try { - // Reenviar la solicitud POST al servicio de ranking para actualizar el ranking de un usuario - const rankingResponse = await axios.post(`${rankingServiceUrl}/updateAllRanking`, req.body); - res.json(rankingResponse.data); - } catch (error) { - res.status(500).json({ error: 'Error interno del servidor' }); - } -}); - - ///////////////para los question del juego // Ruta para agregar una pregunta de prueba diff --git a/gatewayservice/gateway-service.test.js b/gatewayservice/gateway-service.test.js index 0bc53e74..a63c2527 100644 --- a/gatewayservice/gateway-service.test.js +++ b/gatewayservice/gateway-service.test.js @@ -23,9 +23,7 @@ describe('Gateway Service', () => { return Promise.resolve({ data: { rankId: 'mockedRankId' } }); } else if (url.endsWith('/updateRanking')) { return Promise.resolve({ data: { updatedRanking: true } }); - } else if (url.endsWith('/updateAllRanking')) { - return Promise.resolve({ data: { updatedRanking: true } }); - } else if (url.endsWith('/addOrUpdateQuestionGenerator')) { + } else if (url.endsWith('/addOrUpdateQuestionGenerator')) { return Promise.resolve({ data: { questionId: 'mockedQuestionId' } }); } else if (url.endsWith('/addGeneratedQuestion')) { return Promise.resolve({ data: { generatedQuestionId: 'mockedGeneratedQuestionId' } }); @@ -40,8 +38,6 @@ describe('Gateway Service', () => { return Promise.resolve({ data: { records: ['record1', 'record2'] } }); } else if (url.endsWith('/getFullQuestion')) { return Promise.resolve({ data: { question: 'mockedQuestion' } }); - } else if (url.endsWith('/actRanking')) { - return Promise.resolve({ data: { ranking: 'mockedRanking' } }); } else if (url.endsWith('/obtainRank')) { return Promise.resolve({ data: { rank: 'mockedRank' } }); } else if (url.endsWith('/getRandomQuestionDeporte') || url.endsWith('/getRandomQuestionAnio') @@ -151,18 +147,6 @@ describe('Gateway Service', () => { expect(response.body.updatedRanking).toBe(true); }); - // Test /updateAllRanking endpoint - it('should update all rankings in ranking service', async () => { - const mockRanking = { username: 'testuser' }; - - const response = await request(app) - .post('/updateAllRanking') - .send(mockRanking); - - expect(response.statusCode).toBe(200); - expect(response.body.updatedRanking).toBe(true); - }); - // Test /addOrUpdateQuestionGenerator endpoint success it('should add or update a question successfully', async () => { const mockQuestion = { @@ -236,15 +220,6 @@ describe('Gateway Service', () => { expect(response.body.question).toBe('mockedQuestion'); }); - // Test /actRanking endpoint - it('should get a ranking from ranking service', async () => { - const response = await request(app) - .get('/actRanking'); - - expect(response.statusCode).toBe(200); - expect(response.body.ranking).toBe('mockedRanking'); - }); - // Test /obtainRank endpoint it('should get a rank from rank service', async () => { const response = await request(app) @@ -326,7 +301,6 @@ describe('Gateway Service', () => { { method: 'post', endpoint: '/addQuestion', data: { questionBody: '¿Cual es la capital de Francia?', typeQuestion: 'pais_capital' } }, { method: 'post', endpoint: '/createUserRank', data: { username: 'testuser' } }, { method: 'post', endpoint: '/updateRanking', data: { username: 'testuser' } }, - { method: 'post', endpoint: '/updateAllRanking', data: { username: 'testuser' } }, { method: 'post', endpoint: '/addOrUpdateQuestionGenerator', data: { questionBody: '¿Cual es la capital de Francia?', typeQuestion: 'pais_capital' } }, { method: 'get', endpoint: '/getRandomQuestionSports' }, { method: 'get', endpoint: '/getRandomQuestionMusic' }, @@ -337,7 +311,6 @@ describe('Gateway Service', () => { { method: 'get', endpoint: '/getRecords/:userId' }, { method: 'get', endpoint: '/getAllUsers' }, { method: 'get', endpoint: '/getFullQuestion' }, - { method: 'get', endpoint: '/actRanking' }, { method: 'get', endpoint: '/obtainRank' }, { method: 'get', endpoint: '/getAllQuestionGenerator' }, { method: 'get', endpoint: '/countQuestionGenerator' }, diff --git a/questions/recordservice/record-service.js b/questions/recordservice/record-service.js index 55632cec..79a04e4d 100644 --- a/questions/recordservice/record-service.js +++ b/questions/recordservice/record-service.js @@ -67,36 +67,6 @@ app.get('/getRecords/:userId', async (req, res) => { } }); -// Nuevo endpoint paraactualizar el ranking de los usurias si surgiera algo -app.get('/actRanking', async (req, res) => { - try { - const allRecords = await Record.find(); - - const rankingData = {}; - - allRecords.forEach(record => { - const userId = record.userId; - if (!(userId in rankingData)) { - rankingData[userId] = { - username: userId, - preguntasCorrectas: 0, - preguntasFalladas: 0, - numPartidas: 0 - }; - } - - rankingData[userId].preguntasCorrectas += record.correctQuestions; - rankingData[userId].preguntasFalladas += record.failedQuestions; - rankingData[userId].numPartidas += 1; - }); - - const rankingArray = Object.values(rankingData); - - res.json(rankingArray); - } catch (error) { - res.status(400).json({ error: error.message }); - } -}); // Read the OpenAPI YAML file synchronously const openapiPath='./openapi.yaml' diff --git a/questions/recordservice/record-service.test.js b/questions/recordservice/record-service.test.js index bab606a7..0889ff3f 100644 --- a/questions/recordservice/record-service.test.js +++ b/questions/recordservice/record-service.test.js @@ -100,33 +100,4 @@ describe('Record Service', () => { expect(response.body.length).toBe(2); }); - it('Should calculate and return a ranking of users /actRanking', async () => { - // Add the records to the database - await request(app).post('/addRecord').send(record); - await request(app).post('/addRecord').send(record2); - await request(app).post('/addRecord').send(record3); - - // Request the ranking - const response = await request(app).get('/actRanking'); - - // Check the status code - expect(response.status).toBe(200); - - // Check the structure and content of the response - expect(response.body).toEqual(expect.arrayContaining([ - expect.objectContaining({ - username: 'testuserid', - preguntasCorrectas: 28, - preguntasFalladas: 12, - numPartidas: 4 - }), - expect.objectContaining({ - username: 'testuserid2', - preguntasCorrectas: 10, - preguntasFalladas: 10, - numPartidas: 2 - }) - ])); - }); - }); diff --git a/users/rankingservice/ranking-service.js b/users/rankingservice/ranking-service.js index edbcbed1..4038687f 100644 --- a/users/rankingservice/ranking-service.js +++ b/users/rankingservice/ranking-service.js @@ -51,74 +51,37 @@ app.post('/updateRanking', async (req, res) => { }); -//crea un elemento ranking si no existe y si existe lo deja a 0 para actualizar a posterior sus datos -//tambien actualiza si se elimino un usuario de eliminar el elemento ranking correspondiente +//crea un elemento ranking si no existe app.post('/createUserRank', async (req, res) => { try { - const { usernames } = req.body; - - await deleteRankingElements(usernames); - - // Iterar sobre cada nombre de usuario recibido - for (const username of usernames) { - // Convertir el nombre de usuario en una cadena - const safeUsername = username.toString(); - - // Buscar si ya existe un ranking para el usuario - const existingUserRank = await UserRank.findOne({ username: safeUsername }); - - if (existingUserRank) { - // Si ya existe un ranking para el usuario, actualizar los valores a cero - // para actualizarlos después con los valores de las jugadas - existingUserRank.porcentajeAciertos = 0; - existingUserRank.preguntasCorrectas = 0; - existingUserRank.preguntasFalladas = 0; - existingUserRank.numPartidas = 0; - - await existingUserRank.save(); - } else { - // Si no existe un ranking para el usuario, crear uno nuevo - const newUserRank = new UserRank({ - username, - porcentajeAciertos: 0, - preguntasCorrectas: 0, - preguntasFalladas: 0, - numPartidas: 0 - }); - - await newUserRank.save(); - } + const { username } = req.body; + + // Convertir el nombre de usuario en una cadena + const safeUsername = username.toString(); + + // Buscar si ya existe un ranking para el usuario + const existingUserRank = await UserRank.findOne({ username: safeUsername }); + + if (!existingUserRank) { + // Si no existe un ranking para el usuario, crear uno nuevo + const newUserRank = new UserRank({ + username: safeUsername, + porcentajeAciertos: 0, + preguntasCorrectas: 0, + preguntasFalladas: 0, + numPartidas: 0 + }); + + await newUserRank.save(); } + // Respuesta inmediata al cliente indicando que la operación se ha completado con éxito res.json({ message: 'Rankings de usuarios creados o actualizados correctamente.' }); } catch (error) { res.status(400).json({ error: error.message }); } }); - -//actualiza si se elimino un usuario de eliminar el elemento ranking correspondiente -async function deleteRankingElements(usernames) { - try { - // Obtener todos los elementos de ranking - const allUserRanks = await UserRank.find({}); - - // Crear un conjunto de nombres de usuario en la lista recibida - const usernamesSet = new Set(usernames); - - // Iterar sobre cada elemento de ranking - for (const userRank of allUserRanks) { - // Verificar si el nombre de usuario del elemento de ranking no está en la lista recibida - if (!usernamesSet.has(userRank.username)) { - // Si el nombre de usuario no está en la lista, eliminar el elemento de ranking - await UserRank.deleteOne({ username: userRank.username }); - } - } - } catch (error) { - throw new Error('Error al actualizar los rankings de usuarios: ' + error.message); - } -} - app.get('/obtainRank', async (req, res) => { try { @@ -129,52 +92,6 @@ app.get('/obtainRank', async (req, res) => { } }); -//actualiza al inicio los rankings si hubo algun cambio en la base de datos -app.post('/updateAllRanking', async (req, res) => { - try { - const rankingData = req.body; - - // Iterar sobre los datos recibidos y actualizar los rankings correspondientes - for (const userData of rankingData) { - const username = userData.username.toString(); - const preguntasCorrectas = userData.preguntasCorrectas; - const preguntasFalladas = userData.preguntasFalladas; - const numPartidas = userData.numPartidas; - - // Buscar al usuario en la base de datos - const existingUser = await UserRank.findOne({ username }); - - if (!existingUser) { - // Si el usuario no tiene ranking, crear un nuevo ranking para él - const newUserRank = new UserRank({ - username, - porcentajeAciertos: 0, - preguntasCorrectas, - preguntasFalladas, - numPartidas // Al ser el primer registro, el número de partidas es 1 - }); - - await newUserRank.save(); - } else { - // Si el usuario ya existe, actualizar su ranking - existingUser.preguntasCorrectas += preguntasCorrectas; - existingUser.preguntasFalladas += preguntasFalladas; - existingUser.numPartidas += numPartidas; - - const totalPreguntas = existingUser.preguntasCorrectas + existingUser.preguntasFalladas; - const porcentajeAciertos = (existingUser.preguntasCorrectas / totalPreguntas) * 100; - existingUser.porcentajeAciertos = porcentajeAciertos.toFixed(2); - - await existingUser.save(); - } - } - - res.json({ message: 'Rankings actualizados correctamente.' }); - } catch (error) { - res.status(400).json({ error: error.message }); - } -}); - // Read the OpenAPI YAML file synchronously const openapiPath='./openapi.yaml' if (fs.existsSync(openapiPath)) { diff --git a/users/rankingservice/ranking-service.test.js b/users/rankingservice/ranking-service.test.js index 70ee2191..f15c1059 100644 --- a/users/rankingservice/ranking-service.test.js +++ b/users/rankingservice/ranking-service.test.js @@ -25,28 +25,17 @@ afterEach(async () => { describe('User Service', () => { // Prueba para el endpoint POST /createUserRank describe('POST /createUserRank', () => { - it('should create new user ranks', async () => { - const newUser = { username: 'testuser1' }; - const newUser2 = { username: 'testuser2' }; - const newUser3 = { username: 'testuser3' }; - const newUser4 = { username: 'testuser4' }; - const users = [newUser, newUser2, newUser3, newUser4]; - - // Realizar una solicitud POST para crear nuevos rankings de usuarios + it('should create a new user rank if the user does not exist', async () => { + const newUser = { username: 'testUser' }; + const response = await request(app) - .post('/createUserRank') // Cambio en el endpoint - .send({ usernames: users.map(user => user.username) }); - - // Verificar el código de estado de la respuesta + .post('/createUserRank') + .send(newUser); + expect(response.status).toBe(200); - - // Verificar si se crearon correctamente los nuevos rankings de usuario en la base de datos - for (const user of users) { - const createdUserRank = await UserRank.findOne({ username: user.username }); - expect(createdUserRank).toBeTruthy(); - expect(createdUserRank.username).toBe(user.username); - } + expect(response.body.message).toBe('Rankings de usuarios creados o actualizados correctamente.'); }); + }); // Prueba para el endpoint POST /updateRanking @@ -110,16 +99,27 @@ describe('User Service', () => { describe('User Service (Negative Tests)', () => { // Prueba negativa para el endpoint POST /createUserRank describe('POST /createUserRank (Negative Test)', () => { - it('should return 400 if username is missing', async () => { - // Realizar una solicitud POST sin proporcionar el nombre de usuario + it('should not create new user rank if user already exists', async () => { + const existingUser = new UserRank({ + username: 'existinguser', + porcentajeAciertos: 50, + preguntasCorrectas: 20, + preguntasFalladas: 10, + numPartidas: 5 + }); + await existingUser.save(); + + // Realizar una solicitud POST para crear un nuevo ranking de usuario con el mismo nombre de usuario const response = await request(app) .post('/createUserRank') - .send({}); - + .send({ username: existingUser.username }); // Enviamos solo el nombre de usuario existente + // Verificar el código de estado de la respuesta - expect(response.status).toBe(400); - // Verificar si el cuerpo de la respuesta contiene un mensaje de error - expect(response.body.error).toBeTruthy(); + expect(response.status).toBe(200); + + // Verificar que no se haya creado un nuevo ranking para el usuario existente + const userRankCount = await UserRank.countDocuments({ username: existingUser.username }); + expect(userRankCount).toBe(1); // Debería seguir siendo solo 1 (el existente) }); }); @@ -160,22 +160,6 @@ describe('User Service', () => { }); -test('POST /createUserRank creates or resets a user ranking', async () => { - const username = 'testUser'; - - const response = await request(app) - .post('/createUserRank') - .send({ usernames: [username] }); - - expect(response.status).toBe(200); - expect(response.body.message).toBe('Rankings de usuarios creados o actualizados correctamente.'); - - const userRank = await UserRank.findOne({ username }); - expect(userRank.preguntasCorrectas).toBe(0); - expect(userRank.preguntasFalladas).toBe(0); - expect(userRank.numPartidas).toBe(0); -}); - test('GET /obtainRank gets all user rankings', async () => { const response = await request(app).get('/obtainRank'); @@ -183,55 +167,6 @@ test('GET /obtainRank gets all user rankings', async () => { expect(Array.isArray(response.body)).toBe(true); }); -it('should reset an existing user rank', async () => { - // Arrange - const username = 'testUser'; - const initialUserRank = new UserRank({ - username, - porcentajeAciertos: 50, - preguntasCorrectas: 10, - preguntasFalladas: 10, - numPartidas: 1 - }); - await initialUserRank.save(); - - // Act - await request(app) - .post('/createUserRank') - .send({ usernames: [username] }) - .expect(200); - - // Assert - const updatedUserRank = await UserRank.findOne({ username }); - expect(updatedUserRank.porcentajeAciertos).toBe(0); - expect(updatedUserRank.preguntasCorrectas).toBe(0); - expect(updatedUserRank.preguntasFalladas).toBe(0); - expect(updatedUserRank.numPartidas).toBe(0); -}); - -it('should return 400 if user does not exist', async () => { - // Arrange - const username = 'testUser'; - const initialUserRank = new UserRank({ - username, - porcentajeAciertos: 50, - preguntasCorrectas: 10, - preguntasFalladas: 10, - numPartidas: 1 - }); - await initialUserRank.save(); - - // Act - await request(app) - .post('/updateAllRanking') - .send({ usernames: ['anotherUser'] }) // username not included - .expect(400); // Expect 400 status code - - // Assert - const deletedUserRank = await UserRank.findOne({ username }); - expect(deletedUserRank).not.toBeNull(); // Expect the user rank to still exist -}); - describe('GET /obtainRank', () => { it('it should GET all the rankings', async () => { const response = await request(app).get('/obtainRank'); @@ -240,31 +175,4 @@ describe('GET /obtainRank', () => { }); }); -describe('POST /updateAllRanking', () => { - it('it should update all rankings', async () => { - const rankingData = [ - { - username: 'testUser1', - preguntasCorrectas: 5, - preguntasFalladas: 3, - numPartidas: 1 - }, - { - username: 'testUser2', - preguntasCorrectas: 7, - preguntasFalladas: 2, - numPartidas: 1 - } - ]; - - const response = await request(app) - .post('/updateAllRanking') - .send(rankingData); - - expect(response.status).toBe(200); - expect(response.body).toHaveProperty('message', 'Rankings actualizados correctamente.'); - }); -}); - - }); diff --git a/webapp/src/components/Login.js b/webapp/src/components/Login.js index cf0ad5ff..0ecabaa4 100644 --- a/webapp/src/components/Login.js +++ b/webapp/src/components/Login.js @@ -52,15 +52,9 @@ const Login = ({ setLogged }) => { setLoginSuccess(true); setLogged(); setLoading(true); - - // Reúne todos los nombres de usuario en un array - const usernames = users.map(user => user.username); // Envía todos los nombres de usuario en una sola solicitud - await axios.post(`${apiEndpoint}/createUserRank`, { usernames }); - - const { data: updatedRankingData } = await axios.get(`${apiEndpoint}/actRanking`); - await axios.post(`${apiEndpoint}/updateAllRanking`, updatedRankingData); + await axios.post(`${apiEndpoint}/createUserRank`, { username }); setLoading(false); setOpenSnackbar(true);