Exemplo n.º 1
0
        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()));
        }