Ejemplo n.º 1
0
        MCGetPaginatedChallengeListAsync(ChallengeFilter filter)
        {
            int authUserId = GetClaimId(ClaimType.UserId);

            if (HasPermission(Permission.ViewAllChallenges))
            {
                if (filter.IsActive == false)
                {
                    if (!HasPermission(Permission.ActivateSystemChallenges) &&
                        !HasPermission(Permission.ActivateAllChallenges))
                    {
                        _logger.LogError($"User {authUserId} doesn't have permission to view pending challenges.");
                        throw new GraException("Permission denied.");
                    }
                    else if (!HasPermission(Permission.ActivateAllChallenges) &&
                             filter.SystemIds?.FirstOrDefault() != GetClaimId(ClaimType.SystemId))
                    {
                        _logger.LogError($"User {authUserId} doesn't have permission to view pending challenges for system.");
                        throw new GraException("Permission denied.");
                    }
                }

                filter.SiteId = GetCurrentSiteId();
                var challenges = await _challengeRepository.PageAllAsync(filter);
                await AddBadgeFilenames(challenges);

                return(new DataWithCount <IEnumerable <Challenge> >
                {
                    Data = challenges,
                    Count = await _challengeRepository.GetChallengeCountAsync(filter)
                });
            }
            _logger.LogError($"User {authUserId} doesn't have permission to view all challenges.");
            throw new GraException("Permission denied.");
        }
        public async Task <DataWithCount <IEnumerable <int> > > PageIdsAsync(ChallengeFilter filter,
                                                                             int userId)
        {
            var user = await _context.Users.FindAsync(userId);

            var challengeList = ApplyFilters(filter)
                                .Where(_ => (_.LimitToSystemId == null || _.LimitToSystemId == user.SystemId) &&
                                       (_.LimitToBranchId == null || _.LimitToBranchId == user.BranchId));

            if (filter.IsCompleted.HasValue)
            {
                var userCompletedChallenges = _context.UserLogs
                                              .AsNoTracking()
                                              .Where(_ => _.UserId == userId && _.ChallengeId.HasValue && !_.IsDeleted)
                                              .Select(_ => _.ChallengeId);

                challengeList = challengeList
                                .Where(_ => userCompletedChallenges.Contains(_.Id) == filter.IsCompleted.Value);
            }

            var data = await challengeList
                       .ApplyOrdering(filter)
                       .ApplyPagination(filter)
                       .Select(_ => _.Id)
                       .ToListAsync();

            return(new DataWithCount <IEnumerable <int> >()
            {
                Data = data,
                Count = await challengeList.CountAsync()
            });
        }
Ejemplo n.º 3
0
        public async Task <DataWithCount <IEnumerable <int> > > PageIdsAsync(ChallengeFilter filter,
                                                                             int userId)
        {
            var user = await _context.Users.FindAsync(userId);

            var challengeList = ApplyFilters(filter)
                                .Where(_ => (_.LimitToSystemId == null || _.LimitToSystemId == user.SystemId) &&
                                       (_.LimitToBranchId == null || _.LimitToBranchId == user.BranchId) &&
                                       (_.LimitToProgramId == null || _.LimitToProgramId == user.ProgramId));

            var data = await challengeList
                       .Include(_ => _.ChallengeCategories)
                       .ThenInclude(_ => _.Category)
                       .OrderBy(_ => _.Name)
                       .ThenBy(_ => _.Id)
                       .ApplyPagination(filter)
                       .Select(_ => _.Id)
                       .ToListAsync();

            return(new DataWithCount <IEnumerable <int> >()
            {
                Data = data,
                Count = await challengeList.CountAsync()
            });
        }
Ejemplo n.º 4
0
        public static object GetData(this IQueryable <ChallengeTool> query, ChallengeFilter filter, string sort, string[] fields, int page, int limit, int total)
        {
            query = query.Filter(filter);
            query = query.Pagination(page, limit);
            var result = query.SelectField(fields, total);

            return(result);
        }
Ejemplo n.º 5
0
        public object GetDetail(ChallengeFilter filter, string sort, string[] fields, int page, int limit)
        {
            var query     = Get();
            int totalPage = 0;

            if (limit > -1)
            {
                totalPage = query.Count() / limit;
            }
            return(query.GetData(filter, sort, fields, page, limit, totalPage));
        }
        public async Task <ICollection <Challenge> > PageAllAsync(ChallengeFilter filter)
        {
            var challengeList = await ApplyFilters(filter)
                                .ApplyOrdering(filter)
                                .ApplyPagination(filter)
                                .ProjectTo <Challenge>(_mapper.ConfigurationProvider)
                                .ToListAsync();

            foreach (var challenge in challengeList)
            {
                challenge.HasDependents = await HasDependentsAsync(challenge.Id);
            }

            return(challengeList);
        }
        PageAllAsync(ChallengeFilter filter)
        {
            var challengeList = await ApplyFilters(filter)
                                .OrderBy(_ => _.Name)
                                .ThenBy(_ => _.Id)
                                .ApplyPagination(filter)
                                .ProjectTo <Challenge>()
                                .ToListAsync();

            foreach (var challenge in challengeList)
            {
                challenge.HasDependents = await HasDependentsAsync(challenge.Id);
            }

            return(challengeList);
        }
Ejemplo n.º 8
0
        GetPaginatedChallengeListAsync(ChallengeFilter filter)
        {
            ICollection <Challenge> challenges = null;
            int challengeCount;

            filter.IsActive = true;
            filter.SiteId   = GetCurrentSiteId();
            if (GetAuthUser().Identity.IsAuthenticated)
            {
                var userLookupChallenges = new List <Challenge>();
                int userId = GetActiveUserId();
                filter.FavoritesUserId = userId;
                var challengeIds = await _challengeRepository.PageIdsAsync(filter, userId);

                foreach (var challengeId in challengeIds.Data)
                {
                    var challengeStatus = await _challengeRepository
                                          .GetActiveByIdAsync(challengeId, userId);

                    int completed = challengeStatus.Tasks.Count(_ => _.IsCompleted == true);
                    if (completed > 0)
                    {
                        challengeStatus.Status          = $"Completed {completed} of {challengeStatus.TasksToComplete} tasks.";
                        challengeStatus.PercentComplete = Math.Min((int)(completed * 100 / challengeStatus.TasksToComplete), 100);
                        challengeStatus.CompletedTasks  = completed;
                    }

                    userLookupChallenges.Add(challengeStatus);
                }
                challenges     = userLookupChallenges;
                challengeCount = challengeIds.Count;
            }
            else
            {
                challenges = await _challengeRepository.PageAllAsync(filter);

                challengeCount = await _challengeRepository.GetChallengeCountAsync(filter);
            }
            await AddBadgeFilenames(challenges);

            return(new DataWithCount <IEnumerable <Challenge> >
            {
                Data = challenges,
                Count = challengeCount
            });
        }
Ejemplo n.º 9
0
 public static IQueryable <T> ApplyOrdering <T>(this IQueryable <T> queryable,
                                                ChallengeFilter filter)
     where T : Challenge
 {
     if (filter == null)
     {
         throw new ArgumentNullException(nameof(filter));
     }
     return(filter.Ordering switch
     {
         ChallengeFilter.OrderingOption.Name => queryable.OrderBy(_ => _.Name),
         ChallengeFilter.OrderingOption.Recent => queryable
         .OrderByDescending(_ => _.CreatedAt)
         .ThenBy(_ => _.Name),
         _ => queryable
         .OrderByDescending(_ => _.EstimatedPopularity)
         .ThenByDescending(_ => _.CreatedAt)
     });
Ejemplo n.º 10
0
 public IActionResult Get([FromQuery] ChallengeFilter filter,
                          [FromQuery] string sort,
                          [FromQuery] string[] fields,
                          [FromQuery] int page  = 0,
                          [FromQuery] int limit = -1)
 {
     try
     {
         var domain = _uow.GetService <ChallengeDomain>();
         if (fields.Length == 0)
         {
             fields = new string[] { ChallengeFieldsDetail.INFO };
         }
         var result = domain.GetDetail(filter, sort, fields, page, limit);
         return(Success(result));
     }
     catch (Exception ex)
     {
         return(Error(ex.Message));
     }
 }
 public async Task <int> GetChallengeCountAsync(ChallengeFilter filter)
 {
     return(await ApplyFilters(filter).CountAsync());
 }
Ejemplo n.º 12
0
        public async Task <IActionResult> Index(string Search     = null,
                                                int?Program       = null,
                                                string Categories = null,
                                                string Group      = null,
                                                bool Favorites    = false,
                                                string Status     = null,
                                                int page          = 1,
                                                ChallengeFilter.OrderingOption ordering = ChallengeFilter.OrderingOption.MostPopular,
                                                System.Net.HttpStatusCode httpStatus    = System.Net.HttpStatusCode.OK)
        {
            var filter = new ChallengeFilter(page)
            {
                Ordering = ordering
            };

            if (!string.IsNullOrWhiteSpace(Search))
            {
                filter.Search = Search;
            }
            if (Program.HasValue)
            {
                filter.ProgramIds = new List <int?> {
                    Program
                };
            }
            if (!string.IsNullOrWhiteSpace(Categories))
            {
                var categoryIds = new List <int>();
                foreach (var category in Categories.Split(','))
                {
                    if (int.TryParse(category, out int result))
                    {
                        categoryIds.Add(result);
                    }
                }
                filter.CategoryIds = categoryIds;
            }
            if (AuthUser.Identity.IsAuthenticated)
            {
                filter.Favorites = Favorites;
                if (string.IsNullOrWhiteSpace(Status) ||
                    string.Equals(Status, StatusUncompleted, StringComparison.OrdinalIgnoreCase))
                {
                    filter.IsCompleted = false;
                }
                else if (string.Equals(Status, StatusCompleted,
                                       StringComparison.OrdinalIgnoreCase))
                {
                    filter.IsCompleted = true;
                }
            }

            ChallengeGroup challengeGroup = null;

            if (!string.IsNullOrWhiteSpace(Group))
            {
                challengeGroup = await _challengeService.GetActiveGroupByStubAsync(Group);

                if (challengeGroup != null)
                {
                    filter.GroupId = challengeGroup.Id;
                }
                PageTitle
                    = _sharedLocalizer[Annotations.Title.ChallengeGroup, challengeGroup.Name];
            }

            var challengeList = await _challengeService.GetPaginatedChallengeListAsync(filter);

            var paginateModel = new PaginateViewModel
            {
                ItemCount    = challengeList.Count,
                CurrentPage  = page,
                ItemsPerPage = filter.Take.Value
            };

            if (paginateModel.PastMaxPage)
            {
                return(RedirectToRoute(
                           new
                {
                    page = paginateModel.LastPage ?? 1
                }));
            }

            foreach (var challenge in challengeList.Data)
            {
                if (!string.IsNullOrEmpty(challenge.BadgeFilename))
                {
                    challenge.BadgeFilename = _pathResolver
                                              .ResolveContentPath(challenge.BadgeFilename);
                }
                if (challenge.IsCompleted == true)
                {
                    challenge.Status = _sharedLocalizer[Annotations.Interface.Completed];
                }
            }

            var siteStage = GetSiteStage();

            var isActive = siteStage == SiteStage.ProgramOpen ||
                           siteStage == SiteStage.ProgramEnded;

            var categoryList = await _categoryService.GetListAsync(true);

            var featuredChallengeGroups = await _challengeService
                                          .GetActiveFeaturedChallengeGroupsAsync();

            var viewModel = new ChallengesListViewModel
            {
                Categories              = Categories,
                CategoryIds             = filter.CategoryIds,
                CategoryList            = new SelectList(categoryList, "Id", "Name"),
                ChallengeGroup          = challengeGroup,
                Challenges              = challengeList.Data.ToList(),
                Favorites               = Favorites,
                FeaturedChallengeGroups = featuredChallengeGroups,
                IsActive      = isActive,
                IsLoggedIn    = AuthUser.Identity.IsAuthenticated,
                Ordering      = filter.Ordering,
                PaginateModel = paginateModel,
                Program       = Program,
                ProgramList   = new SelectList(await _siteService.GetProgramList(), "Id", "Name"),
                Search        = Search,
                Status        = Status
            };

            if (!string.IsNullOrWhiteSpace(Search))
            {
                HttpContext.Session.SetString(SessionKey.ChallengeSearch, Search);
            }
            else
            {
                HttpContext.Session.Remove(SessionKey.ChallengeSearch);
            }
            HttpContext.Session.SetInt32(SessionKey.ChallengePage, page);

            if (httpStatus != System.Net.HttpStatusCode.OK)
            {
                Response.StatusCode = (int)httpStatus;
            }
            return(View(nameof(Index), viewModel));
        }
Ejemplo n.º 13
0
        private static IQueryable <Challenge> Filter(this IQueryable <Challenge> query, ChallengeFilter filter)
        {
            if (filter.Ids != null)
            {
                query = query.Where(s => filter.Ids.Contains(s.ChallengeId));
            }
            if (filter.Name != null && filter.Name.Length > 0)
            {
                query = query.Where(s => s.ChallengeName.Contains(filter.Name));
            }

            return(query);
        }
Ejemplo n.º 14
0
        private async Task <ChallengesListViewModel> GetChallengeList(string Search, string Categories, int?Program,
                                                                      int?System, int?Branch, bool?Mine, int page = 1, bool pending = false)
        {
            var filter = new ChallengeFilter(page);

            if (!string.IsNullOrWhiteSpace(Search))
            {
                filter.Search = Search;
            }
            if (!string.IsNullOrWhiteSpace(Categories))
            {
                var categoryIds = new List <int>();
                foreach (var category in Categories.Split(','))
                {
                    if (int.TryParse(category, out int result))
                    {
                        categoryIds.Add(result);
                    }
                }
                filter.CategoryIds = categoryIds;
            }
            if (System.HasValue)
            {
                filter.SystemIds = new List <int>()
                {
                    System.Value
                };
            }
            if (Branch.HasValue)
            {
                filter.BranchIds = new List <int>()
                {
                    Branch.Value
                };
            }
            if (Program.HasValue)
            {
                if (Program.Value == 0)
                {
                    filter.ProgramIds = new List <int?>()
                    {
                        null
                    };
                }
                else
                {
                    filter.ProgramIds = new List <int?>()
                    {
                        Program.Value
                    };
                }
            }
            if (Mine == true)
            {
                filter.UserIds = new List <int>()
                {
                    GetId(ClaimType.UserId)
                };
            }
            if (pending)
            {
                filter.IsActive = false;
            }
            var challengeList = await _challengeService
                                .MCGetPaginatedChallengeListAsync(filter);

            foreach (var challenge in challengeList.Data)
            {
                if (!string.IsNullOrEmpty(challenge.BadgeFilename))
                {
                    challenge.BadgeFilename = _pathResolver.ResolveContentPath(challenge.BadgeFilename);
                }
            }

            var paginateModel = new PaginateViewModel
            {
                ItemCount    = challengeList.Count,
                CurrentPage  = (filter.Skip.Value / filter.Take.Value) + 1,
                ItemsPerPage = filter.Take.Value
            };

            var systemList = (await _siteService.GetSystemList())
                             .OrderByDescending(_ => _.Id == GetId(ClaimType.SystemId)).ThenBy(_ => _.Name);

            var categoryList = await _categoryService.GetListAsync();

            var viewModel = new ChallengesListViewModel
            {
                Challenges          = challengeList.Data,
                PaginateModel       = paginateModel,
                Search              = filter.Search,
                Categories          = Categories,
                System              = System,
                Branch              = Branch,
                Program             = Program,
                Mine                = Mine,
                CanAddChallenges    = UserHasPermission(Permission.AddChallenges),
                CanDeleteChallenges = UserHasPermission(Permission.RemoveChallenges),
                CanEditChallenges   = UserHasPermission(Permission.EditChallenges),
                SystemList          = systemList,
                ProgramList         = await _siteService.GetProgramList(),
                CategoryIds         = filter.CategoryIds,
                CategoryList        = new SelectList(categoryList, "Id", "Name")
            };

            if (Mine == true)
            {
                viewModel.BranchList = (await _siteService.GetBranches(GetId(ClaimType.SystemId)))
                                       .OrderByDescending(_ => _.Id == GetId(ClaimType.BranchId))
                                       .ThenBy(_ => _.Name);
                viewModel.ActiveNav = "Mine";
                if (pending && !UserHasPermission(Permission.ActivateAllChallenges))
                {
                    viewModel.SystemName = systemList
                                           .SingleOrDefault(_ => _.Id == GetId(ClaimType.SystemId))?.Name;
                }
            }
            else if (Branch.HasValue)
            {
                var branch = await _siteService.GetBranchByIdAsync(viewModel.Branch.Value);

                viewModel.BranchName = branch.Name;
                viewModel.SystemName = systemList
                                       .SingleOrDefault(_ => _.Id == branch.SystemId)?.Name;
                viewModel.BranchList = (await _siteService.GetBranches(branch.SystemId))
                                       .OrderByDescending(_ => _.Id == GetId(ClaimType.BranchId))
                                       .ThenBy(_ => _.Name);
                viewModel.ActiveNav = "Branch";
            }
            else if (System.HasValue)
            {
                viewModel.SystemName = systemList
                                       .SingleOrDefault(_ => _.Id == viewModel.System.Value)?.Name;
                viewModel.BranchList = (await _siteService.GetBranches(viewModel.System.Value))
                                       .OrderByDescending(_ => _.Id == GetId(ClaimType.BranchId))
                                       .ThenBy(_ => _.Name);
                viewModel.ActiveNav = "System";
            }
            else
            {
                viewModel.BranchList = (await _siteService.GetBranches(GetId(ClaimType.SystemId)))
                                       .OrderByDescending(_ => _.Id == GetId(ClaimType.BranchId))
                                       .ThenBy(_ => _.Name);
                viewModel.ActiveNav = "All";
            }

            if (Program.HasValue)
            {
                if (Program.Value > 0)
                {
                    viewModel.ProgramName =
                        (await _siteService.GetProgramByIdAsync(Program.Value)).Name;
                }
                else
                {
                    viewModel.ProgramName = "Not Limited";
                }
            }

            return(viewModel);
        }
        private IQueryable <Data.Model.Challenge> ApplyFilters(ChallengeFilter filter)
        {
            var challenges = _context.Challenges.AsNoTracking()
                             .Where(_ => !_.IsDeleted &&
                                    _.SiteId == filter.SiteId);

            if (filter.SystemIds?.Any() == true)
            {
                challenges = challenges.Where(_ => filter.SystemIds.Contains(_.RelatedSystemId));
            }
            if (filter.BranchIds?.Any() == true)
            {
                challenges = challenges.Where(_ => filter.BranchIds.Contains(_.RelatedBranchId));
            }
            if (filter.ProgramIds?.Any() == true)
            {
                challenges = challenges
                             .Where(_ => filter.ProgramIds.Any(p => p == _.AssociatedProgramId));
            }
            if (filter.UserIds?.Any() == true)
            {
                challenges = challenges.Where(_ => filter.UserIds.Contains(_.CreatedBy));
            }

            if (filter.ChallengeIds?.Any() == true)
            {
                challenges = challenges.Where(_ => !filter.ChallengeIds.Contains(_.Id));
            }

            if (filter.CategoryIds?.Any() == true)
            {
                challenges = challenges
                             .Where(_ => _.ChallengeCategories
                                    .Select(c => c.CategoryId)
                                    .Any(c => filter.CategoryIds.Contains(c)));
            }

            if (filter.Favorites == true && filter.FavoritesUserId.HasValue)
            {
                var userFavoriteChallenges = _context.UserFavoriteChallenges
                                             .AsNoTracking()
                                             .Where(_ => _.UserId == filter.FavoritesUserId);

                challenges = from challengeList in challenges
                             join userFavorites in userFavoriteChallenges
                             on challengeList.Id equals userFavorites.ChallengeId
                             select challengeList;
            }

            if (filter.GroupId.HasValue)
            {
                var challengeGroup = _context.ChallengeGroups
                                     .AsNoTracking()
                                     .Where(_ => _.Id == filter.GroupId)
                                     .SelectMany(_ => _.ChallengeGroupChallenges)
                                     .Select(_ => _.ChallengeId);

                challenges = challenges.Where(_ => challengeGroup.Contains(_.Id));
            }

            if (!string.IsNullOrWhiteSpace(filter.Search))
            {
                challenges = challenges
                             .Where(_ => _.Name.Contains(filter.Search) ||
                                    _.Description.Contains(filter.Search) ||
                                    _.Tasks.Any(_t => _t.Title.Contains(filter.Search)) ||
                                    _.Tasks.Any(_t => _t.Author.Contains(filter.Search)) ||
                                    _.ChallengeCategories.Any(c => c.Category.Name.Contains(filter.Search)));
            }

            if (filter.IsActive.HasValue)
            {
                challenges = challenges.Where(_ => _.IsActive == filter.IsActive.Value);
            }

            return(challenges);
        }
Ejemplo n.º 16
0
        private static IQueryable <ChallengeTool> Filter(this IQueryable <ChallengeTool> query, ChallengeFilter filter)
        {
            if (filter.Ids != null)
            {
                query = query.Where(s => filter.Ids.Contains(s.ChallengeId));
            }

            return(query);
        }
Ejemplo n.º 17
0
        Generate(Site site, int count, int challengePercent, int codePercent, bool quiet)
        {
            int[]   minuteCeilings            = { 60, 120, 500 };
            float[] minuteCeilingDistribution = { 0.85F, 0.1F, 0.05F };

            var userList = await _userService.GetPaginatedUserListAsync(new UserFilter());

            var codeList = await _triggerService.GetPaginatedListAsync(new TriggerFilter
            {
                SecretCodesOnly = true
            });

            var challengeList = await _challengeService
                                .GetPaginatedChallengeListAsync(new ChallengeFilter());

            var activities = new List <GeneratedActivity>();

            var rand = new Bogus.Randomizer();

            if (!quiet)
            {
                Console.Write($"Generating {count} activity items... ");
            }

            ProgressBar progress = quiet ? null : new ProgressBar();

            try
            {
                for (int i = 0; i < count; i++)
                {
                    bool addActivity = false;
                    var  randomUser  = (await _userService.GetPaginatedUserListAsync(new UserFilter
                    {
                        SiteId = site.Id,
                        Skip = rand.Int(0, userList.Count - 1),
                        Take = 1
                    })).Data.First();

                    var act = new GeneratedActivity
                    {
                        User = randomUser,
                    };
                    if (challengePercent > 0 && rand.Int(1, 100) <= challengePercent)
                    {
                        bool isValid = false;
                        int  challengeLookupCount = 0;
                        await _configureUserSite.Lookup(randomUser.Id);

                        _challengeService.ClearCachedUserContext();
                        DataWithCount <IEnumerable <Challenge> > randomChallenge = null;
                        while (!isValid)
                        {
                            challengeLookupCount++;
                            var filter = new ChallengeFilter()
                            {
                                Take = rand.Int(0, challengeList.Count - 1),
                                Skip = 1
                            };
                            randomChallenge = await _challengeService.GetPaginatedChallengeListAsync(filter);

                            if (randomChallenge.Data != null &&
                                randomChallenge.Data.FirstOrDefault() != null)
                            {
                                isValid = randomChallenge.Data.First().IsValid;
                            }
                            if (challengeLookupCount > 20)
                            {
                                _logger.LogError($"Unable to find an eligible challenge for user id {randomUser.Id} after 20 tries, giving up.");
                                randomChallenge = null;
                                addActivity     = false;
                                break;
                            }
                        }
                        if (randomChallenge != null)
                        {
                            var randomTasks = await _challengeService
                                              .GetChallengeTasksAsync(randomChallenge.Data.First().Id);

                            var randomTask = randomTasks
                                             .Skip(rand.Int(0, randomTasks.Count() - 1)).First();
                            randomTask.IsCompleted = true;
                            act.ActivityType       = ActivityType.ChallengeTasks;
                            act.ChallengeId        = randomChallenge.Data.First().Id;
                            act.ChallengeTasks     = new List <ChallengeTask> {
                                randomTask
                            };
                            addActivity = true;
                        }
                    }
                    else
                    {
                        if (codePercent > 0 && rand.Int(1, 100) <= codePercent)
                        {
                            var randomCode = (await _triggerService.GetPaginatedListAsync(new TriggerFilter
                            {
                                SiteId = site.Id,
                                Skip = rand.Int(0, codeList.Count - 1),
                                Take = 1,
                                SecretCodesOnly = true
                            })).Data.First();

                            act.ActivityType = ActivityType.SecretCode;
                            act.SecretCode   = randomCode.SecretCode;
                            addActivity      = true;
                        }
                        else
                        {
                            act.ActivityAmount = rand.Int(1, rand
                                                          .WeightedRandom <int>(minuteCeilings, minuteCeilingDistribution));
                            act.ActivityType = ActivityType.Default;
                            addActivity      = true;
                        }
                    }
                    if (addActivity)
                    {
                        activities.Add(act);
                    }

                    if (progress != null)
                    {
                        progress.Report((double)i / count);
                    }
                }
            }
            finally
            {
                if (progress != null)
                {
                    progress.Dispose();
                    Console.WriteLine();
                }
            }
            return(activities);
        }
Ejemplo n.º 18
0
        public async Task <IActionResult> GetChallengeList(string challengeIds,
                                                           string scope,
                                                           string search,
                                                           bool showActive = false,
                                                           int page        = 1)
        {
            var filter = new ChallengeFilter(page, 10)
            {
                IsActive = true,
                Search   = search
            };

            if (!string.IsNullOrWhiteSpace(challengeIds))
            {
                filter.ChallengeIds = challengeIds.Split(',')
                                      .Where(_ => !string.IsNullOrWhiteSpace(_))
                                      .Select(int.Parse)
                                      .ToList();
            }

            switch (scope.ToLower())
            {
            case ("system"):
                filter.SystemIds = new List <int> {
                    GetId(ClaimType.SystemId)
                };
                break;

            case ("branch"):
                filter.BranchIds = new List <int> {
                    GetId(ClaimType.BranchId)
                };
                break;

            case ("mine"):
                filter.UserIds = new List <int> {
                    GetId(ClaimType.UserId)
                };
                break;

            default:
                break;
            }

            var challengeList = await _challengeService.MCGetPaginatedChallengeListAsync(filter);

            var paginateModel = new PaginateViewModel
            {
                ItemCount    = challengeList.Count,
                CurrentPage  = page,
                ItemsPerPage = filter.Take.Value
            };
            var viewModel = new ChallengesListViewModel
            {
                Challenges        = challengeList.Data,
                PaginateModel     = paginateModel,
                CanEditChallenges = UserHasPermission(Permission.EditChallenges),
                ShowActive        = showActive
            };

            foreach (var challenge in viewModel.Challenges)
            {
                if (!string.IsNullOrWhiteSpace(challenge.BadgeFilename))
                {
                    challenge.BadgeFilename = _pathResolver.ResolveContentPath(
                        challenge.BadgeFilename);
                }
            }

            return(PartialView("_ChallengeListPartial", viewModel));
        }
Ejemplo n.º 19
0
        public async Task <IActionResult> Index(string Search, string Categories, string Group,
                                                bool Favorites = false, int page = 1)
        {
            int siteId = GetCurrentSiteId();

            ChallengeFilter filter = new ChallengeFilter(page);

            if (!string.IsNullOrWhiteSpace(Search))
            {
                filter.Search = Search;
            }
            if (!string.IsNullOrWhiteSpace(Categories))
            {
                var categoryIds = new List <int>();
                foreach (var category in Categories.Split(','))
                {
                    int result;
                    if (int.TryParse(category, out result))
                    {
                        categoryIds.Add(result);
                    }
                }
                filter.CategoryIds = categoryIds;
            }
            if (Favorites == true && AuthUser.Identity.IsAuthenticated)
            {
                filter.Favorites = true;
            }

            ChallengeGroup challengeGroup = null;

            if (!string.IsNullOrWhiteSpace(Group))
            {
                challengeGroup = await _challengeService.GetActiveGroupByStubAsync(Group);

                if (challengeGroup != null)
                {
                    filter.GroupId = challengeGroup.Id;
                }
            }

            var challengeList = await _challengeService.GetPaginatedChallengeListAsync(filter);

            PaginateViewModel paginateModel = new PaginateViewModel()
            {
                ItemCount    = challengeList.Count,
                CurrentPage  = page,
                ItemsPerPage = filter.Take.Value
            };

            if (paginateModel.MaxPage > 0 && paginateModel.CurrentPage > paginateModel.MaxPage)
            {
                return(RedirectToRoute(
                           new
                {
                    page = paginateModel.LastPage ?? 1
                }));
            }

            foreach (var challenge in challengeList.Data)
            {
                if (!string.IsNullOrEmpty(challenge.BadgeFilename))
                {
                    challenge.BadgeFilename = _pathResolver.ResolveContentPath(challenge.BadgeFilename);
                }
                if (challenge.IsCompleted == true)
                {
                    challenge.Status = "Completed!";
                }
            }

            var siteStage = GetSiteStage();

            var isActive = (siteStage == SiteStage.ProgramOpen ||
                            siteStage == SiteStage.ProgramEnded);

            var categoryList = await _categoryService.GetListAsync(true);

            ChallengesListViewModel viewModel = new ChallengesListViewModel()
            {
                Challenges     = challengeList.Data.ToList(),
                ChallengeGroup = challengeGroup,
                PaginateModel  = paginateModel,
                Search         = Search,
                Categories     = Categories,
                Favorites      = Favorites,
                IsActive       = isActive,
                IsLoggedIn     = AuthUser.Identity.IsAuthenticated,
                CategoryIds    = filter.CategoryIds,
                CategoryList   = new SelectList(categoryList, "Id", "Name")
            };

            if (!string.IsNullOrWhiteSpace(Search))
            {
                HttpContext.Session.SetString(SessionKey.ChallengeSearch, Search);
            }
            else
            {
                HttpContext.Session.Remove(SessionKey.ChallengeSearch);
            }
            HttpContext.Session.SetInt32(SessionKey.ChallengePage, page);

            return(View(nameof(Index), viewModel));
        }