public IActionResult PostCreateMove([FromBody] Validators.Move move)
        {
            Result result = this.CreateMove(move);

            if (result.ResultFunc == this.Ok)
            {
                PusherServer.Pusher pusher = Pusher.Pusher.Create();
                pusher.TriggerAsync(channelName: this.PRIVATE_GAME_CHANNELNAME + ((GameData)result.Data).id, eventName: "create_move", data: result.Data, options: new TriggerOptions()
                {
                    SocketId = move.socket_id
                });
            }

            return(result.ResultFunc(result.Data));
        }
        public Result CreateMove(Validators.Move move)
        {
            if (ModelState.IsValid == false)
            {
                return(new Result {
                    ResultFunc = this.BadRequest, Data = "Incorrect post data."
                });
            }

            //Check if game exists.
            Game game = this.db.Games.Where(x => x.id == move.game_id).Include(x => x.User1).Include(x => x.User2).Include(x => x.Moves).SingleOrDefault();

            if (game == null)
            {
                return(new Result {
                    ResultFunc = this.BadRequest, Data = "Game does not exist."
                });
            }

            //Check if the user is a player of this game.
            User user = (User)HttpContext.Items["user"];

            if (game.User1 != user && game.User2 != user)
            {
                return(new Result {
                    ResultFunc = this.BadRequest, Data = "This is not your game."
                });
            }

            //Check if the game has started.
            if (game.status != GameStatus.started)
            {
                switch (game.status)
                {
                case GameStatus.waiting_invite:
                case GameStatus.waiting_join:
                    return(new Result {
                        ResultFunc = this.BadRequest, Data = "This game hasn't started yet."
                    });

                case GameStatus.canceled:
                case GameStatus.finished:
                    return(new Result {
                        ResultFunc = this.BadRequest, Data = "This game has finished."
                    });
                }
            }

            //Check if it's his turn.
            if (user != this.DecideTurn(game))
            {
                return(new Result {
                    ResultFunc = this.BadRequest, Data = "It's not your turn."
                });
            }

            //Check if turn is valid(Position not already chosen).
            if (CheckPosition(game, move.position) == false)
            {
                return(new Result {
                    ResultFunc = this.BadRequest, Data = "Position already chosen."
                });
            }

            int move_count = this.db.Moves.Where(x => x.game_id == game.id).ToList().Count;

            //If move_count == 8 then this means this is the last set. So the game has been finished and it's a tie.
            //If it's not a tie, this is possible when the last move(count == 8). Then the winner will be set at winning move check.
            if (move_count == 8)
            {
                game.status      = GameStatus.finished;
                game.finished_at = DateTime.Now;
            }

            this.db.Add(new Move
            {
                user_id    = user.id,
                game_id    = game.id,
                position   = move.position,
                move_count = move_count
            });
            this.db.SaveChanges();

            //Check if it's a winning move.
            User winner;

            if ((winner = this.CheckGameForWin(game)) != null)
            {
                game.status      = GameStatus.finished;
                game.finished_at = DateTime.Now;
                game.UserWinner  = winner;
                this.db.SaveChanges();
            }

            return(new Result {
                ResultFunc = this.Ok, Data = this.FilterGameResults(game)
            });
        }