Example #1
0
        public async Task <ActionResult> ModeratorCourseSubscribers(int?id)
        {
            // I. Checks.
            //  Get Id for the selected course.
            if (!int.TryParse(id.ToString(), out int intId))
            {
                return(RedirectToAction("Index"));
            }
            // Get CourseDTO object.
            CourseDTO courseDTO = await CourseService.GetAsync(intId);

            if (courseDTO == null)
            {
                return(RedirectToAction("Index"));
            }

            // II. Set ViewBag properties.
            ViewBag.CourseName = courseDTO.CourseTitle;
            ViewBag.CourseId   = intId;

            // III. AutoMapper Setup.
            var config = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap <TestResultDTO, TestResultViewModel>()
                .ForMember("Id", opt => opt.MapFrom(tr => tr.TestResultId))
                .ForMember("TestTitle", opt => opt.MapFrom(tr => tr.TestResultDetails.FirstOrDefault().Question.Topic.Course.CourseTitle))
                .ForMember("UserEmail", opt => opt.MapFrom(tr => tr.UserProfile.Email));
                cfg.CreateMap <TestResultDetailDTO, TestResultDetailViewModel>()
                .ForMember("Question", opt => opt.MapFrom(trd => trd.Question.QuestionText))
                .ForMember("Topic", opt => opt.MapFrom(trd => trd.Question.Topic.TopicTitle));
            });
            IMapper iMapper = config.CreateMapper();

            // IV. Get data for a view.
            IEnumerable <SubscriptionDTO> courseSubscriptions = SubscriptionService.Find(dto =>
                                                                                         dto.CourseId == intId &&
                                                                                         dto.IsApproved);
            //IEnumerable<TestResultDTO> source = TestResultService.Find(tr => !tr.IsTopicTest)
            IEnumerable <TestResultDTO> source = TestResultService.GetAll()
                                                 .Where(tr => tr.TestResultDetails.FirstOrDefault().Question.Topic.CourseId == intId)
                                                 .Join(courseSubscriptions,
                                                       tr => tr.UserProfileId,
                                                       cs => cs.UserProfileId,
                                                       (tr, cs) => tr).Distinct();                //.ToList();
            IEnumerable <TestResultViewModel>           courseTestResults = iMapper.Map <IEnumerable <TestResultDTO>, IEnumerable <TestResultViewModel> >(source);
            IEnumerable <SubscriberTestResultViewModel> resultView        = courseTestResults.GroupBy(ctr => ctr.UserEmail)
                                                                            .Select(ctr => new SubscriberTestResultViewModel
            {
                UserEmail      = ctr.Key,
                AttemptsNumber = ctr.Count(item => !item.IsTopicTest),
                BestResult     = ctr.Max((item) =>
                {
                    if (!item.IsTopicTest)
                    {
                        return(item.Result * 1000 / item.MaxScore);
                    }
                    return(0);
                }),
                IsPassedTest = ctr.Max((item) =>
                {
                    if (!item.IsTopicTest)
                    {
                        return(item.IsPassedTest);
                    }
                    return(false);
                })
            });

            // V.
            return(View(resultView));
        }