Ejemplo n.º 1
0
        public void JoinGame(UserId userId, GameId gameId, Color?color)
        {
            var user = _unitOfWork.WithUserTransaction(tran => {
                var user = _userRepository.FindById(userId);
                return(tran.CommitWith(user));
            });

            _unitOfWork.WithGameTransaction(tran => {
                var game = _gameRepository.FindByIdOrNull(gameId);

                if (game is null)
                {
                    throw new ManualValidationException("Game not found");
                }

                var idPool   = _idGenerator.ReservePool();
                var userInfo = new UserInfo(user.Id, user.Username, user.Rank);
                var player   = _gameFactory.BuildPlayer(idPool, userInfo, color ?? GetRemainingColor(game));
                game.JoinGame(player, player.CreatedAt);

                _gameRepository.Save(game);

                tran.Commit();
            });
        }