public async Task <AchievementProgressViewModel> GetAchievementProgressForUserAsync(string userId, int milestoneTypeId) { var milestones = from milestone in db.Milestones where milestone.MilestoneTypeId == milestoneTypeId orderby milestone.Id select milestone; var results = await milestones.ToListAsync(); AchievementProgressViewModel v = new AchievementProgressViewModel(); foreach (var milestone in results) { v.AchievedCount = await GetAchievedAmountForUserAsync(userId, milestoneTypeId); v.AchievementIconPath = MilestoneExtensions.GetImagePath(milestone.IconFileName); v.RequiredCount = milestone.AmountRequired; // user hasn't reached the required amount yet to go beyond this milestone, break and use this milestone if (v.AchievedCount < v.RequiredCount) { break; } //// if the user has not achieved this milestone, break and use it //bool hasUserAchievedMilestone = milestone.MilestonesAchieved.Any(x => x.UserId == userId); //if (milestone.MilestonesAchieved == null || (milestone.MilestonesAchieved != null && milestone.MilestonesAchieved.Count == 0)) //{ // break; //} } return(v); }
private async Task <IEnumerable <IOrderedEnumerable <AchievementProgressViewModel> > > GetAchievementsProgressInGroups(string login) { var user = await userManager.Users .Include(u => u.ParameterValues) .Include(u => u.UserAchievements) .FirstOrDefaultAsync(u => u.UserName == login); var groups = await achievementsGroupsRepository.GetAchievementsGroupsAsync(); var semester = await semestersRepository.FindCurrentSemesterAsync(); var progressGroups = new List <IOrderedEnumerable <AchievementProgressViewModel> >(); foreach (var group in groups.Where(g => g.Ahievements.Any())) { var progressGroup = new List <AchievementProgressViewModel>(); var filteredAchievements = semester == null ? group.Ahievements : group.Ahievements.Where( a => a.SemesterId == null || a.SemesterId == semester.Id || user.UserAchievements.Any(ua => ua.AchievementId == a.Id) ); foreach (var achievement in filteredAchievements) { var linkedParameterValue = user.ParameterValues.Where(pv => pv.ParameterId == achievement.ParameterId).FirstOrDefault(); var progress = new AchievementProgressViewModel() { AchievementId = achievement.Id, AchievementName = achievement.Name, AchievementDescription = achievement.Description, NumberInGroup = achievement.NumberInGroup, AchievementValue = achievement.AchievementValue, LinkedParameterValue = linkedParameterValue?.Value, IsReceived = user.UserAchievements.Any(ua => ua.AchievementId == achievement.Id), AchievementType = achievement.AchievementType }; progressGroup.Add(progress); } progressGroups.Add(progressGroup.OrderBy(ap => ap.NumberInGroup)); } return(progressGroups.Where(g => g.Any())); }