'update'
[vchess.git] / server / models / Game.js
index 0949fc9..6755077 100644 (file)
@@ -8,6 +8,7 @@ var db = require("../utils/database");
  *   fen: varchar (current position)
  *   timeControl: string
  *   score: varchar (result)
+ *   created: datetime
  *
  * Structure table Players:
  *   gid: ref game id
@@ -28,8 +29,10 @@ const GameModel =
        {
                db.serialize(function() {
                        let query =
-                               "INSERT INTO Games (vid, fenStart, fen, score, timeControl) VALUES " +
-        "(" + vid + ",'" + fen + "','" + fen + "','*','" + timeControl + "')";
+                               "INSERT INTO Games"
+        + " (vid, fenStart, fen, score, timeControl, created, drawOffer)"
+        + " VALUES (" + vid + ",'" + fen + "','" + fen + "','*','"
+        + timeControl + "'," + Date.now() + "," + false + ")";
       db.run(query, function(err) {
         if (!!err)
           return cb(err);
@@ -131,13 +134,17 @@ const GameModel =
     });
   },
 
-  // obj can have fields move, fen and/or score
+  // obj can have fields move, message, fen, drawOffer and/or score
   update: function(id, obj)
   {
                db.parallelize(function() {
       let query =
         "UPDATE Games " +
         "SET ";
+      if (!!obj.message)
+        query += "message = message || ' ' || '" + obj.message + "',";
+      if (!!obj.drawOffer)
+        query += "drawOffer = " + obj.drawOffer + ",";
       if (!!obj.fen)
         query += "fen = '" + obj.fen + "',";
       if (!!obj.score)
@@ -149,9 +156,9 @@ const GameModel =
       {
         const m = obj.move;
         query =
-          "INSERT INTO Moves (gid, squares, message, played, idx) VALUES " +
-          "(" + id + ",'" + JSON.stringify(m.squares) + "','" + m.message +
-            "'," + m.played + "," + m.idx + ")";
+          "INSERT INTO Moves (gid, squares, played, idx) VALUES " +
+          "(" + id + ",'" + JSON.stringify(m.squares) + "',"
+            + m.played + "," + m.idx + ")";
         db.run(query);
       }
     });
@@ -174,6 +181,36 @@ const GameModel =
                        db.run(query);
                });
        },
+
+  cleanGamesDb: function()
+  {
+    const tsNow = Date.now();
+    // 86400000 = 24 hours in milliseconds
+    const day = 86400000;
+    db.serialize(function() {
+      let query =
+        "SELECT id,score " +
+        "FROM Games ";
+      db.all(query, (err,games) => {
+        games.forEach(g => {
+          query =
+            "SELECT max(played) AS lastMaj " +
+            "FROM Moves " +
+            "WHERE gid = " + g.id;
+          db.get(query, (err2,updated) => {
+            if (!updated && tsNow - g.created > 7*day)
+              return GameModel.remove(g.id);
+            const lastMaj = updated.lastMaj;
+            if (g.score != "*" && tsNow - lastMaj > 7*day ||
+              g.score == "*" && tsNow - lastMaj > 91*day)
+            {
+              GameModel.remove(g.id);
+            }
+          });
+        });
+      });
+    });
+  },
 }
 
 module.exports = GameModel;