Some advances in challenge handling (server+client)
[vchess.git] / server / models / Challenge.js
CommitLineData
8d7e2786
BA
1var db = require("../utils/database");
2
3/*
00f2759e
BA
4 * Structure table Challenges:
5 * id: integer
6 * added: datetime
7 * uid: user id (int)
8 * vid: variant id (int)
9 * nbPlayers: integer
ab4f4bf2 10 * fen: varchar (optional)
052d17ea 11 * timeControl: string (3m+2s, 7d+1d ...)
00f2759e
BA
12 *
13 * Structure table WillPlay:
14 * cid: ref challenge id
15 * uid: ref user id
8d7e2786
BA
16 */
17
ab4f4bf2 18const ChallengeModel =
8d7e2786 19{
98db2082
BA
20 checkChallenge: function(c)
21 {
052d17ea
BA
22 if (!c.vid.match(/^[0-9]+$/))
23 return "Wrong variant ID";
98db2082 24
052d17ea
BA
25 if (!c.timeControl.match(/^[0-9dhms +]+$/))
26 return "Wrong characters in time control";
98db2082 27
052d17ea
BA
28 if (!c.nbPlayers.match(/^[0-9]+$/))
29 return "Wrong number of players";
98db2082 30
052d17ea 31 if (!c.fen.match(/^[a-zA-Z0-9, /-]+$/))
98db2082
BA
32 return "Bad FEN string";
33 },
34
052d17ea 35 // fen cannot be undefined
ab4f4bf2
BA
36 create: function(c, cb)
37 {
38 db.serialize(function() {
39 let query =
74ea2e8d 40 "INSERT INTO Challenges " +
052d17ea 41 "(added, uid, vid, nbPlayers, fen, timeControl) VALUES " +
74ea2e8d 42 "(" + Date.now() + "," + c.uid + "," + c.vid + "," + c.nbPlayers +
052d17ea 43 ",'" + c.fen + "'," + c.timeControl + ")";
ab4f4bf2
BA
44 db.run(query, err => {
45 if (!!err)
46 return cb(err);
47 db.get("SELECT last_insert_rowid() AS rowid", (err2,lastId) => {
052d17ea
BA
48
49 // TODO: also insert "will play" "no" for other players ?
50 // willplay = "maybe" by default ?
51
52 query =
ab4f4bf2 53 "INSERT INTO WillPlay VALUES " +
052d17ea 54 "(true," + lastId["rowid"] + "," + c.uid + ")";
ab4f4bf2
BA
55 db.run(query, (err,ret) => {
56 cb(err, lastId); //all we need is the challenge ID
57 });
58 });
59 });
60 });
61 },
62
63 getOne: function(id, cb)
64 {
65 db.serialize(function() {
66 let query =
67 "SELECT * " +
68 "FROM Challenges c " +
69 "JOIN Variants v " +
70 " ON c.vid = v.id "
71 "WHERE id = " + id;
72 db.get(query, (err,challengeInfo) => {
73 if (!!err)
74 return cb(err);
00f2759e 75 query =
ab4f4bf2
BA
76 "SELECT w.uid AS id, u.name " +
77 "FROM WillPlay w " +
78 "JOIN Users u " +
79 " ON w.uid = u.id " +
80 "WHERE w.cid = " + id;
81 db.run(query, (err2,players) => {
82 if (!!err2)
83 return cb(err2);
84 const challenge = {
85 id: id,
74ea2e8d 86 uid: challengeInfo.uid,
ab4f4bf2
BA
87 vname: challengeInfo.name,
88 added: challengeInfo.added,
89 nbPlayers: challengeInfo.nbPlayers,
90 players: players, //currently in
91 fen: challengeInfo.fen,
052d17ea 92 timeControl: challengeInfo.timeControl,
ab4f4bf2
BA
93 };
94 return cb(null, challenge);
00f2759e
BA
95 });
96 });
97 });
ab4f4bf2 98 },
8d7e2786 99
ab4f4bf2
BA
100 getByUser: function(uid, cb)
101 {
102 db.serialize(function() {
103 const query =
104 "SELECT cid " +
105 "FROM WillPlay " +
106 "WHERE uid = " + uid;
107 db.run(query, (err,challIds) => {
108 if (!!err)
109 return cb(err);
110 let challenges = [];
111 challIds.forEach(cidRow => {
112 ChallengeModel.getOne(cidRow["cid"], (err2,chall) => {
113 if (!!err2)
114 return cb(err2);
115 challenges.push(chall);
116 });
117 });
118 return cb(null, challenges);
00f2759e
BA
119 });
120 });
ab4f4bf2 121 },
8d7e2786 122
ab4f4bf2
BA
123 remove: function(id)
124 {
125 db.parallelize(function() {
126 let query =
127 "DELETE FROM Challenges " +
128 "WHERE id = " + id;
129 db.run(query);
130 query =
131 "DELETE FROM WillPlay " +
132 "WHERE cid = " + id;
133 db.run(query);
134 });
135 },
8d7e2786 136}
ab4f4bf2
BA
137
138module.exports = ChallengeModel;