cc8a17bb0a5810bae1017fa9e379990b2d79b238
[vchess.git] / server / routes / games.js
1 var router = require("express").Router();
2 var UserModel = require("../models/User");
3 var sendEmail = require('../utils/mailer');
4 var ChallengeModel = require('../models/Challenge');
5 var GameModel = require('../models/Game');
6 var VariantModel = require('../models/Variant');
7 var access = require("../utils/access");
8 var params = require("../config/parameters");
9
10 // Notify about a game (start, new move)
11 function tryNotify(uid, gid, vname, subject)
12 {
13 UserModel.getOne("id", uid, (err,user) => {
14 if (!!err && user.notify)
15 {
16 sendEmail(params.mailFrom, user.email, subject,
17 params.siteURL + "?v=" + vname + "&g=" + gid, err => {
18 res.json(err || {}); // TODO: log error somewhere.
19 }
20 );
21 }
22 });
23 }
24
25 // From main hall, start game between players 0 and 1
26 router.post("/games", access.logged, access.ajax, (req,res) => {
27 const gameInfo = JSON.parse(req.body.gameInfo);
28 if (!gameInfo.players.some(p => p.id == req.user.id))
29 return res.json({errmsg: "Cannot start someone else's game"});
30 const cid = req.body.cid;
31 ChallengeModel.remove(cid);
32 const fen = req.body.fen;
33 GameModel.create(
34 gameInfo.vid, gameInfo.fen, gameInfo.timeControl, gameInfo.players,
35 (err,ret) => {
36 access.checkRequest(res, err, game, "Cannot create game", () => {
37 const oppIdx = gameInfo.players[0].id == req.user.id ? 1 : 0;
38 const oppId = gameInfo.players[oppIdx].id;
39 UserModel.tryNotify(oppId,
40 "New game: " + params.siteURL + "/game/" + gid);
41 res.json({gameId: ret.gid});
42 });
43 }
44 );
45 });
46
47 router.get("/games", access.ajax, (req,res) => {
48 const gameId = req.query["gid"];
49 if (!!gameId)
50 {
51 GameModel.getOne(gameId, (err,game) => {
52 access.checkRequest(res, err, game, "Game not found", () => {
53 res.json({game: game});
54 });
55 });
56 }
57 else
58 {
59 // Get by (non-)user ID:
60 const userId = req.query["uid"];
61 const excluded = !!req.query["excluded"];
62 GameModel.getByUser(userId, excluded, (err,games) => {
63 if (!!err)
64 return res.json({errmsg: err.errmsg || err.toString()});
65 res.json({games: games});
66 });
67 }
68 });
69
70 // TODO:
71 router.put("/games", access.logged, access.ajax, (req,res) => {
72 let gid = ObjectId(req.body.gid);
73 let result = req.body.result;
74 // NOTE: only game-level life update is "gameover"
75 GameModel.gameOver(gid, result, ObjectId(req.user._id), (err,game) => {
76 access.checkRequest(res, err, game, "Cannot find game", () => {
77 res.json({});
78 });
79 });
80 });
81
82 // TODO: if newmove fail, takeback in GUI
83 // TODO: check move structure
84 // TODO: move should contain an optional "message" field ("corr chat" !)
85 router.post("/moves", access.logged, access.ajax, (req,res) => {
86 let gid = ObjectId(req.body.gid);
87 let fen = req.body.fen;
88 let vname = req.body.vname; //defined only if !!offlineOpp
89 // NOTE: storing the moves encoded lead to double stringify --> error at parsing
90 let move = JSON.parse(req.body.move);
91 GameModel.addMove(gid, move, fen, req._user._id, (err,game) => {
92 access.checkRequest(res, err, game, "Cannot find game", () => {
93 if (!!req.body.offlineOpp)
94 UserModel.tryNotify(ObjectId(req.body.offlineOpp), gid, vname, "New move");
95 res.json({});
96 });
97 });
98 });
99
100 module.exports = router;