From f05815d7da84284bd9d7c1ce5b808acd675f2a3e Mon Sep 17 00:00:00 2001
From: Benjamin Auder <benjamin.auder@somewhere>
Date: Wed, 20 Mar 2019 17:20:22 +0100
Subject: [PATCH] Small fixes + add some debug traces

---
 client/src/components/UpsertUser.vue | 233 ++++++++++++++-------------
 client/src/views/Hall.vue            |  32 ++--
 server/config/parameters.js.dist     |   2 +-
 server/models/Challenge.js           |   6 +-
 server/routes/challenges.js          |   2 +-
 server/routes/users.js               |   6 +-
 6 files changed, 150 insertions(+), 131 deletions(-)

diff --git a/client/src/components/UpsertUser.vue b/client/src/components/UpsertUser.vue
index 5ea93a05..86f8558d 100644
--- a/client/src/components/UpsertUser.vue
+++ b/client/src/components/UpsertUser.vue
@@ -34,120 +34,129 @@ div
 
 <script>
 import { store } from "@/store";
+import { checkNameEmail } from "@/data/userCheck";
+import { ajax } from "@/utils/ajax";
 export default {
   name: 'my-upsert-user',
-	data: function() {
-		return {
-			user: store.state.user, //initialized with global user object
-			nameOrEmail: "", //for login
-			stage: (!store.state.user.id ? "Login" : "Update"),
-			infoMsg: "",
-			enterTime: Number.MAX_SAFE_INTEGER, //for a basic anti-bot strategy
-		};
-	},
-	computed: {
-		submitMessage: function() {
-			switch (this.stage)
-			{
-				case "Login":
-					return "Go";
-				case "Register":
-					return "Send";
-				case "Update":
-					return "Apply";
-			}
-		},
-		displayInfo: function() {
-			return (this.infoMsg.length > 0 ? "block" : "none");
-		},
-	},
-	methods: {
-		trySetEnterTime: function(event) {
-			if (!!event.target.checked)
-				this.enterTime = Date.now();
-		},
-		toggleStage: function() {
-			// Loop login <--> register (update is for logged-in users)
-			this.stage = (this.stage == "Login" ? "Register" : "Login");
-		},
-		ajaxUrl: function() {
-			switch (this.stage)
-			{
-				case "Login":
-					return "/sendtoken";
-				case "Register":
-					return "/register";
-				case "Update":
-					return "/update";
-			}
-		},
-		ajaxMethod: function() {
-			switch (this.stage)
-			{
-				case "Login":
-					return "GET";
-				case "Register":
-					return "POST";
-				case "Update":
-					return "PUT";
-			}
-		},
-		infoMessage: function() {
-			switch (this.stage)
-			{
-				case "Login":
-					return "Connection token sent. Check your emails!";
-				case "Register":
-					return "Registration complete! Please check your emails.";
-				case "Update":
-					return "Modifications applied!";
-			}
-		},
-		onSubmit: function() {
-			// Basic anti-bot strategy:
-			const exitTime = Date.now();
-			if (this.stage == "Register" && exitTime - this.enterTime < 5000)
-				return; //silently return, in (curious) case of it was legitimate
-			let error = undefined;
-			if (this.stage == 'Login')
-			{
-				const type = (this.nameOrEmail.indexOf('@') >= 0 ? "email" : "name");
-				error = checkNameEmail({[type]: this.nameOrEmail});
-			}
-			else
-				error = checkNameEmail(this.user);
-			if (!!error)
-				return alert(error);
-			this.infoMsg = "Processing... Please wait";
-			ajax(this.ajaxUrl(), this.ajaxMethod(),
-				this.stage == "Login" ? { nameOrEmail: this.nameOrEmail } : this.user,
-				res => {
-					this.infoMsg = this.infoMessage();
-					if (this.stage != "Update")
-					{
-						this.nameOrEmail = "";
-						this.user["email"] = "";
-						this.user["name"] = "";
-						// Store our identifiers in local storage (by little anticipation...)
-						localStorage["myid"] = res.id;
-						localStorage["myname"] = res.name;
+  data: function() {
+    return {
+      user: store.state.user, //initialized with global user object
+      nameOrEmail: "", //for login
+      stage: (!store.state.user.id ? "Login" : "Update"),
+      infoMsg: "",
+      enterTime: Number.MAX_SAFE_INTEGER, //for a basic anti-bot strategy
+    };
+  },
+  computed: {
+    submitMessage: function() {
+      switch (this.stage)
+      {
+        case "Login":
+          return "Go";
+        case "Register":
+          return "Send";
+        case "Update":
+          return "Apply";
+      }
+    },
+    displayInfo: function() {
+      return (this.infoMsg.length > 0 ? "block" : "none");
+    },
+  },
+  methods: {
+    trySetEnterTime: function(event) {
+      if (!!event.target.checked)
+        this.enterTime = Date.now();
+    },
+    toggleStage: function() {
+      // Loop login <--> register (update is for logged-in users)
+      this.stage = (this.stage == "Login" ? "Register" : "Login");
+    },
+    ajaxUrl: function() {
+      switch (this.stage)
+      {
+        case "Login":
+          return "/sendtoken";
+        case "Register":
+          return "/register";
+        case "Update":
+          return "/update";
+      }
+    },
+    ajaxMethod: function() {
+      switch (this.stage)
+      {
+        case "Login":
+          return "GET";
+        case "Register":
+          return "POST";
+        case "Update":
+          return "PUT";
+      }
+    },
+    infoMessage: function() {
+      switch (this.stage)
+      {
+        case "Login":
+          return "Connection token sent. Check your emails!";
+        case "Register":
+          return "Registration complete! Please check your emails.";
+        case "Update":
+          return "Modifications applied!";
+      }
+    },
+    onSubmit: function() {
+      // Basic anti-bot strategy:
+      const exitTime = Date.now();
+      if (this.stage == "Register" && exitTime - this.enterTime < 5000)
+        return; //silently return, in (curious) case of it was legitimate
+      let error = undefined;
+      if (this.stage == 'Login')
+      {
+        const type = (this.nameOrEmail.indexOf('@') >= 0 ? "email" : "name");
+        error = checkNameEmail({[type]: this.nameOrEmail});
+      }
+      else
+        error = checkNameEmail(this.user);
+      if (!!error)
+        return alert(error);
+      this.infoMsg = "Processing... Please wait";
+      ajax(this.ajaxUrl(), this.ajaxMethod(),
+        this.stage == "Login" ? { nameOrEmail: this.nameOrEmail } : this.user,
+        res => {
+
+          console.log("receive login infos");
+          console.log(res);
+
+          this.infoMsg = this.infoMessage();
+          if (this.stage != "Update")
+          {
+            this.nameOrEmail = "";
+            this.user["email"] = "";
+            this.user["name"] = "";
+            
+            debugger; //TODO: 2 passages ici au lieu d'1 lors du register
+            
+            // Store our identifiers in local storage (by little anticipation...)
+            localStorage["myid"] = res.id;
+            localStorage["myname"] = res.name;
             // Also in global object
-            this.$user.id = res.id;
-            this.$user.name = res.name;
-					}
-					setTimeout(() => {
-						this.infoMsg = "";
-						if (this.stage == "Register")
-							this.stage = "Login";
-						document.getElementById("modalUser").checked = false;
-					}, 2000);
-				},
-				err => {
-					this.infoMsg = "";
-					alert(err);
-				}
-			);
-		},
-	},
+            this.st.user.id = res.id;
+            this.st.user.name = res.name;
+          }
+          setTimeout(() => {
+            this.infoMsg = "";
+            if (this.stage == "Register")
+              this.stage = "Login";
+            document.getElementById("modalUser").checked = false;
+          }, 2000);
+        },
+        err => {
+          this.infoMsg = "";
+          alert(err);
+        }
+      );
+    },
+  },
 };
 </script>
diff --git a/client/src/views/Hall.vue b/client/src/views/Hall.vue
index e499d7ec..77ca7718 100644
--- a/client/src/views/Hall.vue
+++ b/client/src/views/Hall.vue
@@ -125,6 +125,8 @@ export default {
   created: function() {
     // Always add myself to players' list
     this.players.push(this.st.user);
+    if (this.st.user.id > 0)
+    {
     // Ask server for current corr games (all but mines)
 //    ajax(
 //      "/games",
@@ -134,17 +136,18 @@ export default {
 //        this.games = this.games.concat(response.games);
 //      }
 //    );
-    // Also ask for corr challenges (open + personal to me)
-    ajax(
-      "/challenges",
-      "GET",
-      {uid: this.st.user.id},
-      response => {
-        console.log(response.challenges);
-        // TODO: post-treatment on challenges ?
-        this.challenges = this.challenges.concat(response.challenges);
-      }
-    );
+    // Also ask for corr challenges (open + sent to me)
+      ajax(
+        "/challenges",
+        "GET",
+        {uid: this.st.user.id},
+        response => {
+          console.log(response.challenges);
+          // TODO: post-treatment on challenges ?
+          this.challenges = this.challenges.concat(response.challenges);
+        }
+      );
+    }
     // 0.1] Ask server for room composition:
     const socketOpenListener = () => {
       this.st.conn.send(JSON.stringify({code:"pollclients"}));
@@ -394,8 +397,8 @@ export default {
         {
           this.players.push({name:"", id:0, sid:data.sid});
           this.st.conn.send(JSON.stringify({code:"askidentity", target:data.sid}));
-          this.st.conn.send(JSON.stringify({code:"askchallenge", target:sid}));
-          this.st.conn.send(JSON.stringify({code:"askgame", target:sid}));
+          this.st.conn.send(JSON.stringify({code:"askchallenge", target:data.sid}));
+          this.st.conn.send(JSON.stringify({code:"askgame", target:data.sid}));
           break;
         }
         case "disconnect":
@@ -549,8 +552,7 @@ export default {
         }
       }
     },
-    // c.type == corr alors use id...sinon sid (figés)
-    // NOTE: only for live games ?
+    // NOTE: for live games only (corr games are launched on server)
     launchGame: async function(c) {
       // Just assign colors and pass the message
       const vname = this.getVname(c.vid);
diff --git a/server/config/parameters.js.dist b/server/config/parameters.js.dist
index 2b0a6e7f..14c100a2 100644
--- a/server/config/parameters.js.dist
+++ b/server/config/parameters.js.dist
@@ -1,7 +1,7 @@
 module.exports =
 {
 	// For mail sending. NOTE: *no trailing slash*
-	siteURL: "http://localhost:3000",
+	siteURL: "http://localhost:8080",
 
 	// To know in which environment the code run
 	env: process.env.NODE_ENV || 'development',
diff --git a/server/models/Challenge.js b/server/models/Challenge.js
index 6f8ba0be..a5fbf63e 100644
--- a/server/models/Challenge.js
+++ b/server/models/Challenge.js
@@ -78,12 +78,15 @@ const ChallengeModel =
 			db.get(query, (err,challengeInfo) => {
 				if (!!err)
 					return cb(err);
+        let condition = "";
+        if (!!challengeInfo.to[0])
+          condition = " AND u.name in (" + challengeInfo.to.join(",") + ")";
 				query =
 					"SELECT w.uid AS id, u.name " +
 					"FROM WillPlay w " +
 					"JOIN Users u " +
 					"  ON w.uid = u.id " +
-					"WHERE w.cid = " + id;
+					"WHERE w.cid = " + id + condition;
 				db.run(query, (err2,players) => {
 					if (!!err2)
 						return cb(err2);
@@ -113,6 +116,7 @@ const ChallengeModel =
 			db.run(query, (err,challIds) => {
 				if (!!err)
 					return cb(err);
+        challIds = challIds || [];
 				let challenges = [];
 				challIds.forEach(cidRow => {
 					ChallengeModel.getOne(cidRow["cid"], (err2,chall) => {
diff --git a/server/routes/challenges.js b/server/routes/challenges.js
index 84b2c83b..3f6840c0 100644
--- a/server/routes/challenges.js
+++ b/server/routes/challenges.js
@@ -5,7 +5,7 @@ const access = require("../utils/access");
 const ChallengeModel = require("../models/Challenge");
 const UserModel = require("../models/User"); //for name check
 
-router.get("/challenges", access.logged, access.ajax, (req,res) => {
+router.get("/challenges", (req,res) => {
   ChallengeModel.getByUser(req.query["uid"], (err,challenges) => {
     res.json(err || {challenges:challenges});
   });
diff --git a/server/routes/users.js b/server/routes/users.js
index 8df0c43e..1d9b0423 100644
--- a/server/routes/users.js
+++ b/server/routes/users.js
@@ -21,7 +21,11 @@ function setAndSendLoginToken(subject, to, res)
 			params.siteURL + "/authenticate?token=" + token + "\\n" +
 			"Token will expire in " + params.token.expire/(1000*60) + " minutes."
 		sendEmail(params.mail.noreply, to.email, subject, body, err => {
-			// "id" is generally the only info missing on client side,
+			
+      console.log("send login infos ::");
+      console.log(to);
+      
+      // "id" is generally the only info missing on client side,
 			// but the name is also unknown if log-in with the email.
 			res.json(err || {id: to.id, name: to.name});
 		});
-- 
2.44.0