From 3cd3d52fb332bd4acd57afadfdad21e552b4fe96 Mon Sep 17 00:00:00 2001
From: sara <sarafergonza@gmail.com>
Date: Thu, 29 Feb 2024 18:41:05 +0100
Subject: [PATCH 1/2] planteamiento sistema de preguntas

---
 .idea/workspace.xml                          | 37 +++++++++++-----
 questions/SPARQLQueryDispatcher.js           | 12 ++++++
 questions/createqservice/question-service.js | 45 ++++++++++----------
 3 files changed, 61 insertions(+), 33 deletions(-)
 create mode 100644 questions/SPARQLQueryDispatcher.js

diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 7c5aea98..57ce6308 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,21 +4,22 @@
     <option name="autoReloadType" value="SELECTIVE" />
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="f3a70bc3-1f0b-4042-a99e-e960a2b1db01" name="Changes" comment="">
-      <change afterPath="$PROJECT_DIR$/.idea/jsLibraryMappings.xml" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/practicas/.idea/workspace.xml" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/questions/createqservice/package-lock.json" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/questions/createqservice/package.json" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/questions/createqservice/question-model.js" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/questions/createqservice/question-service.js" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/package-lock.json" beforeDir="false" afterPath="$PROJECT_DIR$/package-lock.json" afterDir="false" />
+    <list default="true" id="f3a70bc3-1f0b-4042-a99e-e960a2b1db01" name="Changes" comment="resolución de problemas y modelo de preguntas">
+      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/questions/createqservice/question-service.js" beforeDir="false" afterPath="$PROJECT_DIR$/questions/createqservice/question-service.js" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
     <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
     <option name="LAST_RESOLUTION" value="IGNORE" />
   </component>
+  <component name="FileTemplateManagerImpl">
+    <option name="RECENT_TEMPLATES">
+      <list>
+        <option value="JavaScript File" />
+      </list>
+    </option>
+  </component>
   <component name="Git.Settings">
     <option name="RECENT_BRANCH_BY_REPOSITORY">
       <map>
@@ -45,7 +46,7 @@
   "keyToString": {
     "RunOnceActivity.OpenProjectViewOnStart": "true",
     "RunOnceActivity.ShowReadmeOnStart": "true",
-    "git-widget-placeholder": "Merging generacionPreguntas",
+    "git-widget-placeholder": "generacionPreguntasSara",
     "javascript.nodejs.core.library.configured.version": "20.11.1",
     "javascript.nodejs.core.library.typings.version": "20.11.20",
     "kotlin-language-version-configured": "true",
@@ -72,10 +73,26 @@
       <option name="presentableId" value="Default" />
       <updated>1709024704264</updated>
       <workItem from="1709024705608" duration="479000" />
+      <workItem from="1709226858104" duration="1475000" />
     </task>
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
     <option name="version" value="3" />
   </component>
+  <component name="Vcs.Log.Tabs.Properties">
+    <option name="TAB_STATES">
+      <map>
+        <entry key="MAIN">
+          <value>
+            <State />
+          </value>
+        </entry>
+      </map>
+    </option>
+  </component>
+  <component name="VcsManagerConfiguration">
+    <MESSAGE value="resolución de problemas y modelo de preguntas" />
+    <option name="LAST_COMMIT_MESSAGE" value="resolución de problemas y modelo de preguntas" />
+  </component>
 </project>
\ No newline at end of file
diff --git a/questions/SPARQLQueryDispatcher.js b/questions/SPARQLQueryDispatcher.js
new file mode 100644
index 00000000..41990bac
--- /dev/null
+++ b/questions/SPARQLQueryDispatcher.js
@@ -0,0 +1,12 @@
+class SPARQLQueryDispatcher {
+    constructor( endpoint ) {
+        this.endpoint = endpoint;
+    }
+
+    query( sparqlQuery ) {
+        const fullUrl = this.endpoint + '?query=' + encodeURIComponent( sparqlQuery );
+        const headers = { 'Accept': 'application/sparql-results+json' };
+
+        return fetch( fullUrl, { headers } ).then( body => body.json() );
+    }
+}
\ No newline at end of file
diff --git a/questions/createqservice/question-service.js b/questions/createqservice/question-service.js
index c4e0e876..ab3e329b 100644
--- a/questions/createqservice/question-service.js
+++ b/questions/createqservice/question-service.js
@@ -3,7 +3,9 @@ const express = require('express');
 const mongoose = require('mongoose');
 const bcrypt = require('bcrypt');
 const bodyParser = require('body-parser');
-const User = require('./question-model')
+const User = require('./question-model');
+
+import SPARQLQueryDispatcher from '../SPARQLQueryDispatcher.js';
 
 const app = express();
 const port = 8001;
@@ -16,35 +18,32 @@ const mongoUri = process.env.MONGODB_URI || 'mongodb://localhost:27017/userdb';
 mongoose.connect(mongoUri);
 
 
+const preguntas = new Map();
+setPreguntas();
 
-// Function to validate required fields in the request body
-function validateRequiredFields(req, requiredFields) {
-    for (const field of requiredFields) {
-      if (!(field in req.body)) {
-        throw new Error(`Missing required field: ${field}`);
-      }
-    }
-}
+const endpointUrl = 'https://query.wikidata.org/sparql';
+const queryDispatcher = new SPARQLQueryDispatcher( endpointUrl );
 
-app.post('/adduser', async (req, res) => {
+app.post('/question', async (req, res) => {
     try {
-        // Check if required fields are present in the request body
-        validateRequiredFields(req, ['username', 'password']);
-
-        // Encrypt the password before saving it
-        const hashedPassword = await bcrypt.hash(req.body.password, 10);
-
-        const newUser = new User({
-            username: req.body.username,
-            password: hashedPassword,
-        });
-
-        await newUser.save();
-        res.json(newUser);
+        getAtributo();
     } catch (error) {
         res.status(400).json({ error: error.message }); 
     }});
 
+function setPreguntas(){
+    preguntas.set("capital","Cuál es la capital de");
+}
+
+function getAtributo(){
+    const sparqlQuery = `SELECT ?capitalLabel WHERE {
+  ?capital wdt:P31 wd:Q6256;
+  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
+}`;
+
+    queryDispatcher.query( sparqlQuery ).then( console.log );
+}
+
 const server = app.listen(port, () => {
   console.log(`User Service listening at http://localhost:${port}`);
 });

From 765d4c00ed0acd6f8f23340cc7a6ce912c242431 Mon Sep 17 00:00:00 2001
From: sara <sarafergonza@gmail.com>
Date: Thu, 29 Feb 2024 19:44:33 +0100
Subject: [PATCH 2/2] =?UTF-8?q?a=C3=B1adidos=20a=20sistema=20de=20pregunta?=
 =?UTF-8?q?s?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .idea/workspace.xml                 | 19 ++++++++++++++----
 package-lock.json                   | 30 +++++++++++++----------------
 webapp/src/components/GamesPanel.js | 15 ++++++++++++---
 3 files changed, 40 insertions(+), 24 deletions(-)

diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 57ce6308..f2ba0f90 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,9 +4,10 @@
     <option name="autoReloadType" value="SELECTIVE" />
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="f3a70bc3-1f0b-4042-a99e-e960a2b1db01" name="Changes" comment="resolución de problemas y modelo de preguntas">
+    <list default="true" id="f3a70bc3-1f0b-4042-a99e-e960a2b1db01" name="Changes" comment="planteamiento sistema de preguntas">
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/questions/createqservice/question-service.js" beforeDir="false" afterPath="$PROJECT_DIR$/questions/createqservice/question-service.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/package-lock.json" beforeDir="false" afterPath="$PROJECT_DIR$/package-lock.json" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/webapp/src/components/GamesPanel.js" beforeDir="false" afterPath="$PROJECT_DIR$/webapp/src/components/GamesPanel.js" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -73,8 +74,17 @@
       <option name="presentableId" value="Default" />
       <updated>1709024704264</updated>
       <workItem from="1709024705608" duration="479000" />
-      <workItem from="1709226858104" duration="1475000" />
+      <workItem from="1709226858104" duration="5237000" />
     </task>
+    <task id="LOCAL-00001" summary="planteamiento sistema de preguntas">
+      <option name="closed" value="true" />
+      <created>1709228469223</created>
+      <option name="number" value="00001" />
+      <option name="presentableId" value="LOCAL-00001" />
+      <option name="project" value="LOCAL" />
+      <updated>1709228469223</updated>
+    </task>
+    <option name="localTasksCounter" value="2" />
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
@@ -93,6 +103,7 @@
   </component>
   <component name="VcsManagerConfiguration">
     <MESSAGE value="resolución de problemas y modelo de preguntas" />
-    <option name="LAST_COMMIT_MESSAGE" value="resolución de problemas y modelo de preguntas" />
+    <MESSAGE value="planteamiento sistema de preguntas" />
+    <option name="LAST_COMMIT_MESSAGE" value="planteamiento sistema de preguntas" />
   </component>
 </project>
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 0a60377d..d8675a91 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,9 +9,9 @@
       }
     },
     "node_modules/@remix-run/router": {
-      "version": "1.15.0",
-      "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.0.tgz",
-      "integrity": "sha512-HOil5aFtme37dVQTB6M34G95kPM3MMuqSmIRVCC52eKV+Y/tGSqw9P3rWhlAx6A+mz+MoX+XxsGsNJbaI5qCgQ==",
+      "version": "1.15.2",
+      "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.2.tgz",
+      "integrity": "sha512-+Rnav+CaoTE5QJc4Jcwh5toUpnVLKYbpU6Ys0zqbakqbaLQHeglLVHPfxOiQqdNmUy5C2lXz5dwC6tQNX2JW2Q==",
       "engines": {
         "node": ">=14.0.0"
       }
@@ -60,11 +60,11 @@
       }
     },
     "node_modules/react-router": {
-      "version": "6.22.0",
-      "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.0.tgz",
-      "integrity": "sha512-q2yemJeg6gw/YixRlRnVx6IRJWZD6fonnfZhN1JIOhV2iJCPeRNSH3V1ISwHf+JWcESzLC3BOLD1T07tmO5dmg==",
+      "version": "6.22.2",
+      "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.2.tgz",
+      "integrity": "sha512-YD3Dzprzpcq+tBMHBS822tCjnWD3iIZbTeSXMY9LPSG541EfoBGyZ3bS25KEnaZjLcmQpw2AVLkFyfgXY8uvcw==",
       "dependencies": {
-        "@remix-run/router": "1.15.0"
+        "@remix-run/router": "1.15.2"
       },
       "engines": {
         "node": ">=14.0.0"
@@ -74,12 +74,12 @@
       }
     },
     "node_modules/react-router-dom": {
-      "version": "6.22.0",
-      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.0.tgz",
-      "integrity": "sha512-z2w+M4tH5wlcLmH3BMMOMdrtrJ9T3oJJNsAlBJbwk+8Syxd5WFJ7J5dxMEW0/GEXD1BBis4uXRrNIz3mORr0ag==",
+      "version": "6.22.2",
+      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.2.tgz",
+      "integrity": "sha512-WgqxD2qySEIBPZ3w0sHH+PUAiamDeszls9tzqMPBDA1YYVucTBXLU7+gtRfcSnhe92A3glPnvSxK2dhNoAVOIQ==",
       "dependencies": {
-        "@remix-run/router": "1.15.0",
-        "react-router": "6.22.0"
+        "@remix-run/router": "1.15.2",
+        "react-router": "6.22.2"
       },
       "engines": {
         "node": ">=14.0.0"
@@ -98,9 +98,5 @@
         "loose-envify": "^1.1.0"
       }
     }
-  },
-  "name": "ASW",
-  "lockfileVersion": 3,
-  "requires": true,
-  "packages": {}
+  }
 }
diff --git a/webapp/src/components/GamesPanel.js b/webapp/src/components/GamesPanel.js
index d24fed8a..d24d9253 100644
--- a/webapp/src/components/GamesPanel.js
+++ b/webapp/src/components/GamesPanel.js
@@ -1,13 +1,22 @@
 import React from 'react';
 import Grid from '@mui/material/Grid';
 import Paper from '@mui/material/Paper';
-import Typography from '@mui/material/Typography';
+import {Typography, Button} from '@mui/material';
+import axios from 'axios';
 
 function Game({ title }) {
+    const apiEndpoint = process.env.REACT_APP_API_ENDPOINT || 'http://localhost:8000';
+    const question = async () => {
+        const response = await axios.post(`${apiEndpoint}/question`);
+    };
+
     return (
         <Grid item xs={4}>
             <Paper sx={{ p: 2, bgcolor: 'red' }}>
                 <Typography variant="h6">{title}</Typography>
+                <Button variant="contained" color="primary" onClick={question}>
+                    Question
+                </Button>
             </Paper>
         </Grid>
     );
@@ -17,8 +26,8 @@ function GamesPanel() {
     return (
         <Grid container spacing={2}>
             <Game title="Saber y ganar" />
-            <Game title="Elemento 2" />
-            <Game title="Elemento 3" />
+            <Game title=" " />
+            <Game title=" " />
         </Grid>
     );
 }