X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=server%2Fmodels%2FGame.js;h=0e42292eae3a4c148fada807452aa198cc54f8a8;hb=afc426016772300cc2812e8f96dd964bc6ae739d;hp=6f1513754adc03c5278556dd1ee324272af6731f;hpb=5d04793e1bce0d448b4ffc532f1e8eb47a72e972;p=vchess.git diff --git a/server/models/Game.js b/server/models/Game.js index 6f151375..0e42292e 100644 --- a/server/models/Game.js +++ b/server/models/Game.js @@ -6,19 +6,17 @@ 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: * gid: ref game id * uid: ref user id * color: character - * rtime: real (remaining time) * * Structure table Moves: * gid: ref game id - * move: varchar (description) + * squares: varchar (description) * message: text * played: datetime * idx: integer @@ -27,24 +25,23 @@ 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({ + 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, fen, score, timeControl) VALUES " + + "(" + vid + ",'" + fen + "','" + 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 " + + "(" + this.lastID + "," + p.id + ",'" + color + "')"; + db.run(query); + }); + cb(null, {gid: this.lastID}); }); }); }, @@ -53,40 +50,40 @@ const GameModel = getOne: function(id, cb) { db.serialize(function() { + // TODO: optimize queries? let query = - "SELECT v.name AS vname, g.fen, g.fenStart, g.score " + + "SELECT g.id, g.vid, g.fen, g.fenStart, g.timeControl, g.score, " + + "v.name AS vname " + "FROM Games g " + - "JOIN Variants v " + - " ON g.vid = v.id " - "WHERE id = " + id; + "JOIN Variants v " + + " ON g.vid = v.id " + + "WHERE g.id = " + id; db.get(query, (err,gameInfo) => { if (!!err) return cb(err); query = - "SELECT p.uid AS id, p.color, p.rtime, u.name " + + "SELECT p.uid, p.color, u.name " + "FROM Players p " + - "JOIN Users u " + - " ON p.uid = u.id " + + "JOIN Users u " + + " ON p.uid = u.id " + "WHERE p.gid = " + id; - db.run(query, (err2,players) => { + db.all(query, (err2,players) => { if (!!err2) return cb(err2); query = - "SELECT move AS desc, message, played, idx, color " + + "SELECT squares, 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 +102,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 +116,45 @@ 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) + { + db.parallelize(function() { + let query = + "UPDATE Games " + + "SET "; + if (!!obj.fen) + query += "fen = '" + obj.fen + "',"; + if (!!obj.score) + query += "score = '" + obj.score + "',"; + query = query.slice(0,-1); //remove last comma + query += " WHERE id = " + id; + db.run(query); + if (!!obj.move) + { + const m = obj.move; + query = + "INSERT INTO Moves (gid,squares,message,played,idx,color) VALUES " + + "(" + id + ",'" + JSON.stringify(m.squares) + "','" + m.message + + "'," + m.played + "," + m.idx + ",'" + m.color + "')"; + db.run(query); + } + }); + }, + remove: function(id) { db.parallelize(function() {