From f0d2854071d3bba0a38d831fb95cbbda10c46edf Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Thu, 8 Aug 2019 17:42:29 +0300 Subject: [PATCH] People: fix search by filter --- .../Caching/CachedUserService.cs | 2 +- .../Context/Impl/UserManager.cs | 2 +- common/ASC.Core.Common/Core/IUserService.cs | 2 +- common/ASC.Core.Common/Data/DbUserService.cs | 31 +++++++++++++------ .../Server/Controllers/PeopleController.cs | 14 ++++++--- 5 files changed, 33 insertions(+), 18 deletions(-) diff --git a/common/ASC.Core.Common/Caching/CachedUserService.cs b/common/ASC.Core.Common/Caching/CachedUserService.cs index 48588e7c8b..9fd6a6feb6 100644 --- a/common/ASC.Core.Common/Caching/CachedUserService.cs +++ b/common/ASC.Core.Common/Caching/CachedUserService.cs @@ -91,7 +91,7 @@ namespace ASC.Core.Caching } } - public IDictionary GetUsers(int tenant, bool isAdmin, EmployeeStatus? employeeStatus, List includeGroups, List excludeGroups, EmployeeActivationStatus? activationStatus, string text, string sortBy, bool sortOrderAsc, long limit, long offset, out int total) + public IDictionary GetUsers(int tenant, bool isAdmin, EmployeeStatus? employeeStatus, List> includeGroups, List excludeGroups, EmployeeActivationStatus? activationStatus, string text, string sortBy, bool sortOrderAsc, long limit, long offset, out int total) { return service.GetUsers(tenant, isAdmin, employeeStatus, includeGroups, excludeGroups, activationStatus, text, sortBy, sortOrderAsc, limit, offset, out total); } diff --git a/common/ASC.Core.Common/Context/Impl/UserManager.cs b/common/ASC.Core.Common/Context/Impl/UserManager.cs index 167d92833b..874a46f625 100644 --- a/common/ASC.Core.Common/Context/Impl/UserManager.cs +++ b/common/ASC.Core.Common/Context/Impl/UserManager.cs @@ -87,7 +87,7 @@ namespace ASC.Core return users.ToArray(); } - public IEnumerable GetUsers(int tenantId, bool isAdmin, EmployeeStatus? employeeStatus, List includeGroups, List excludeGroups, EmployeeActivationStatus? activationStatus, string text, string sortBy, bool sortOrderAsc, long limit, long offset, out int total) + public IEnumerable GetUsers(int tenantId, bool isAdmin, EmployeeStatus? employeeStatus, List> includeGroups, List excludeGroups, EmployeeActivationStatus? activationStatus, string text, string sortBy, bool sortOrderAsc, long limit, long offset, out int total) { return userService.GetUsers(tenantId, isAdmin, employeeStatus, includeGroups, excludeGroups, activationStatus, text, sortBy, sortOrderAsc, limit, offset, out total).Values; } diff --git a/common/ASC.Core.Common/Core/IUserService.cs b/common/ASC.Core.Common/Core/IUserService.cs index 7788a67b7d..2c0b23a24a 100644 --- a/common/ASC.Core.Common/Core/IUserService.cs +++ b/common/ASC.Core.Common/Core/IUserService.cs @@ -36,7 +36,7 @@ namespace ASC.Core IDictionary GetUsers(int tenant, bool isAdmin, EmployeeStatus? employeeStatus, - List includeGroups, + List> includeGroups, List excludeGroups, EmployeeActivationStatus? activationStatus, string text, diff --git a/common/ASC.Core.Common/Data/DbUserService.cs b/common/ASC.Core.Common/Data/DbUserService.cs index c37ecf9bb3..54e6bb87f4 100644 --- a/common/ASC.Core.Common/Data/DbUserService.cs +++ b/common/ASC.Core.Common/Data/DbUserService.cs @@ -52,7 +52,7 @@ namespace ASC.Core.Data public IDictionary GetUsers(int tenant, bool isAdmin, EmployeeStatus? employeeStatus, - List includeGroups, + List> includeGroups, List excludeGroups, EmployeeActivationStatus? activationStatus, string text, @@ -90,7 +90,7 @@ namespace ASC.Core.Data private SqlQuery GetUserQueryForFilter(SqlQuery q,bool isAdmin, EmployeeStatus? employeeStatus, - List includeGroups, + List> includeGroups, List excludeGroups, EmployeeActivationStatus? activationStatus, string text) @@ -99,14 +99,24 @@ namespace ASC.Core.Data if (includeGroups != null && includeGroups.Any()) { - foreach (var g in includeGroups) + var groupQuery = new SqlQuery("core_usergroup cug") + .Select("cug.userid") + .Where(Exp.EqColumns("cug.tenant", "u.tenant")) + .Where(Exp.EqColumns("u.id", "cug.userid")); + + foreach (var groups in includeGroups) { - var groupQuery = new SqlQuery("core_usergroup cug") - .Where(Exp.EqColumns("cug.tenant", "cu.tenant")) - .Where(Exp.EqColumns("cu.id", "cug.userid")) - .Where(Exp.Eq("cug.groupid", g)); - q.Where(Exp.Exists(groupQuery)); + var subQuery = Exp.Empty; + + foreach(var g in groups) + { + subQuery |= Exp.Eq("cug.groupid", g); + } + + groupQuery.Where(subQuery); } + + q.Where(Exp.Exists(groupQuery)); } if (excludeGroups != null && excludeGroups.Any()) @@ -114,8 +124,9 @@ namespace ASC.Core.Data foreach (var g in excludeGroups) { var groupQuery = new SqlQuery("core_usergroup cug") - .Where(Exp.EqColumns("cug.tenant", "cu.tenant")) - .Where(Exp.EqColumns("cu.id", "cug.userid")) + .Select("cug.userid") + .Where(Exp.EqColumns("cug.tenant", "u.tenant")) + .Where(Exp.EqColumns("u.id", "cug.userid")) .Where(Exp.Eq("cug.groupid", g)); q.Where(!Exp.Exists(groupQuery)); } diff --git a/products/ASC.People/Server/Controllers/PeopleController.cs b/products/ASC.People/Server/Controllers/PeopleController.cs index 8735811a4b..eb3fd4fe0e 100644 --- a/products/ASC.People/Server/Controllers/PeopleController.cs +++ b/products/ASC.People/Server/Controllers/PeopleController.cs @@ -272,10 +272,10 @@ namespace ASC.Employee.Core.Controllers var isAdmin = CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsAdmin(ApiContext.Tenant) || WebItemSecurity.IsProductAdministrator(ApiContext.Tenant, WebItemManager.PeopleProductID, SecurityContext.CurrentAccount.ID); - var includeGroups = new List(); + var includeGroups = new List>(); if (groupId.HasValue) { - includeGroups.Add(groupId.Value); + includeGroups.Add(new List { groupId.Value }); } var excludeGroups = new List(); @@ -288,18 +288,22 @@ namespace ASC.Employee.Core.Controllers excludeGroups.Add(Constants.GroupVisitor.ID); break; case EmployeeType.Visitor: - includeGroups.Add(Constants.GroupVisitor.ID); + includeGroups.Add(new List { Constants.GroupVisitor.ID }); break; } } if (isAdministrator.HasValue && isAdministrator.Value) { - includeGroups.Add(Constants.GroupAdmin.ID); + var adminGroups = new List + { + Constants.GroupAdmin.ID + }; var products = WebItemManager.Instance.GetItemsAll().Where(i => i is IProduct || i.ID == WebItemManager.MailProductID); + adminGroups.AddRange(products.Select(r=> r.ID)); - includeGroups.AddRange(products.Select(r=> r.ID)); + includeGroups.Add(adminGroups); } var users = CoreContext.UserManager.GetUsers(ApiContext.Tenant.TenantId, isAdmin, employeeStatus, includeGroups, excludeGroups, activationStatus, ApiContext.FilterValue, ApiContext.SortBy, !ApiContext.SortDescending, ApiContext.Count - 1, ApiContext.StartIndex, out int total);