From 173845ecee5b2199ac45e20f41224a669cd28d71 Mon Sep 17 00:00:00 2001 From: alegarman2002 <116609314+alegarman2002@users.noreply.github.com> Date: Wed, 13 Mar 2024 01:32:48 +0100 Subject: [PATCH 1/2] Added the logic to do a simple wikidata query --- .../wikidataExtractor/wikidataConnexion.js | 32 +++++++++++++++++++ .../wikidataExtractor/wikidataQueries.js | 28 ++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 questionsservice/questiongeneratorservice/wikidataExtractor/wikidataConnexion.js create mode 100644 questionsservice/questiongeneratorservice/wikidataExtractor/wikidataQueries.js diff --git a/questionsservice/questiongeneratorservice/wikidataExtractor/wikidataConnexion.js b/questionsservice/questiongeneratorservice/wikidataExtractor/wikidataConnexion.js new file mode 100644 index 00000000..4778add5 --- /dev/null +++ b/questionsservice/questiongeneratorservice/wikidataExtractor/wikidataConnexion.js @@ -0,0 +1,32 @@ +async function consulta(query) { + const apiUrl = `https://query.wikidata.org/sparql?query=${encodeURIComponent(query)}&format=json`; + console.log(query) + const respuesta = await fetch(apiUrl, { + headers: { + 'User-Agent': 'QuestionCrawler/1.0', + 'Accept': 'application/json' + } + }); + // console.log(apiUrl) + // console.log(respuesta) + if (!respuesta.ok) { + console.error('Error al realizar la consulta a Wikidata:', respuesta.statusText); + return; + } + + const datos = await respuesta.json(); + + const resultados = []; + + for (const resultado of datos.results.bindings) { + const resultadoFormateado = {}; + for (const clave in resultado) { + resultadoFormateado[clave] = resultado[clave].value; + } + resultados.push(resultadoFormateado); + } + + return resultados; +} + +module.exports = {consulta} diff --git a/questionsservice/questiongeneratorservice/wikidataExtractor/wikidataQueries.js b/questionsservice/questiongeneratorservice/wikidataExtractor/wikidataQueries.js new file mode 100644 index 00000000..5a606f58 --- /dev/null +++ b/questionsservice/questiongeneratorservice/wikidataExtractor/wikidataQueries.js @@ -0,0 +1,28 @@ +const wikidata = require("./wikidataConnexion"); + +class WikiQueries { + + static async obtenerPaisYCapital() { + const query = ` + SELECT ?countryLabel ?capitalLabel WHERE { + ?country wdt:P31 wd:Q6256. + ?country wdt:P36 ?capital. + SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],es". } + } + `; + + const results = await wikidata.consulta(query); + // console.log(results) + return results; + } +} + + + + + + + + + +module.exports = WikiQueries \ No newline at end of file From 06928555109931ce011c3b93670fe64a5edabf17 Mon Sep 17 00:00:00 2001 From: alegarman2002 <116609314+alegarman2002@users.noreply.github.com> Date: Wed, 13 Mar 2024 01:34:33 +0100 Subject: [PATCH 2/2] Added the logic in the api to generate random questions based on the simple query --- .../questiongenerator-service.js | 173 +++++++++++------- 1 file changed, 107 insertions(+), 66 deletions(-) diff --git a/questionsservice/questiongeneratorservice/questiongenerator-service.js b/questionsservice/questiongeneratorservice/questiongenerator-service.js index ffaec5f4..88aec913 100644 --- a/questionsservice/questiongeneratorservice/questiongenerator-service.js +++ b/questionsservice/questiongeneratorservice/questiongenerator-service.js @@ -7,6 +7,7 @@ const { Request } = require('./questiongenerator-model') const app = express(); const port = 8006; +const WikiQueries = require('./wikidataExtractor/wikidataQueries') // Connect to MongoDB const mongoUri = process.env.MONGODB_URI || 'mongodb://localhost:27017/questions'; mongoose.connect(mongoUri); @@ -20,79 +21,119 @@ app.use(express.json()); // Middleware to enable CORS (cross-origin resource sharing). In order for the API to be accessible by other origins (domains). app.use(cors()); -const mockedQuestions = [ - { - pregunta: "¿Cómo me llamo?", - respuesta_correcta: "Abel", - respuestas_incorrectas: ["Federico", "Eusebio", "Gervasio"] - }, - { - pregunta: "¿Cuál es el río más largo del mundo?", - respuesta_correcta: "Amazonas", - respuestas_incorrectas: ["Nilo", "Misisipi", "Yangtsé"] - }, - { - pregunta: "¿En qué año comenzó la Segunda Guerra Mundial?", - respuesta_correcta: "1939", - respuestas_incorrectas: ["1941", "1942", "1945"] - }, - { - pregunta: "¿Quién escribió 'El Quijote'?", - respuesta_correcta: "Miguel de Cervantes", - respuestas_incorrectas: ["Garcilaso de la Vega", "Federico García Lorca", "Pablo Neruda"] - }, - { - pregunta: "¿Cuál es el símbolo químico del oro?", - respuesta_correcta: "Au", - respuestas_incorrectas: ["Ag", "Fe", "Cu"] - }, - { - pregunta: "¿Cuál es el planeta más grande del sistema solar?", - respuesta_correcta: "Júpiter", - respuestas_incorrectas: ["Saturno", "Marte", "Venus"] - }, - { - pregunta: "¿Quién pintó la 'Mona Lisa'?", - respuesta_correcta: "Leonardo da Vinci", - respuestas_incorrectas: ["Pablo Picasso", "Vincent van Gogh", "Rembrandt"] - }, - { - pregunta: "¿En qué país se encuentra la Torre Eiffel?", - respuesta_correcta: "Francia", - respuestas_incorrectas: ["Italia", "España", "Alemania"] - }, - { - pregunta: "¿Qué año marcó el fin de la Segunda Guerra Mundial?", - respuesta_correcta: "1945", - respuestas_incorrectas: ["1943", "1944", "1946"] - }, - { - pregunta: "¿Quién escribió 'Romeo y Julieta'?", - respuesta_correcta: "William Shakespeare", - respuestas_incorrectas: ["Jane Austen", "Charles Dickens", "F. Scott Fitzgerald"] - }, - { - pregunta: "¿Qué inventó Thomas Edison?", - respuesta_correcta: "Bombilla eléctrica", - respuestas_incorrectas: ["Teléfono", "Automóvil", "Avión"] +var mockedQuestions = [] +var isWikiChecked = false +var elementos + +function shuffle(array) { + let currentIndex = array.length; + let randomIndex; + + // Mientras queden elementos para mezclar. + while (currentIndex > 0) { + // Escoge un elemento aleatorio. + randomIndex = Math.floor(Math.random() * currentIndex); + currentIndex--; + + // Intercambia el elemento actual con el elemento aleatorio. + [array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]]; } -] + + return array; +} + +const generateQuestion = async () => { + if (!isWikiChecked) { + elementos = await WikiQueries.obtenerPaisYCapital() + isWikiChecked = true + } + elementos = shuffle(elementos) + console.log("caca", elementos) + mockedQuestions = [{ + pregunta: "¿Cual es la capital de " + elementos[0].countryLabel + "?", + respuesta_correcta: elementos[0].capitalLabel, + respuestas_incorrectas: [elementos[1].capitalLabel, elementos[2].capitalLabel, elementos[3].capitalLabel] + }] + console.log(mockedQuestions) +} + + +// const mockedQuestions = [ +// { +// pregunta: "¿Cómo me llamo?", +// respuesta_correcta: "Abel", +// respuestas_incorrectas: ["Federico", "Eusebio", "Gervasio"] +// }, +// { +// pregunta: "¿Cuál es el río más largo del mundo?", +// respuesta_correcta: "Amazonas", +// respuestas_incorrectas: ["Nilo", "Misisipi", "Yangtsé"] +// }, +// { +// pregunta: "¿En qué año comenzó la Segunda Guerra Mundial?", +// respuesta_correcta: "1939", +// respuestas_incorrectas: ["1941", "1942", "1945"] +// }, +// { +// pregunta: "¿Quién escribió 'El Quijote'?", +// respuesta_correcta: "Miguel de Cervantes", +// respuestas_incorrectas: ["Garcilaso de la Vega", "Federico García Lorca", "Pablo Neruda"] +// }, +// { +// pregunta: "¿Cuál es el símbolo químico del oro?", +// respuesta_correcta: "Au", +// respuestas_incorrectas: ["Ag", "Fe", "Cu"] +// }, +// { +// pregunta: "¿Cuál es el planeta más grande del sistema solar?", +// respuesta_correcta: "Júpiter", +// respuestas_incorrectas: ["Saturno", "Marte", "Venus"] +// }, +// { +// pregunta: "¿Quién pintó la 'Mona Lisa'?", +// respuesta_correcta: "Leonardo da Vinci", +// respuestas_incorrectas: ["Pablo Picasso", "Vincent van Gogh", "Rembrandt"] +// }, +// { +// pregunta: "¿En qué país se encuentra la Torre Eiffel?", +// respuesta_correcta: "Francia", +// respuestas_incorrectas: ["Italia", "España", "Alemania"] +// }, +// { +// pregunta: "¿Qué año marcó el fin de la Segunda Guerra Mundial?", +// respuesta_correcta: "1945", +// respuestas_incorrectas: ["1943", "1944", "1946"] +// }, +// { +// pregunta: "¿Quién escribió 'Romeo y Julieta'?", +// respuesta_correcta: "William Shakespeare", +// respuestas_incorrectas: ["Jane Austen", "Charles Dickens", "F. Scott Fitzgerald"] +// }, +// { +// pregunta: "¿Qué inventó Thomas Edison?", +// respuesta_correcta: "Bombilla eléctrica", +// respuestas_incorrectas: ["Teléfono", "Automóvil", "Avión"] +// } +// ] // Function to generate the required number of questions -function getQuestions(req) { +async function getQuestions(req) { const { n_preguntas, n_respuestas, tema } = req.query; var preguntas = Number(n_preguntas); var respuestas = Number(n_respuestas); var temad = String(tema); - if (isNaN(preguntas)) { - return mockedQuestions.slice(0, 4); - } - const response = []; - for (let i = 0; i < preguntas; i++) { - response.push(mockedQuestions[i % 11]); - } - return response + // if (isNaN(preguntas)) { + // generateQuestion() + // console.log("merda", mockedQuestions) + // return mockedQuestions.slice(0, 4); + // } + // const response = []; + await generateQuestion() + // for (let i = 0; i < preguntas; i++) { + // response.push(mockedQuestions[i % 11]); + // } + return mockedQuestions } // Route for getting questions @@ -100,7 +141,7 @@ app.get('/questions', async (req, res) => { try { // TODO: Implement logic to fetch questions from MongoDB and send response // const questions = await Question.find() - const defaultQuestion = getQuestions(req) + const defaultQuestion = await getQuestions(req) res.json(defaultQuestion); } catch (error) { // res.status(500).json({ message: error.message })