コード例 #1
0
        public async Task <IViewComponentResult> InvokeAsync(int targetUserId, int groupId, int credentialId, CancellationToken cancellationToken)
        {
            var user = await _authService.GetCurrentUser(HttpContext, cancellationToken);

            if (user == null)
            {
                throw new UnauthorizedAccessException("No user in session");
            }

            if (!await _groupMemberService.GetUserHasRole(user.ID, groupId, GroupRoles.UserAdmin, true, cancellationToken))
            {
                throw new UnauthorizedAccessException("User does not have required role.");
            }

            if (!await _groupMemberService.GetUserHasRole(targetUserId, groupId, GroupRoles.Member, false, cancellationToken))
            {
                throw new UnauthorizedAccessException("Target user is not member of group.");
            }

            var viewModel = new AssignCredentialsViewModel()
            {
                TargetUser        = await _userService.GetUserAsync(targetUserId, cancellationToken),
                Credential        = await _groupService.GetGroupCredential(groupId, credentialId),
                ValidUntilOptions = GetValidUntilOptions(),
            };

            return(View("AssignCredentialsPopup", viewModel));
        }
コード例 #2
0
        public async Task <IActionResult> Group(string groupKey, CancellationToken cancellationToken)
        {
            var group = await _groupService.GetGroupByKey(groupKey, cancellationToken);

            var user = await _authService.GetCurrentUser(HttpContext, cancellationToken);

            if (!_userService.GetRegistrationIsComplete(user))
            {
                return(Redirect(REGISTRATION_URL));
            }

            if (await _groupMemberService.GetUserHasRole(user.ID, group.GroupId, GroupRoles.TaskAdmin, true, cancellationToken))
            {
                if (group.TasksEnabled)
                {
                    return(await GroupRequests(groupKey, null, null, cancellationToken));
                }
                else if (group.ShiftsEnabled)
                {
                    return(await GroupShifts(groupKey, null, null, cancellationToken));
                }
            }
            else if (await _groupMemberService.GetUserHasRole_Any(user.ID, group.GroupId, new List <GroupRoles> {
                GroupRoles.UserAdmin, GroupRoles.UserAdmin_ReadOnly
            }, true, cancellationToken))
            {
                return(await GroupVolunteers(groupKey, cancellationToken));
            }

            return(Redirect(PROFILE_URL));
        }
コード例 #3
0
        public async Task <IViewComponentResult> InvokeAsync(int jobId, int requestId, JobStatuses targetStatus, CancellationToken cancellationToken)
        {
            JobSummary job = null;

            if (jobId > 0)
            {
                job = await _requestService.GetJobSummaryAsync(jobId, cancellationToken);

                requestId = job.RequestID;
            }
            var request = await _requestService.GetRequestSummaryAsync(requestId, cancellationToken);

            var user = await _authService.GetCurrentUser(HttpContext, cancellationToken);

            bool userIsAdmin = await _groupMemberService.GetUserHasRole(user.ID, request.ReferringGroupID, GroupRoles.TaskAdmin, true, cancellationToken);

            JobStatusChangePopupViewModel vm = await BuildVm(request, job, targetStatus, cancellationToken);

            if (job == null)
            {
                return((request.SingleJobStatus(), targetStatus, userIsAdmin) switch
                {
                    (_, JobStatuses.Done, true) => View("Admin_MarkRequestAsDonePopup", vm),
                    (_, JobStatuses.Cancelled, true) => View("Admin_CancelRequestPopup", vm),
                    _ => throw new Exception($"Unhandled status/admin combination for request: {request.SingleJobStatus()} -> {targetStatus} / admin:{userIsAdmin}")
                });
コード例 #4
0
        public async Task <IActionResult> Index(string groupKey, CancellationToken cancellationToken, bool suag = false)
        {
            if (String.IsNullOrWhiteSpace(groupKey))
            {
                return(RedirectToAction(nameof(ErrorsController.Error404), "Errors"));
            }

            var group = await _groupService.GetGroupByKey(groupKey, cancellationToken);

            CommunityViewModel communityViewModel = await _communityRepository.GetCommunity(groupKey, cancellationToken);

            if (communityViewModel == null)
            {
                return(RedirectToAction("Error404", "Errors"));
            }

            var user = await _authService.GetCurrentUser(HttpContext, cancellationToken);

            if (user != null)
            {
                communityViewModel.IsLoggedIn    = true;
                communityViewModel.IsGroupMember = await _groupMemberService.GetUserHasRole(user.ID, group.GroupId, GroupRoles.Member, false, cancellationToken);
            }

            return(View(communityViewModel.View, communityViewModel));
        }
コード例 #5
0
        public async Task <int> GetCount(User user, MenuPage menuPage, string groupKey, CancellationToken cancellationToken)
        {
            if (menuPage == MenuPage.GroupRequests || menuPage == MenuPage.GroupShifts)
            {
                var group = await _groupService.GetGroupByKey(groupKey, cancellationToken);

                if (!await _groupMemberService.GetUserHasRole(user.ID, group.GroupId, GroupRoles.TaskAdmin, true, cancellationToken))
                {
                    return(0);
                }
                if (!group.ShiftsEnabled && menuPage == MenuPage.GroupShifts)
                {
                    return(0);
                }
                if (!group.TasksEnabled && menuPage == MenuPage.GroupRequests)
                {
                    return(0);
                }
            }

            try
            {
                int?count = menuPage switch
                {
                    MenuPage.Group
                    => await GetCount(user, MenuPage.GroupRequests, groupKey, cancellationToken) + await GetCount(user, MenuPage.GroupShifts, groupKey, cancellationToken),
                    MenuPage.GroupRequests
                    => (await _requestService.GetGroupRequestsAsync(groupKey, false, cancellationToken))?.Count(r => !r.RequestComplete()),
                    MenuPage.MyRequests
                    => (await _requestService.GetJobsForUserAsync(user.ID, false, cancellationToken))?.Where(j => j.JobStatus.Incomplete())?.Count(),
                    MenuPage.OpenRequests
                    => (await GetFilteredOpenJobsForUser(user, cancellationToken))?.Count(),
                    MenuPage.OpenShifts
                    => (await _requestService.GetOpenShiftsForUserAsync(user, null, null, false, cancellationToken))?.Count(),
                    MenuPage.MyShifts
                    => (await _requestService.GetShiftsForUserAsync(user.ID, null, null, false, cancellationToken))?.Count(s => s.JobStatus.Incomplete()),
                    MenuPage.GroupShifts
                    => (await _requestService.GetGroupShiftRequestsAsync(groupKey, null, null, false, cancellationToken))?.Count(r => !r.RequestComplete()),
                    _ => null
                };

                return(count ?? 0);
            }
            catch
            {
                // Skip badge if request service has been too slow to respond
                return(0);
            }
        }
コード例 #6
0
        public async Task <IActionResult> RequestHelp(string referringGroup, string source, CancellationToken cancellationToken)
        {
            _logger.LogInformation("request-help");

            if (referringGroup == "v4v")
            {
                return(Redirect("/account"));
            }

            int referringGroupId = DecodeGroupIdOrGetDefault(referringGroup);

            source = ValidateSource(source);

            var requestHelpJourney = await _groupService.GetRequestHelpFormVariant(referringGroupId, source);

            if (requestHelpJourney.AccessRestrictedByRole)
            {
                var user = await _authService.GetCurrentUser(HttpContext, cancellationToken);

                var userHasPermission = user != null && await _groupMemberService.GetUserHasRole(user.ID, referringGroupId, GroupRoles.RequestSubmitter, true, cancellationToken);

                if (!userHasPermission)
                {
                    return(RedirectToAction("403", "Error"));
                }
            }

            if (requestHelpJourney.RequestHelpFormVariant == RequestHelpFormVariant.ChildGroupSelector)
            {
                return(await ChildGroupSelector(referringGroupId, cancellationToken));
            }

            var model = await _requestService.GetRequestHelpSteps(requestHelpJourney, referringGroupId, source);

            var requestStage = (RequestHelpRequestStageViewModel)model.Steps.Where(x => x is RequestHelpRequestStageViewModel).First();

            SupportActivities?selectedTask = requestStage.Tasks.Where(t => t.IsSelected).FirstOrDefault()?.SupportActivity;

            if (selectedTask != null)
            {
                requestStage.Questions = await UpdateQuestionsViewModel(null, requestHelpJourney.RequestHelpFormVariant, RequestHelpFormStage.Request, selectedTask.Value, referringGroupId);
            }
            requestStage.RequestGuid = Guid.NewGuid();

            return(View(model));
        }
コード例 #7
0
        public async Task <IViewComponentResult> InvokeAsync(int groupId, CancellationToken cancellationToken)
        {
            var user = await _authService.GetCurrentUser(HttpContext, cancellationToken);


            if (user == null)
            {
                throw new UnauthorizedAccessException("No user in session");
            }

            var group = await _groupService.GetGroupById(groupId, cancellationToken);

            var groupMembers = await _groupMemberService.GetAllGroupMembers(groupId, user.ID);

            var groupCompletedJobs = (await _requestService.GetGroupRequestsAsync(groupId, true, cancellationToken))
                                     .SelectMany(r => r.JobBasics).Where(j => j.JobStatus.Equals(JobStatuses.Done));
            var groupCredentials = await _groupService.GetGroupCredentials(groupId);

            var getEachUser = groupMembers.Select(async(userInGroup) =>
            {
                return(new VolunteerViewModel()
                {
                    DateJoined = userInGroup.UserRoleAudit.Where(ur => ur.Action == GroupAction.AddMember && ur.Role == GroupRoles.Member && ur.Success).LastOrDefault()?.DateRequested ?? DateTime.MinValue,
                    Roles = userInGroup.GroupRoles,
                    User = await _userService.GetUserAsync(userInGroup.UserId, cancellationToken),
                    CompletedRequests = groupCompletedJobs.Count(j => j.VolunteerUserID.Equals(userInGroup.UserId)),
                    Credentials = groupCredentials.Select(gc => new AnnotatedGroupCredential(gc, userInGroup.ValidCredentials)).ToList()
                });
            });

            var volunteerListViewModel = new VolunteerListViewModel
            {
                GroupId           = group.GroupId,
                GroupCredentials  = groupCredentials,
                Volunteers        = (await Task.WhenAll(getEachUser)).Where(v => v.User != null),
                UserId            = user.ID,
                UserHasEditRights = await _groupMemberService.GetUserHasRole(user.ID, groupId, GroupRoles.UserAdmin, true, cancellationToken),
            };


            return(View("VolunteerList", volunteerListViewModel));
        }
コード例 #8
0
        public async Task <IViewComponentResult> InvokeAsync(JobFilterRequest jobFilterRequest, Action hideFilterPanelCallback, Action noJobsCallback, CancellationToken cancellationToken)
        {
            var user = await _authService.GetCurrentUser(HttpContext, cancellationToken);

            if (user == null)
            {
                throw new UnauthorizedAccessException("No user in session");
            }

            if (jobFilterRequest.JobSet.GroupAdminView())
            {
                if (!(await _groupMemberService.GetUserHasRole(user.ID, jobFilterRequest.GroupId.Value, GroupRoles.TaskAdmin, true, cancellationToken)))
                {
                    throw new UnauthorizedAccessException("User not authorized to view group tasks");
                }
            }

            string viewName;
            object viewModel;

            // TODO: Consolidate 3 methods
            switch (jobFilterRequest.JobSet.RequestType(), jobFilterRequest.JobSet)
            {