Small fix
[vchess.git] / server / models / Game.js
index 30d29c7..efdc20f 100644 (file)
@@ -6,8 +6,7 @@ var db = require("../utils/database");
  *   vid: integer (variant id)
  *   fenStart: varchar (initial position)
  *   fen: varchar (current position)
- *   mainTime: integer
- *   addTime: integer (increment)
+ *   timeControl: string
  *   score: varchar (result)
  *
  * Structure table Players:
@@ -27,24 +26,24 @@ var db = require("../utils/database");
 
 const GameModel =
 {
-       // mainTime and increment in milliseconds
-       create: function(vid, fen, mainTime, increment, players, cb)
+       create: function(vid, fen, timeControl, players, cb)
        {
                db.serialize(function() {
                        let query =
-                               "INSERT INTO Games (vid, fen, mainTime, addTime) " +
-                               "VALUES (" + vid + ",'" + fen + "'," + mainTime + "," + increment + ")";
-                       db.run(insertQuery, err => {
-                               if (!!err)
-                                       return cb(err);
-                               db.get("SELECT last_insert_rowid() AS rowid", (err2,lastId) => {
-                                       players.forEach(p => {
-                                               query =
-                                                       "INSERT INTO Players VALUES " +
-                                                       "(" + lastId["rowid"] + "," + p.id + "," + p.color + "," + mainTime + ")";
-                                               db.run(query, cb);
-                                       });
-                               });
+                               "INSERT INTO Games (vid, fenStart, score, timeControl) " +
+                               "VALUES (" + vid + ",'" + fen + "','*','" + timeControl + "')";
+      db.run(query, function(err) {
+        if (!!err)
+          return cb(err);
+        players.forEach((p,idx) => {
+          const color = (idx==0 ? "w" : "b");
+          query =
+            "INSERT INTO Players VALUES " +
+            // Remaining time = -1 means "unstarted"
+            "(" + this.lastID + "," + p.id + ",'" + color + "', -1)";
+          db.run(query);
+        });
+        cb(null, {gid: this.lastID});
                        });
                });
        },
@@ -54,39 +53,33 @@ const GameModel =
        {
                db.serialize(function() {
                        let query =
-                               "SELECT v.name AS vname, g.fen, g.fenStart, g.score " +
-                               "FROM Games g " +
-                               "JOIN Variants v " +
-                               "  ON g.vid = v.id "
+                               "SELECT * " +
+                               "FROM Games " +
                                "WHERE id = " + id;
                        db.get(query, (err,gameInfo) => {
                                if (!!err)
                                        return cb(err);
                                query =
-                                       "SELECT p.uid AS id, p.color, p.rtime, u.name " +
-                                       "FROM Players p " +
-                                       "JOIN Users u " +
-                                       "  ON p.uid = u.id " +
-                                       "WHERE p.gid = " + id;
-                               db.run(query, (err2,players) => {
+                                       "SELECT uid, color, rtime " +
+                                       "FROM Players " +
+                                       "WHERE gid = " + id;
+                               db.all(query, (err2,players) => {
                                        if (!!err2)
                                                return cb(err2);
                                        query =
-                                               "SELECT move AS desc, message, played, idx, color " +
+                                               "SELECT move, message, played, idx, color " +
                                                "FROM Moves " +
                                                "WHERE gid = " + id;
-                                       db.run(query, (err3,moves) => {
+                                       db.all(query, (err3,moves) => {
                                                if (!!err3)
                                                        return cb(err3);
-                                               const game = {
-                                                       id: id,
-                                                       vname: gameInfo.vname,
-                                                       fenStart: gameInfo.fenStart,
-                                                       fen: gameInfo.fen,
-                                                       score: gameInfo.score,
-                                                       players: players,
-                                                       moves: moves,
-                                               };
+                                               const game = Object.assign({},
+              gameInfo,
+                                                 {
+                                                         players: players,
+                                                         moves: moves
+              }
+            );
                                                return cb(null, game);
                                        });
                                });
@@ -105,6 +98,7 @@ const GameModel =
                        db.run(query, (err,gameIds) => {
                                if (!!err)
                                        return cb(err);
+        gameIds = gameIds || []; //might be empty
                                let gameArray = [];
                                gameIds.forEach(gidRow => {
                                        GameModel.getOne(gidRow["gid"], (err2,game) => {
@@ -118,6 +112,40 @@ const GameModel =
                });
        },
 
+  getPlayers: function(id, cb)
+  {
+    db.serialize(function() {
+      const query =
+        "SELECT id " +
+        "FROM Players " +
+        "WHERE gid = " + id;
+      db.all(query, (err,players) => {
+        return cb(err, players);
+      });
+    });
+  },
+
+  // obj can have fields move, fen and/or score
+  update: function(id, obj, cb)
+  {
+               db.serialize(function() {
+      let query =
+        "UPDATE Games " +
+        "SET ";
+      if (!!obj.move)
+        query += "move = " + obj.move + ","; //TODO: already stringified?!
+      if (!!obj.fen)
+        query += "fen = " + obj.fen + ",";
+      if (!!obj.score)
+        query += "score = " + obj.score + ",";
+      query = query.slice(0,-1); //remove last comma
+      query += " WHERE gameId = " + id;
+      db.run(query, (err) => {
+        cb(err);
+      });
+    });
+  },
+
        remove: function(id)
        {
                db.parallelize(function() {