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); } }
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; } }
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)); }