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); }
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()); }
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); }