Start server implementation for correspondance play (early debug stage)
[vchess.git] / models / Game.js
index 72f1ea8..23a74e8 100644 (file)
@@ -4,102 +4,137 @@ var db = require("../utils/database");
  * Structure table Games:
  *   id: game id (int)
  *   vid: integer (variant id)
- *   fen: varchar (initial position)
+ *   fenStart: varchar (initial position)
+ *   fen: varchar (current position)
  *   mainTime: integer
- *   increment: integer
+ *   addTime: integer (increment)
  *   score: varchar (result)
  *
  * Structure table Players:
  *   gid: ref game id
  *   uid: ref user id
  *   color: character
+ *   rtime: real (remaining time)
  *
  * Structure table Moves:
+ *   gid: ref game id
  *   move: varchar (description)
+ *   message: text
  *   played: datetime
  *   idx: integer
  *   color: character
  */
 
-exports.create = function(vid, fen, mainTime, increment, players, cb)
+const GameModel =
 {
-       db.serialize({
-               let query =
-                       "INSERT INTO Games (vid, fen, mainTime, increment) " +
-                       "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 + ")";
-                                       db.run(query, cb);
+       // mainTime and increment in milliseconds
+       create: function(vid, fen, mainTime, increment, players, cb)
+       {
+               db.serialize({
+                       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);
+                                       });
                                });
                        });
                });
-       });
-}
+       },
 
-// TODO: queries here could be async, and wait for all to complete
-exports.getOne = function(id, cb)
-{
-       db.serialize(function() {
-               let query =
-                       "SELECT v.name AS vname, g.fen, g.score " +
-                       "FROM Games g " +
-                       "JOIN Variants v " +
-                       "  ON g.vid = v.id "
-                       "WHERE id = " + id;
-               db.get(query, (err,gameInfo) => {
-                       if (!!err)
-                               return cb(err);
-                       query =
-                               "SELECT p.uid AS id, p.color, u.name " +
-                               "FROM Players p " +
-                               "JOIN Users u " +
-                               "  ON p.uid = u.id " +
-                               "WHERE p.gid = " + id;
-                       db.run(query, (err2,players) => {
-                               if (!!err2)
-                                       return cb(err2);
+       // TODO: queries here could be async, and wait for all to complete
+       getOne: function(id, cb)
+       {
+               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 "
+                               "WHERE id = " + id;
+                       db.get(query, (err,gameInfo) => {
+                               if (!!err)
+                                       return cb(err);
                                query =
-                                       "SELECT move AS desc, played, idx, color " +
-                                       "FROM Moves " +
-                                       "WHERE gid = " + id;
-                               db.run(query, (err3,moves) => {
-                                       if (!!err3)
-                                               return cb(err3);
-                                       const game = {
-                                               id: id,
-                                               vname: gameInfo.vname,
-                                               fen: gameInfo.fen,
-                                               score: gameInfo.score,
-                                               players: players,
-                                               moves: moves,
-                                       };
-                                       return cb(null, game);
+                                       "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) => {
+                                       if (!!err2)
+                                               return cb(err2);
+                                       query =
+                                               "SELECT move AS desc, message, played, idx, color " +
+                                               "FROM Moves " +
+                                               "WHERE gid = " + id;
+                                       db.run(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,
+                                               };
+                                               return cb(null, game);
+                                       });
                                });
                        });
                });
-       });
-}
+       },
 
-exports.remove = function(id)
-{
-       db.parallelize(function() {
-               let query =
-                       "DELETE FROM Games " +
-                       "WHERE id = " + id;
-               db.run(query);
-               query =
-                       "DELETE FROM Players " +
-                       "WHERE gid = " + id;
-               db.run(query);
-               query =
-                       "DELETE FROM Moves " +
-                       "WHERE gid = " + id;
-               db.run(query);
-       });
+       getByUser: function(uid, cb)
+       {
+               db.serialize(function() {
+                       // Next query is fine because a player appear at most once in a game
+                       const query =
+                               "SELECT gid " +
+                               "FROM Players " +
+                               "WHERE uid = " + uid;
+                       db.run(query, (err,gameIds) => {
+                               if (!!err)
+                                       return cb(err);
+                               let gameArray = [];
+                               gameIds.forEach(gidRow => {
+                                       GameModel.getOne(gidRow["gid"], (err2,game) => {
+                                               if (!!err2)
+                                                       return cb(err2);
+                                               gameArray.push(game);
+                                       });
+                               });
+                               return cb(null, gameArray);
+                       });
+               });
+       },
+
+       remove: function(id)
+       {
+               db.parallelize(function() {
+                       let query =
+                               "DELETE FROM Games " +
+                               "WHERE id = " + id;
+                       db.run(query);
+                       query =
+                               "DELETE FROM Players " +
+                               "WHERE gid = " + id;
+                       db.run(query);
+                       query =
+                               "DELETE FROM Moves " +
+                               "WHERE gid = " + id;
+                       db.run(query);
+               });
+       },
 }
+
+module.exports = GameModel;