X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=models%2FChallenge.js;h=96db0a2b431ad5237d8b08b4bcfceca3c4155212;hb=b955c65b942d09d24b5c3bed0d755d4f2f8f71f1;hp=9980921c96baa85863667d4f2bbc757ef52cecd3;hpb=8d7e2786f5a67a1b9a77c742d7951e0efbe8747d;p=vchess.git diff --git a/models/Challenge.js b/models/Challenge.js index 9980921c..96db0a2b 100644 --- a/models/Challenge.js +++ b/models/Challenge.js @@ -1,79 +1,121 @@ var db = require("../utils/database"); /* - * Structure: - * _id: BSON id - * vid: variant ID - * from: player ID - * to: player ID, undefined if automatch + * Structure table Challenges: + * id: integer + * added: datetime + * uid: user id (int) + * vid: variant id (int) + * nbPlayers: integer + * fen: varchar (optional) + * mainTime: integer + * addTime: integer + * + * Structure table WillPlay: + * cid: ref challenge id + * uid: ref user id */ -exports.create = function(vid, from, to, callback) +const ChallengeModel = { - let chall = { - "vid": vid, - "from": from - }; - if (!!to) - chall.to = to; - db.challenges.insert(chall, callback); -} - -////////// -// GETTERS - -exports.getById = function(cid, callback) -{ - db.challenges.findOne({_id: cid}, callback); -} - -// For index page: obtain challenges that the player can accept -exports.getByPlayer = function(uid, callback) -{ - db.challenges.aggregate( - {$match: {$or: [ - {"to": uid}, - {$and: [{"from": {$ne: uid}}, {"to": {$exists: false}}]} - ]}}, - {$project: {_id:0, vid:1}}, - {$group: {_id:"$vid", count:{$sum:1}}}, - callback); -} - -// For variant page (challenges related to a player) -exports.getByVariant = function(uid, vid, callback) -{ - db.challenges.find({$and: [ - {"vid": vid}, - {$or: [ - {"to": uid}, - {"from": uid}, - {"to": {$exists: false}}, - ]} - ]}, callback); -} + // fen cannot be undefined; TODO: generate fen on server instead + create: function(c, cb) + { + db.serialize(function() { + let query = + "INSERT INTO Challenges " + + "(added, uid, vid, nbPlayers, fen, mainTime, addTime) VALUES " + + "(" + Date.now() + "," + c.uid + "," + c.vid + "," + c.nbPlayers + + ",'" + c.fen + "'," + c.mainTime + "," + c.increment + ")"; + db.run(query, err => { + if (!!err) + return cb(err); + db.get("SELECT last_insert_rowid() AS rowid", (err2,lastId) => { + query = + "INSERT INTO WillPlay VALUES " + + "(" + lastId["rowid"] + "," + c.uid + ")"; + db.run(query, (err,ret) => { + cb(err, lastId); //all we need is the challenge ID + }); + }); + }); + }); + }, -////////// -// REMOVAL + getOne: function(id, cb) + { + db.serialize(function() { + let query = + "SELECT * " + + "FROM Challenges c " + + "JOIN Variants v " + + " ON c.vid = v.id " + "WHERE id = " + id; + db.get(query, (err,challengeInfo) => { + if (!!err) + return cb(err); + query = + "SELECT w.uid AS id, u.name " + + "FROM WillPlay w " + + "JOIN Users u " + + " ON w.uid = u.id " + + "WHERE w.cid = " + id; + db.run(query, (err2,players) => { + if (!!err2) + return cb(err2); + const challenge = { + id: id, + uid: challengeInfo.uid, + vname: challengeInfo.name, + added: challengeInfo.added, + nbPlayers: challengeInfo.nbPlayers, + players: players, //currently in + fen: challengeInfo.fen, + mainTime: challengeInfo.mainTime, + increment: challengeInfo.addTime, + }; + return cb(null, challenge); + }); + }); + }); + }, -exports.remove = function(cid, callback) -{ - db.challenges.remove({_id: cid}, callback); -} + getByUser: function(uid, cb) + { + db.serialize(function() { + const query = + "SELECT cid " + + "FROM WillPlay " + + "WHERE uid = " + uid; + db.run(query, (err,challIds) => { + if (!!err) + return cb(err); + let challenges = []; + challIds.forEach(cidRow => { + ChallengeModel.getOne(cidRow["cid"], (err2,chall) => { + if (!!err2) + return cb(err2); + challenges.push(chall); + }); + }); + return cb(null, challenges); + }); + }); + }, -// Remove challenges older than 1 month, and 1to1 older than 36h -exports.removeOld = function() -{ - var tsNow = new Date().getTime(); - // 86400000 = 24 hours in milliseconds - var day = 86400000; - db.challenges.find({}, (err,challengeArray) => { - challengeArray.forEach( c => { - if (c._id.getTimestamp() + 30*day < tsNow //automatch - || (!!c.to && c._id.getTimestamp() + 1.5*day < tsNow)) //1 to 1 - { - db.challenges.remove({"_id": c._id}); - } + remove: function(id) + { + db.parallelize(function() { + let query = + "DELETE FROM Challenges " + + "WHERE id = " + id; + db.run(query); + query = + "DELETE FROM WillPlay " + + "WHERE cid = " + id; + db.run(query); }); - }); + }, } + +module.exports = ChallengeModel;