Ejemplo n.º 1
0
        public virtual Champion RecalculateChampion(int gameDefinitionId, ApplicationUser applicationUser, IDataContext toClearExistingChampion, bool allowedToClearExistingChampion = true)
        {
            var gameDefinition = _dataContext.FindById <GameDefinition>(gameDefinitionId);

            var championData = _championRepository.GetChampionData(gameDefinitionId);

            if (championData is NullChampionData)
            {
                if (allowedToClearExistingChampion)
                {
                    ClearChampionId(applicationUser, gameDefinition);
                }

                return(new NullChampion());
            }

            var existingChampion =
                _dataContext.GetQueryable <Champion>()
                .Include(champion => champion.GameDefinition)
                .FirstOrDefault(champion => champion.GameDefinitionId == gameDefinitionId && champion.GameDefinition.ChampionId == champion.Id);

            var newChampion = new Champion
            {
                WinPercentage    = championData.WinPercentage,
                NumberOfGames    = championData.NumberOfGames,
                NumberOfWins     = championData.NumberOfWins,
                GameDefinitionId = gameDefinitionId,
                PlayerId         = championData.PlayerId
            };

            Champion savedChampion;

            if (newChampion.SameChampion(existingChampion))
            {
                savedChampion = UpdateExistingChampionIfNecessary(applicationUser, existingChampion, newChampion);
            }
            else
            {
                savedChampion = _dataContext.Save(newChampion, applicationUser);
                _dataContext.CommitAllChanges();
                gameDefinition.PreviousChampionId = gameDefinition.ChampionId;
                gameDefinition.ChampionId         = savedChampion.Id;
                _dataContext.Save(gameDefinition, applicationUser);
            }

            return(savedChampion);
        }