public object BuildGroupUserList(string groupId, UsersQueryInput usersQueryInput)
        {
            Check.RequireNotNullOrWhitespace(groupId, "groupId");
            Check.RequireNotNull(usersQueryInput, "usersQueryInput");

            return(ExecuteQuery(usersQueryInput, new[] { groupId }));
        }
        public ActionResult  Members(string id, UsersQueryInput queryInput)
        {
            string projectId = VerbosifyId <Project>(id);

            if (!_permissionManager.DoesExist <Project>(projectId))
            {
                return(HttpNotFound());
            }

            queryInput.PageSize = 15;

            if (string.IsNullOrWhiteSpace(queryInput.Sort) ||
                (queryInput.Sort.ToLower() != "a-z" &&
                 queryInput.Sort.ToLower() != "z-a"))
            {
                queryInput.Sort = "a-z";
            }

            var projectResult = _documentSession
                                .Query <All_Groups.Result, All_Groups>()
                                .AsProjection <All_Groups.Result>()
                                .Where(x => x.GroupId == projectId)
                                .First();

            dynamic viewModel = new ExpandoObject();

            viewModel.Project = _projectViewModelQuery.BuildProject(projectId);
            viewModel.Users   = _userViewModelQuery.BuildGroupUserList(projectId, queryInput);
            viewModel.Query   = new
            {
                Id = projectId,
                queryInput.Page,
                queryInput.PageSize,
                queryInput.Sort,
                queryInput.Query,
                queryInput.Field
            };
            viewModel.ShowMembers              = true;
            viewModel.IsMember                 = _userContext.IsUserAuthenticated() ? _userContext.HasGroupPermission <Project>(PermissionNames.CreateObservation, projectId) : false;
            viewModel.UserCountDescription     = "Member" + (projectResult.UserCount == 1 ? string.Empty : "s");
            viewModel.SightingCountDescription = "Sighting" + (projectResult.SightingCount == 1 ? string.Empty : "s");
            viewModel.PostCountDescription     = "Post" + (projectResult.PostCount == 1 ? string.Empty : "s");

            return(RestfulResult(
                       viewModel,
                       "projects",
                       "members"));
        }
        public ActionResult List(UsersQueryInput queryInput)
        {
            queryInput.PageSize = 15;

            if (string.IsNullOrWhiteSpace(queryInput.Sort) ||
                (queryInput.Sort.ToLower() != "a-z" &&
                 queryInput.Sort.ToLower() != "z-a"))
            {
                queryInput.Sort = "a-z";
            }

            queryInput.Query = queryInput.Query ?? string.Empty;
            queryInput.Field = queryInput.Field ?? string.Empty;

            dynamic viewModel = new ExpandoObject();

            viewModel.Users = _userViewModelQuery.BuildUserList(queryInput);
            viewModel.Query = new
            {
                queryInput.Page,
                queryInput.PageSize,
                queryInput.Sort,
                queryInput.Query,
                queryInput.Field
            };
            viewModel.FieldSelectList = new[]
            {
                new
                {
                    Text     = "Name",
                    Value    = "name",
                    Selected = queryInput.Field.ToLower() == "name"
                },
                new
                {
                    Text     = "Description",
                    Value    = "description",
                    Selected = queryInput.Field.ToLower() == "description"
                }
            };

            return(RestfulResult(
                       viewModel,
                       "users",
                       "list"));
        }
        public ActionResult Members(string id, UsersQueryInput queryInput)
        {
            string organisationId = VerbosifyId<Organisation>(id);

            if (!_permissionManager.DoesExist<Organisation>(organisationId))
            {
                return HttpNotFound();
            }

            queryInput.PageSize = 15;

            if (string.IsNullOrWhiteSpace(queryInput.Sort) ||
                (queryInput.Sort.ToLower() != "a-z" &&
                queryInput.Sort.ToLower() != "z-a"))
            {
                queryInput.Sort = "a-z";
            }

            var organisationResult = _documentSession
                .Query<All_Groups.Result, All_Groups>()
                .AsProjection<All_Groups.Result>()
                .First(x => x.GroupId == organisationId);

            dynamic viewModel = new ExpandoObject();
            viewModel.Organisation = _organisationViewModelQuery.BuildOrganisation(organisationId);
            viewModel.Users = _userViewModelQuery.BuildGroupUserList(organisationId, queryInput);
            viewModel.Query = new
            {
                Id = organisationId,
                queryInput.Page,
                queryInput.PageSize,
                queryInput.Sort,
                queryInput.Query,
                queryInput.Field
            };
            viewModel.ShowMembers = true;
            viewModel.IsMember = _userContext.IsUserAuthenticated() ? _userContext.HasGroupPermission<Organisation>(PermissionNames.CreateObservation, organisationId) : false;
            viewModel.UserCountDescription = "Member" + (organisationResult.UserCount == 1 ? string.Empty : "s");
            viewModel.PostCountDescription = "Post" + (organisationResult.PostCount == 1 ? string.Empty : "s");

            return RestfulResult(
                viewModel,
                "organisations",
                "members");
        }
        public ActionResult List(UsersQueryInput queryInput)
        {
            queryInput.PageSize = 15;

            if (string.IsNullOrWhiteSpace(queryInput.Sort) ||
                (queryInput.Sort.ToLower() != "a-z" &&
                queryInput.Sort.ToLower() != "z-a"))
            {
                queryInput.Sort = "a-z";
            }

            queryInput.Query = queryInput.Query ?? string.Empty;
            queryInput.Field = queryInput.Field ?? string.Empty;

            dynamic viewModel = new ExpandoObject();
            viewModel.Users = _userViewModelQuery.BuildUserList(queryInput);
            viewModel.Query = new
            {
                queryInput.Page,
                queryInput.PageSize,
                queryInput.Sort,
                queryInput.Query,
                queryInput.Field
            };
            viewModel.FieldSelectList = new[]
                {
                    new
                        {
                            Text = "Name",
                            Value = "name",
                            Selected = queryInput.Field.ToLower() == "name"
                        },
                    new
                        {
                            Text = "Description",
                            Value = "description",
                            Selected = queryInput.Field.ToLower() == "description"
                        }
                };

            return RestfulResult(
                viewModel,
                "users",
                "list");
        }
        private object ExecuteQuery(UsersQueryInput usersQueryInput, IEnumerable<string> groupIds)
        {
            RavenQueryStatistics stats;

            User authenticatedUser = null;

            if (_userContext.IsUserAuthenticated())
            {
                authenticatedUser = _documentSession.Load<User>(_userContext.GetAuthenticatedUserId());
            }

            var query = _documentSession
                .Advanced
                .LuceneQuery<All_Users.Result, All_Users>()
                .Statistics(out stats)
                .SelectFields<All_Users.Result>("UserId", "GroupIds", "ConnectionIds", "SightingCount", "LatestHeartbeat", "LatestActivity", "User", "LatestObservationIds", "LatestObservations");

            bool criteriaAdded = false;

            if (groupIds.Any())
            {
                query = query
                    .WhereIn("GroupIds", groupIds);

                criteriaAdded = true;
            }

            if (!string.IsNullOrWhiteSpace(usersQueryInput.Query))
            {
                var field = "AllFields";

                if (usersQueryInput.Field.ToLower() == "name")
                {
                    field = "Name";
                }
                if (usersQueryInput.Field.ToLower() == "description")
                {
                    field = "Description";
                }

                if (criteriaAdded)
                {
                    query = query.AndAlso();
                }

                query = query
                    .Search(field, usersQueryInput.Query);
            }

            switch (usersQueryInput.Sort.ToLower())
            {
                case "z-a":
                    query = query.AddOrder(x => x.SortName, true);
                    break;
                default:
                case "a-z":
                    query = query.AddOrder(x => x.SortName, false);
                    break;
            }

            return query
                .Skip(usersQueryInput.GetSkipIndex())
                .Take(usersQueryInput.GetPageSize())
                .ToList()
                .Select(x => _userViewFactory.Make(x.User, authenticatedUser, true, x.SightingCount, x.LatestObservations != null ? x.LatestObservations.Take(4) : null))
                .ToPagedList(
                    usersQueryInput.GetPage(),
                    usersQueryInput.GetPageSize(),
                    stats.TotalResults
                );
        }
        public object BuildUserList(UsersQueryInput usersQueryInput)
        {
            Check.RequireNotNull(usersQueryInput, "usersQueryInput");

            return ExecuteQuery(usersQueryInput, new string[] { });
        }
        public object BuildGroupUserList(string groupId, UsersQueryInput usersQueryInput)
        {
            Check.RequireNotNullOrWhitespace(groupId, "groupId");
            Check.RequireNotNull(usersQueryInput, "usersQueryInput");

            return ExecuteQuery(usersQueryInput, new[] { groupId });
        }
        private object ExecuteQuery(UsersQueryInput usersQueryInput, IEnumerable <string> groupIds)
        {
            RavenQueryStatistics stats;

            User authenticatedUser = null;

            if (_userContext.IsUserAuthenticated())
            {
                authenticatedUser = _documentSession.Load <User>(_userContext.GetAuthenticatedUserId());
            }

            var query = _documentSession
                        .Advanced
                        .LuceneQuery <All_Users.Result, All_Users>()
                        .Statistics(out stats)
                        .SelectFields <All_Users.Result>("UserId", "GroupIds", "ConnectionIds", "SightingCount", "LatestHeartbeat", "LatestActivity", "User", "LatestObservationIds", "LatestObservations");

            bool criteriaAdded = false;

            if (groupIds.Any())
            {
                query = query
                        .WhereIn("GroupIds", groupIds);

                criteriaAdded = true;
            }

            if (!string.IsNullOrWhiteSpace(usersQueryInput.Query))
            {
                var field = "AllFields";

                if (usersQueryInput.Field.ToLower() == "name")
                {
                    field = "Name";
                }
                if (usersQueryInput.Field.ToLower() == "description")
                {
                    field = "Description";
                }

                if (criteriaAdded)
                {
                    query = query.AndAlso();
                }

                query = query
                        .Search(field, usersQueryInput.Query);
            }

            switch (usersQueryInput.Sort.ToLower())
            {
            case "z-a":
                query = query.AddOrder(x => x.SortName, true);
                break;

            default:
            case "a-z":
                query = query.AddOrder(x => x.SortName, false);
                break;
            }

            return(query
                   .Skip(usersQueryInput.GetSkipIndex())
                   .Take(usersQueryInput.GetPageSize())
                   .ToList()
                   .Select(x => _userViewFactory.Make(x.User, authenticatedUser, true, x.SightingCount, x.LatestObservations != null ? x.LatestObservations.Take(4) : null))
                   .ToPagedList(
                       usersQueryInput.GetPage(),
                       usersQueryInput.GetPageSize(),
                       stats.TotalResults
                       ));
        }
        public object BuildUserList(UsersQueryInput usersQueryInput)
        {
            Check.RequireNotNull(usersQueryInput, "usersQueryInput");

            return(ExecuteQuery(usersQueryInput, new string[] { }));
        }