Exemplo n.º 1
0
        private static void SetFilter(UserIndexOptions options, ICriteria query, bool hasBasicUserProfilePart)
        {
            // default options
            options ??= new UserIndexOptions();
            switch (options.Filter)
            {
            case UsersFilter.Approved:
                query.Add(Restrictions.Eq("user.RegistrationStatus", UserStatus.Approved));
                break;

            case UsersFilter.Pending:
                query.Add(Restrictions.Eq("user.RegistrationStatus", UserStatus.Pending));
                break;

            case UsersFilter.EmailPending:
                query.Add(Restrictions.Eq("user.EmailStatus", UserStatus.Pending));
                break;
            }

            // TODO check if it show duplicated value
            if (!string.IsNullOrWhiteSpace(options.Search))
            {
                var disjunction = Restrictions.Disjunction()
                                  .Add(Restrictions.Like("user.Email", $"{options.Search}%"))
                                  .Add(Restrictions.Like("user.UserName", $"{options.Search}%"));//Field for ICriteria is case sensitive

                if (hasBasicUserProfilePart)
                {
                    disjunction.Add(Restrictions.Like("profile.FirstName", $"{options.Search}%"));
                }

                query.Add(disjunction);
            }
        }
Exemplo n.º 2
0
        private static void SetSortOrder(UserIndexOptions options, ICriteria query, bool hasBasicUserProfilePart)
        {
            switch (options.Order)
            {
            case UsersOrder.Name:
                if (hasBasicUserProfilePart)
                {
                    query.AddOrder(Order.Asc("profile.FirstName"));
                }
                else
                {
                    query.AddOrder(Order.Asc("user.UserName"));
                }
                break;

            case UsersOrder.Email:
                query.AddOrder(Order.Asc("user.Email"));
                break;

            case UsersOrder.CreatedUtc:
                query.AddOrder(Order.Desc("user.CreatedUtc"));
                break;

            case UsersOrder.LastLoginUtc:
                query.AddOrder(Order.Desc("user.LastLoginUtc"));
                break;
            }
        }
Exemplo n.º 3
0
        public ActionResult Index(UserIndexOptions options, PagerParameters pagerParameters)
        {
            if (!service.Authorizer.Authorize(Permissions.ManageUsers, T("Not authorized to list users")))
            {
                return(new HttpUnauthorizedResult());
            }

            var userType = contentDefinitionManager.GetTypeDefinition("User");
            var hasBasicUserProfilePart = userType.Parts.Any(p => p.PartDefinition.Name == nameof(BasicUserProfilePart));

            // Create criteria
            var session = transactionManager.GetSession();
            var query   = session.CreateCriteria <ContentItemVersionRecord>("version")
                          .CreateAlias("version.ContentItemRecord", "item", JoinType.InnerJoin)
                          // content item is aggregation of part records
                          .CreateAlias("item.ContentType", "type", JoinType.InnerJoin)
                          .CreateAlias("item.UserPartRecord", "user", JoinType.InnerJoin)
                          .Add(Restrictions.Eq("type.Name", "User"))
                          .Add(Restrictions.Eq("version.Published", true));

            if (hasBasicUserProfilePart)
            {
                query.CreateAlias(
                    "item.BasicUserProfilePartRecord",
                    "profile",
                    JoinType.LeftOuterJoin
                    ); // Not all user have profiles, e.g Admin
            }
            SetFilter(options, query, hasBasicUserProfilePart);

            var totalItemCount = query.SetProjection(Projections.RowCount()).UniqueResult <int>();
            var pager          = new Pager(siteService.GetSiteSettings(), pagerParameters);
            var pagerShape     = Shape.Pager(pager).TotalItemCount(totalItemCount);

            SetProjectionList(hasBasicUserProfilePart, query);
            // FirstResult is row index start from 0
            // pager.GetStartIndex() is calculated row index that we use
            // If we want page number, use pager.Page.
            query.SetFirstResult(pager.GetStartIndex()).SetMaxResults(pager.PageSize);
            SetSortOrder(options, query, hasBasicUserProfilePart);

            var results = query.List <BasicUserProfileDto>();
            var model   = new UserIndexViewModel {
                Users = results.Select(u => new ViewModels.UserEntry()
                {
                    User = u
                }).ToList(),
                Options = options,
                Pager   = pagerShape
            };

            // maintain previous route data when generating page links
            var routeData = new RouteData();

            routeData.Values.Add("Options.Filter", options.Filter);
            routeData.Values.Add("Options.Search", options.Search);
            routeData.Values.Add("Options.Order", options.Order);
            pagerShape.RouteData(routeData);

            // https://stackoverflow.com/questions/43565738/name-valuetuple-properties-when-creating-with-new/43566072#43566072
            // can't cast with "is (Url: string, Email: string>) activationEmail"
            if (TempData[activationEmailKey] is ValueTuple <string, string> activationEmail)
            {
                var(url, email)           = activationEmail;
                model.ActivationEmailSent = Shape.ActivationEmailSent(Url: url, Email: email);
            }
            ;

            return(View(model));
        }