Esempio n. 1
0
        public async Task ChangeUserAchievementsAsync(AssignAchievementsToUserModel model, Guid userId, CancellationToken cancellationToken)
        {
            var user = await _userRepository.GetByIdAsync(userId, cancellationToken);

            var page = new PagingInfo
            {
                CurrentPage = 1,
                PageSize    = 0
            };
            var currentAchievements = (await _userAchievementRepository.GetAllAchievementsByUserAsync(page, userId, cancellationToken)).Data.ToList();
            var achievementsGroups  = currentAchievements.GroupBy(i => i.Achievement.Id).ToArray();

            foreach (var achievementWithCount in model.Achievements)
            {
                var achievementsGroup = achievementsGroups
                                        .FirstOrDefault(i => i.Key == achievementWithCount.AchievementId);

                if (achievementsGroup == null)
                {
                    for (var i = 0; i < achievementWithCount.Count; i++)
                    {
                        var achievement = await _achievementRepository.GetByIdAsync(achievementWithCount.AchievementId, cancellationToken);
                        await AddAchievementToUser(achievement, user, cancellationToken);
                        await CreateEventAsync(user, $"Got achievement {achievement.Name}", GamificationEnums.EventType.Records, cancellationToken);
                    }
                }
                else
                {
                    for (var i = achievementsGroup.Count(); i < achievementWithCount.Count; i++)
                    {
                        var achievement = achievementsGroup.First().Achievement;
                        await AddAchievementToUser(achievement, user, cancellationToken);
                        await CreateEventAsync(user, $"Got achievement {achievement.Name}", GamificationEnums.EventType.Records, cancellationToken);
                    }

                    for (int i = achievementsGroup.Count(), j = 0; i > achievementWithCount.Count; i--, j++)
                    {
                        var lastAchievement = achievementsGroup
                                              .OrderByDescending(a => a.AddedTime)
                                              .Skip(j)
                                              .First();

                        lastAchievement.User.XP -= lastAchievement.Achievement.XP;
                        lastAchievement.User.XP  = lastAchievement.User.XP >= 0 ? lastAchievement.User.XP : 0;

                        _userRepository.Update(lastAchievement.User);

                        _userAchievementRepository.Delete(lastAchievement);
                    }
                }
            }

            _userRepository.Update(user);

            await _unitOfWork.SaveChangesAsync(cancellationToken);
        }
Esempio n. 2
0
        public async Task <IActionResult> UpdateUserAchievements([FromBody] AssignAchievementsToUserModel model, Guid userId, CancellationToken cancellationToken)
        {
            var user = await _userService.GetShortUserByIdAsync(userId, cancellationToken);

            if (user == null)
            {
                return(NotFound());
            }

            await _userAchievementService.ChangeUserAchievementsAsync(model, userId, cancellationToken);

            return(Ok());
        }
Esempio n. 3
0
        public async Task ChangeUserAchievementsAsync_ValidAssignAchievementsToUserModel(AssignAchievementsToUserModel model)
        {
            //Arrange
            var user              = UserDumbData.GetRandomEntity();
            var userAchievements  = UserAchievementDumbData.GetRandomEntities(5, user);
            var returnpagingInfo  = ReturnPagingInfoDumbData.GetForModel(new PagingInfo(), userAchievements);
            var cancellationToken = new CancellationToken();

            _userRepository.Setup(x => x.GetByIdAsync(It.IsAny <Guid>(), cancellationToken)).ReturnsAsync(user);
            _userAchievementRepository.Setup(x => x.GetCountAchievementsByUserAsync(It.IsAny <Guid>(), cancellationToken)).ReturnsAsync(RandomHelper.GetRandomNumber());
            _userAchievementRepository.Setup(x => x.GetAllAchievementsByUserAsync(It.IsAny <PagingInfo>(), It.IsAny <Guid>(), cancellationToken)).Returns(Task.FromResult(returnpagingInfo));
            _userAchievementRepository.Setup(x => x.AddAsync(It.IsAny <UserAchievement>(), cancellationToken)).Returns(Task.CompletedTask);
            _userAchievementRepository.Setup(x => x.Delete(It.IsAny <UserAchievement>()));
            _achievementRepository.Setup(x => x.GetByIdAsync(It.IsAny <Guid>(), cancellationToken))
            .Returns(Task.FromResult(AchievementDumbData.GetRandomEntity()));
            _unitOfWork.Setup(x => x.SaveChangesAsync(cancellationToken)).Returns(Task.CompletedTask);

            // Act
            await _userAchievementService.ChangeUserAchievementsAsync(model, user.Id, cancellationToken);

            // Assert
            _userRepository.Verify(x => x.GetByIdAsync(It.IsAny <Guid>(), cancellationToken), Times.Once);
            _userAchievementRepository.Verify(x => x.GetCountAchievementsByUserAsync(It.IsAny <Guid>(), cancellationToken), Times.Once);
            _userAchievementRepository.Verify(x => x.GetAllAchievementsByUserAsync(It.IsAny <PagingInfo>(), It.IsAny <Guid>(), cancellationToken), Times.Once);
            _userAchievementRepository.Verify(x => x.AddAsync(It.IsAny <UserAchievement>(), cancellationToken), Times.Once);
            _userAchievementRepository.Verify(x => x.Delete(It.IsAny <UserAchievement>()), Times.Once);
            _achievementRepository.Verify(x => x.GetByIdAsync(It.IsAny <Guid>(), cancellationToken), Times.Once);
            _unitOfWork.Verify(x => x.SaveChangesAsync(cancellationToken), Times.Once);
        }