Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Eliminacion de métodos no necesarios de micro ranking y adaptacion de los tests #417

Merged
merged 9 commits into from
Apr 27, 2024
Merged
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