/// <summary> /// Count users. /// </summary> /// <param name="appContext"></param> /// <param name="filters"></param> /// <returns></returns> public static async Task <int> Count(Services.WcmsAppContext appContext, Dictionary <string, object> filters) { DataSorting orderBy = DataSorting.Validation; // Build the query... var query = _GetQuery(appContext, filters, ref orderBy); if (query == null) { return(0); } else { // Trace performance... appContext?.AddPerfLog("UserAuthorizationHandler::Count::Query built"); // Execute the query... int count = await query.CountAsync(); // Trace performance... appContext?.AddPerfLog("UserAuthorizationHandler::Count::Query executed"); // Exit... return(count); } }
/// <summary> /// Get user query. /// </summary> /// <param name="appContext"></param> /// <param name="filters"></param> /// <param name="orderBy"></param> /// <returns></returns> private static IQueryable <ApplicationUser> _GetQuery(Services.WcmsAppContext appContext, Dictionary <string, object> filters, ref DataSorting orderBy) { ApplicationUser userGroups = null; // Checking... if ((appContext?.IsValid() ?? false) == false) { return(null); } // Init... orderBy = DataSorting.Validation; // User role and groups... string userRole = appContext.User?.HigherRole() ?? null; List <int> userGroupIds = appContext.User?.GroupsId(); if (userGroupIds != null && userGroupIds.Count > 0) { userGroups = new ApplicationUser(); userGroups.Group1 = appContext.User.Group1; userGroups.Group2 = appContext.User.Group2; userGroups.Group3 = appContext.User.Group3; userGroups.Group4 = appContext.User.Group4; userGroups.Group5 = appContext.User.Group5; userGroups.Group6 = appContext.User.Group6; userGroups.Group7 = appContext.User.Group7; userGroups.Group8 = appContext.User.Group8; userGroups.Group9 = appContext.User.Group9; userGroups.Group10 = appContext.User.Group10; } // Get filter to apply on the user table... string title = null; bool filterOngroup = false; if (filters != null) { foreach (KeyValuePair <string, object> filter in filters) { if (filter.Key != null && filter.Value != null) { if (filter.Key == QueryFilter.Title && string.IsNullOrWhiteSpace((string)filter.Value) == false) { title = (string)filter.Value; } else if (filter.Key == QueryFilter.Group) { filterOngroup = true; if (userGroupIds != null && userGroupIds.Count > 0) { if (userGroupIds.Contains((int)filter.Value) == true) { userGroups.Group1 = (int)filter.Value; userGroups.Group2 = -1; userGroups.Group3 = -1; userGroups.Group4 = -1; userGroups.Group5 = -1; userGroups.Group6 = -1; userGroups.Group7 = -1; userGroups.Group8 = -1; userGroups.Group9 = -1; userGroups.Group10 = -1; } else { // The asked group is not part of the user groups...so return an empty list... return(null); } } else { // User is not part of any group...so return an empty list... return(null); } } /*else if (filter.Key == QueryFilter.UserEnabled) * { * } * else if (filter.Key == QueryFilter.UserLocked) * { * } * else if (filter.Key == QueryFilter.EmailConfirmed) * { * }*/ } } } // Base query... var query = appContext.AppDbContext.Users?.Where(u => u.SiteId == appContext.Site.Id); // Title filter... if (title != null) { query = query?.Where(u => u.UserName.Contains(title) == true || u.Email.Contains(title) == true); } // Filtering based on the region... if (appContext.Site.HasRegions == true && (appContext.Region?.Id ?? -1) != -1) { query = query? .Where(u => u.Region1 == 0 || u.Region1 == appContext.Region.Id || u.Region2 == 0 || u.Region2 == appContext.Region.Id || u.Region3 == 0 || u.Region3 == appContext.Region.Id || u.Region4 == 0 || u.Region4 == appContext.Region.Id || u.Region5 == 0 || u.Region5 == appContext.Region.Id || u.Region6 == 0 || u.Region6 == appContext.Region.Id || u.Region7 == 0 || u.Region7 == appContext.Region.Id || u.Region8 == 0 || u.Region8 == appContext.Region.Id || u.Region9 == 0 || u.Region9 == appContext.Region.Id || u.Region10 == 0 || u.Region10 == appContext.Region.Id); } // Administrator have read rights on all users of the same groups... if ((userRole == ClaimValueRole.Administrator) && userGroups != null) { query = query? .Where(p => (p.Group1 != -1 && (userGroups.Group1 == p.Group1 || userGroups.Group2 == p.Group1 || userGroups.Group3 == p.Group1 || userGroups.Group4 == p.Group1 || userGroups.Group5 == p.Group1 || userGroups.Group6 == p.Group1 || userGroups.Group7 == p.Group1 || userGroups.Group8 == p.Group1 || userGroups.Group9 == p.Group1 || userGroups.Group10 == p.Group1)) || (p.Group2 != -1 && (userGroups.Group1 == p.Group2 || userGroups.Group2 == p.Group2 || userGroups.Group3 == p.Group2 || userGroups.Group4 == p.Group2 || userGroups.Group5 == p.Group2 || userGroups.Group6 == p.Group2 || userGroups.Group7 == p.Group2 || userGroups.Group8 == p.Group2 || userGroups.Group9 == p.Group2 || userGroups.Group10 == p.Group2)) || (p.Group3 != -1 && (userGroups.Group1 == p.Group3 || userGroups.Group2 == p.Group3 || userGroups.Group3 == p.Group3 || userGroups.Group4 == p.Group3 || userGroups.Group5 == p.Group3 || userGroups.Group6 == p.Group3 || userGroups.Group7 == p.Group3 || userGroups.Group8 == p.Group3 || userGroups.Group9 == p.Group3 || userGroups.Group10 == p.Group3)) || (p.Group4 != -1 && (userGroups.Group1 == p.Group4 || userGroups.Group2 == p.Group4 || userGroups.Group3 == p.Group4 || userGroups.Group4 == p.Group4 || userGroups.Group5 == p.Group4 || userGroups.Group6 == p.Group4 || userGroups.Group7 == p.Group4 || userGroups.Group8 == p.Group4 || userGroups.Group9 == p.Group4 || userGroups.Group10 == p.Group4)) || (p.Group5 != -1 && (userGroups.Group1 == p.Group5 || userGroups.Group2 == p.Group5 || userGroups.Group3 == p.Group5 || userGroups.Group4 == p.Group5 || userGroups.Group5 == p.Group5 || userGroups.Group6 == p.Group5 || userGroups.Group7 == p.Group5 || userGroups.Group8 == p.Group5 || userGroups.Group9 == p.Group5 || userGroups.Group10 == p.Group5)) || (p.Group6 != -1 && (userGroups.Group1 == p.Group6 || userGroups.Group2 == p.Group6 || userGroups.Group3 == p.Group6 || userGroups.Group4 == p.Group6 || userGroups.Group5 == p.Group6 || userGroups.Group6 == p.Group6 || userGroups.Group7 == p.Group6 || userGroups.Group8 == p.Group6 || userGroups.Group9 == p.Group6 || userGroups.Group10 == p.Group6)) || (p.Group7 != -1 && (userGroups.Group1 == p.Group7 || userGroups.Group2 == p.Group7 || userGroups.Group3 == p.Group7 || userGroups.Group4 == p.Group7 || userGroups.Group5 == p.Group7 || userGroups.Group6 == p.Group7 || userGroups.Group7 == p.Group7 || userGroups.Group8 == p.Group7 || userGroups.Group9 == p.Group7 || userGroups.Group10 == p.Group7)) || (p.Group8 != -1 && (userGroups.Group1 == p.Group8 || userGroups.Group2 == p.Group8 || userGroups.Group3 == p.Group8 || userGroups.Group4 == p.Group8 || userGroups.Group5 == p.Group8 || userGroups.Group6 == p.Group8 || userGroups.Group7 == p.Group8 || userGroups.Group8 == p.Group8 || userGroups.Group9 == p.Group8 || userGroups.Group10 == p.Group8)) || (p.Group9 != -1 && (userGroups.Group1 == p.Group9 || userGroups.Group2 == p.Group9 || userGroups.Group3 == p.Group9 || userGroups.Group4 == p.Group9 || userGroups.Group5 == p.Group9 || userGroups.Group6 == p.Group9 || userGroups.Group7 == p.Group9 || userGroups.Group8 == p.Group9 || userGroups.Group9 == p.Group9 || userGroups.Group10 == p.Group9)) || (p.Group10 != -1 && (userGroups.Group1 == p.Group10 || userGroups.Group2 == p.Group10 || userGroups.Group3 == p.Group10 || userGroups.Group4 == p.Group10 || userGroups.Group5 == p.Group10 || userGroups.Group6 == p.Group10 || userGroups.Group7 == p.Group10 || userGroups.Group8 == p.Group10 || userGroups.Group9 == p.Group10 || userGroups.Group10 == p.Group10))); } // Have role but no group... else if (userRole == ClaimValueRole.Administrator) { // Can only see user without group... query = query? .Where(p => p.Group1 == -1 && p.Group2 == -1 && p.Group3 == -1 && p.Group4 == -1 && p.Group5 == -1 && p.Group6 == -1 && p.Group7 == -1 && p.Group8 == -1 && p.Group9 == -1 && p.Group10 == -1); } // No role and no group... else { return(null); } return(query); }
/// <summary> /// Get users. /// </summary> /// <param name="appContext"></param> /// <param name="filters"></param> /// <param name="skip"></param> /// <param name="take"></param> /// <param name="allFields"></param> /// <returns></returns> public static async Task <IEnumerable <ApplicationUser> > Get(Services.WcmsAppContext appContext, Dictionary <string, object> filters, int skip, int take, bool allFields) { DataSorting orderBy = DataSorting.Email; // Checking... if (skip < 0) { skip = 0; } else if (take <= 0) { take = 20; } else if (take > 200) { take = 200; } // Build the query... var query = _GetQuery(appContext, filters, ref orderBy); if (query == null) { return(null); } // Sorting... if (orderBy == DataSorting.UserName) { query = query.OrderBy(p => p.UserName); } else if (orderBy == DataSorting.Email) { query = query.OrderBy(p => p.Email); } // Fields included... if (allFields == true) { query = query .Include(p => p.Claims) .Select(p => new ApplicationUser { AccessFailedCount = p.AccessFailedCount, Email = p.Email, EmailConfirmed = p.EmailConfirmed, Id = p.Id, //LockoutEnabled = p.LockoutEnabled, LockoutEnd = p.LockoutEnd, //PhoneNumber = p.PhoneNumber, PhoneNumberConfirmed = p.PhoneNumberConfirmed, UserName = p.UserName, }); //.Include(p => p.Creator); //TODO: Only need for Unit test. } // Trace performance... appContext?.AddPerfLog("UserAuthorizationHandler::Get::Query built"); // Execute the query... IEnumerable <ApplicationUser> items = await query .Skip(skip *take).Take(take) .ToListAsync(); // Trace performance... appContext?.AddPerfLog("UserAuthorizationHandler::Get::Query executed"); // Exit... return(items); }