User management logic half-debugged
[vchess.git] / models / User.js
index 66b1bf5..6e91458 100644 (file)
@@ -1,5 +1,6 @@
 var db = require("../utils/database");
 var maild = require("../utils/mailer.js");
+var TokenGen = require("../utils/tokenGenerator");
 
 /*
  * Structure:
@@ -15,13 +16,12 @@ var maild = require("../utils/mailer.js");
 // User creation
 exports.create = function(name, email, notify, callback)
 {
-       if (!notify)
-               notify = false; //default
        db.serialize(function() {
-               db.run(
+               const query =
                        "INSERT INTO Users " +
                        "(name, email, notify) VALUES " +
-                       "(" + name + "," + email + "," + notify + ")");
+                       "('" + name + "', '" + email + "', " + notify + ")";
+               db.run(query, callback); //TODO: need to get the inserted user (how ?)
        });
 }
 
@@ -30,10 +30,10 @@ exports.getOne = function(by, value, cb)
 {
        const delimiter = (typeof value === "string" ? "'" : "");
        db.serialize(function() {
-               db.get(
+               const query =
                        "SELECT * FROM Users " +
-                       "WHERE " + by " = " + delimiter + value + delimiter,
-                       callback);
+                       "WHERE " + by + " = " + delimiter + value + delimiter;
+               db.get(query, cb);
        });
 }
 
@@ -43,32 +43,48 @@ exports.getOne = function(by, value, cb)
 exports.setLoginToken = function(token, uid, cb)
 {
        db.serialize(function() {
-               db.run(
+               const query =
                        "UPDATE Users " +
                        "SET loginToken = " + token + " AND loginTime = " + Date.now() + " " +
-                       "WHERE id = " + uid);
+                       "WHERE id = " + uid;
+               db.run(query, cb);
        });
 }
 
-exports.setSessionToken = function(token, uid, cb)
+// Set session token only if empty (first login)
+// TODO: weaker security (but avoid to re-login everywhere after each logout)
+exports.trySetSessionToken = function(uid, cb)
 {
        // Also empty the login token to invalidate future attempts
        db.serialize(function() {
-               db.run(
-                       "UPDATE Users " +
-                       "SET loginToken = NULL AND sessionToken = " + token + " " +
-                       "WHERE id = " + uid);
+               const querySessionTOken =
+                       "SELECT sessionToken " +
+                       "FROM Users " +
+                       "WHERE id = " + uid;
+               db.get(querySessionToken, (err,token) => {
+                       if (!!err)
+                               return cb(err);
+                       const newToken = token || TokenGen.generate(params.token.length);
+                       const queryUpdate =
+                               "UPDATE Users " +
+                               "SET loginToken = NULL " +
+                               (!token ? "AND sessionToken = " + newToken + " " : "") +
+                               "WHERE id = " + uid;
+                       db.run(queryUpdate);
+                               cb(null, newToken);
+               });
        });
 }
 
-exports.updateSettings = function(name, email, notify, cb)
+exports.updateSettings = function(user, cb)
 {
        db.serialize(function() {
-               db.run(
+               const query =
                        "UPDATE Users " +
-                       "SET name = " + name +
-                       " AND email = " + email +
-                       " AND notify = " + notify + " " +
-                       "WHERE id = " + uid);
+                       "SET name = " + user.name +
+                       " AND email = " + user.email +
+                       " AND notify = " + user.notify + " " +
+                       "WHERE id = " + user._id;
+               db.run(query, cb);
        });
 }