From ed9c9c3741ec8b03cf899eae529216a2520bba0d Mon Sep 17 00:00:00 2001
From: Benjamin Auder <benjamin.auder@somewhere>
Date: Fri, 29 Nov 2019 14:57:04 +0100
Subject: [PATCH] Fix challenges retrieval from server

---
 client/src/views/Hall.vue | 25 ++++++++++++++++++++++---
 server/models/User.js     | 14 +++++++-------
 server/models/Variant.js  | 11 -----------
 server/routes/users.js    |  7 ++++++-
 4 files changed, 35 insertions(+), 22 deletions(-)

diff --git a/client/src/views/Hall.vue b/client/src/views/Hall.vue
index fb3ed630..4c80803a 100644
--- a/client/src/views/Hall.vue
+++ b/client/src/views/Hall.vue
@@ -148,8 +148,10 @@ export default {
           const uids = response.challenges.map(c => { return c.uid });
           ajax("/users",
             "GET",
-            { ids: uids },
-            names => {
+            { ids: uids.join(",") },
+            response2 => {
+              let names = {};
+              response2.users.forEach(u => {names[u.id] = u.name});
               this.challenges = this.challenges.concat(
                 response.challenges.map(c => {
                   // (just players names in fact)
@@ -163,6 +165,23 @@ export default {
           );
         }
       );
+      // TODO: I don't like this code below; improvement?
+      let retryForVnames = setInterval(() => {
+        if (this.st.variants.length > 0) //variants array is loaded
+        {
+          if (this.games.length > 0 && this.games[0].vname == "")
+          {
+            // Fix games' vnames:
+            this.games.forEach(g => { g.vname = this.getVname(g.vid); });
+          }
+          if (this.challenges.length > 0 && this.challenges[0].vname == "")
+          {
+            // Fix challenges' vnames:
+            this.challenges.forEach(c => { c.vname = this.getVname(c.vid); });
+          }
+          clearInterval(retryForVnames);
+        }
+      }, 50);
     }
     // 0.1] Ask server for room composition:
     const funcPollClients = () => {
@@ -207,7 +226,7 @@ export default {
     // TODO: ...filter(...)[0].name, one-line, just remove this function
     getVname: function(vid) {
       const vIdx = this.st.variants.findIndex(v => v.id == vid);
-      return this.st.variants[vIdx].name;
+      return vIdx >= 0 ? this.st.variants[vIdx].name : "";
     },
     getSid: function(pname) {
       const pIdx = this.people.findIndex(pl => pl.name == pname);
diff --git a/server/models/User.js b/server/models/User.js
index 7a0f70a7..60584275 100644
--- a/server/models/User.js
+++ b/server/models/User.js
@@ -63,14 +63,14 @@ const UserModel =
 		});
 	},
 
-  getByName: function(names, cb) {
-		db.serialize(function() {
-			const query =
-				"SELECT id " +
+  getByIds: function(ids, cb) {
+    db.serialize(function() {
+      const query =
+        "SELECT id, name " +
         "FROM Users " +
-				"WHERE name IN ('" + names.join("','") + "')";
-			db.all(query, cb);
-		});
+        "WHERE id IN (" + ids + ")";
+      db.all(query, cb);
+    });
   },
 
 	/////////
diff --git a/server/models/Variant.js b/server/models/Variant.js
index 233d938b..20bce4a9 100644
--- a/server/models/Variant.js
+++ b/server/models/Variant.js
@@ -9,17 +9,6 @@ var db = require("../utils/database");
 
 const VariantModel =
 {
-	getByName: function(name, callback)
-	{
-		db.serialize(function() {
-			const query =
-				"SELECT * " +
-				"FROM Variants " +
-				"WHERE name='" + name + "'";
-			db.get(query, callback);
-		});
-	},
-
 	getAll: function(callback)
 	{
 		db.serialize(function() {
diff --git a/server/routes/users.js b/server/routes/users.js
index a9995d7f..5b04ddd1 100644
--- a/server/routes/users.js
+++ b/server/routes/users.js
@@ -28,7 +28,12 @@ router.get("/whoami", access.ajax, (req,res) => {
 });
 
 router.get("/users", access.ajax, (req,res) => {
-  // TODO: list all names + id for users of given ID (query "ids")
+  const ids = req.query["ids"];
+  UserModel.getByIds(ids, (err,users) => {
+    if (!!err)
+      return res.json({errmsg: err.toString()});
+    return res.json({users:users});
+  });
 });
 
 // to: object user (to who we send an email)
-- 
2.44.0