Skip to content

Commit

Permalink
Merge pull request #417 from Arquisoft/laura
Browse files Browse the repository at this point in the history
  • Loading branch information
uo277310 authored Apr 27, 2024
2 parents 832457f + 44a8edb commit 4d21180
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 336 deletions.
20 changes: 0 additions & 20 deletions gatewayservice/gateway-service.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand Down Expand Up @@ -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
Expand Down
29 changes: 1 addition & 28 deletions gatewayservice/gateway-service.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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' } });
Expand All @@ -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')
Expand Down Expand Up @@ -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 = {
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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' },
Expand All @@ -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' },
Expand Down
30 changes: 0 additions & 30 deletions questions/recordservice/record-service.js
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
29 changes: 0 additions & 29 deletions questions/recordservice/record-service.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
})
]));
});

});
125 changes: 21 additions & 104 deletions users/rankingservice/ranking-service.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand All @@ -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)) {
Expand Down
Loading

0 comments on commit 4d21180

Please sign in to comment.