1 var db
= require("../utils/database");
4 * Structure table Challenges:
8 * vid: variant id (int)
10 * fen: varchar (optional)
11 * timeControl: string (3m+2s, 7d+1d ...)
13 * Structure table WillPlay:
14 * cid: ref challenge id
16 * yes: boolean (false means "not decided yet")
19 const ChallengeModel
=
21 checkChallenge: function(c
)
23 if (!c
.vid
.match(/^[0-9]+$/))
24 return "Wrong variant ID";
26 if (!c
.timeControl
.match(/^[0-9dhms
+]+$/))
27 return "Wrong characters in time control";
29 if (!c
.fen
.match(/^[a-zA-Z0-9, /-]+$/))
30 return "Bad FEN string";
33 initializeWillPlay: function(uids
, cid
, cb
)
35 let query
= "INSERT INTO WillPlay VALUES ";
36 for (let i
=0; i
<uids
.length
; i
++)
38 query
+= "(false," + cid
+ "," + uids
[i
] + ")";
39 if (i
< uids
.length
-1)
45 // fen cannot be undefined
46 create: function(c
, cb
)
48 db
.serialize(function() {
50 "INSERT INTO Challenges " +
51 "(added, uid, vid, nbPlayers, fen, timeControl) VALUES " +
52 "(" + Date
.now() + "," + c
.uid
+ "," + c
.vid
+ "," + c
.nbPlayers
+
53 ",'" + c
.fen
+ "'," + c
.timeControl
+ ")";
54 db
.run(query
, err
=> {
57 db
.get("SELECT last_insert_rowid() AS rowid", (err2
,lastId
) => {
59 "INSERT INTO WillPlay VALUES " +
60 "(true," + lastId
["rowid"] + "," + c
.uid
+ ")";
61 db
.run(query
, (err
,ret
) => {
62 cb(err
, lastId
); //all we need is the challenge ID
69 getOne: function(id
, cb
)
71 db
.serialize(function() {
74 "FROM Challenges c " +
78 db
.get(query
, (err
,challengeInfo
) => {
82 "SELECT w.uid AS id, u.name " +
86 "WHERE w.cid = " + id
;
87 db
.run(query
, (err2
,players
) => {
92 uid: challengeInfo
.uid
,
93 vname: challengeInfo
.name
,
94 added: challengeInfo
.added
,
95 nbPlayers: challengeInfo
.nbPlayers
,
96 players: players
, //currently in
97 fen: challengeInfo
.fen
,
98 timeControl: challengeInfo
.timeControl
,
100 return cb(null, challenge
);
106 getByUser: function(uid
, cb
)
108 db
.serialize(function() {
112 "WHERE uid = " + uid
;
113 db
.run(query
, (err
,challIds
) => {
117 challIds
.forEach(cidRow
=> {
118 ChallengeModel
.getOne(cidRow
["cid"], (err2
,chall
) => {
121 challenges
.push(chall
);
124 return cb(null, challenges
);
129 getSeatCount: function(id
, cb
)
131 db
.serialize(function() {
133 "SELECT COUNT(*) AS scount " +
136 db
.get(query
, (err
,scRow
) => {
140 "SELECT nbPlayers " +
143 db
.get(query
, (err2
,chRow
) => {
146 cb(chRow
["nbPlayers"] - scRow
["scount"]);
152 setSeat: function(id
, uid
)
154 // TODO: remove extra "db.serialize" (parallelize by default)
155 //db.serialize(function() {
157 "INSERT OR REPLACE INTO WillPlay " +
158 "VALUES (true," + id
+ "," + uid
+")";
163 remove: function(id
, uid
)
165 db
.serialize(function() {
169 "WHERE id = " + id
+ " AND uid = " + uid
;
170 db
.run(query
, (err
,rows
) => {
171 if (rows
.length
> 0) //it's my challenge
173 db
.parallelize(function() {
175 "DELETE FROM Challenges " +
178 // Also remove matching WillPlay entries if a challenge was deleted
180 "DELETE FROM WillPlay " +
190 module
.exports
= ChallengeModel
;