From 500dafe7a2f4b37ac260a2199e4d6248b0a2e7a7 Mon Sep 17 00:00:00 2001 From: Colin Dawson Date: Wed, 4 Feb 2026 22:26:10 +0000 Subject: [PATCH] Refactored the pagination, and removed the need for a FilterSelector, the KeySelector now covers the code properly. --- .../BlockedIPsManager.cs | 14 +---- .../e-suite.Modules.AuditLog/AuditLog.cs | 16 +---- .../CustomFieldManager.cs | 16 +---- .../DomainManager.cs | 13 +--- .../ExceptionLogger.cs | 19 +----- .../FormsManager.cs | 17 +----- .../MailTemplateManager.cs | 12 +--- .../OrganisationsManager.cs | 15 +---- .../PerformanceManager.cs | 42 +------------ .../RoleManager.cs | 57 +++-------------- .../e-suite.Modules.SSOManager/SsoManager.cs | 13 +--- .../SequenceManager.cs | 13 +--- .../SiteManager.cs | 13 +--- .../SpecificationManager.cs | 16 +---- .../UserManager.cs | 52 ++++++---------- .../PaginateUnitTests.cs | 31 ++++------ .../PaginatedData.cs | 61 ++++++++++++++++--- 17 files changed, 105 insertions(+), 315 deletions(-) diff --git a/e-suite.Manager.BlockedIPs/e-suite.Modules.BlockedIPsManager/BlockedIPsManager.cs b/e-suite.Manager.BlockedIPs/e-suite.Modules.BlockedIPsManager/BlockedIPsManager.cs index 4e8b8d7..ced6ba0 100644 --- a/e-suite.Manager.BlockedIPs/e-suite.Modules.BlockedIPsManager/BlockedIPsManager.cs +++ b/e-suite.Manager.BlockedIPs/e-suite.Modules.BlockedIPsManager/BlockedIPsManager.cs @@ -46,7 +46,7 @@ public class BlockedIPsManager : IBlockedIPsManager }); var paginatedData = await PaginatedData.Paginate(data, paging, - KeySelector, FilterSelector, cancellationToken); + KeySelector, cancellationToken); return paginatedData; } @@ -56,18 +56,6 @@ public class BlockedIPsManager : IBlockedIPsManager return Math.Floor(attemptedTime.AddMinutes(loginAttemptTimeoutMinutes).Subtract(dateTimeNow).TotalMinutes); } - private Expression> FilterSelector(string? key, string value) - { - return key?.ToLowerInvariant() switch - { - "ipaddress" => x => x.IpAddress.ToString().Contains(value), - "numberOfAttempts" => x => x.NumberOfAttempts.ToString().Contains(value), - "blockedAt" => x => x.BlockedAt.ToString().Contains(value), - "unblockedin" => x => x.UnblockedIn.ToString().Contains(value), - _ => x => x.IpAddress.ToString().Contains(value) - }; - } - private Expression> KeySelector(string? sortKey) { return sortKey?.ToLowerInvariant() switch diff --git a/e-suite.Modules.AuditLog/e-suite.Modules.AuditLog/AuditLog.cs b/e-suite.Modules.AuditLog/e-suite.Modules.AuditLog/AuditLog.cs index 554751f..746d6ba 100644 --- a/e-suite.Modules.AuditLog/e-suite.Modules.AuditLog/AuditLog.cs +++ b/e-suite.Modules.AuditLog/e-suite.Modules.AuditLog/AuditLog.cs @@ -30,24 +30,10 @@ public class AuditLog : IAuditLog var auditEntries = _auditLogRepository.GetAuditEntries(auditParams, primaryOnly); var paginatedData = - await PaginatedData.Paginate(auditEntries, paging, KeySelector, FilterSelector, cancellationToken); + await PaginatedData.Paginate(auditEntries, paging, KeySelector, cancellationToken); return paginatedData; } - private Expression> FilterSelector(string? key, string value) - { - return key?.ToLowerInvariant() switch - { - "id" => x => x.Id.ToString().Contains(value), - "userdisplayname" => x => x.AuditLog.UserDisplayName.Contains(value), - "type" => x => x.AuditLog.Type.Contains(value), - "comment" => x => x.AuditLog.Comment.Contains(value), - "displayname" => x => x.DisplayName!.Contains(value), - _ => x => true - }; - - } - private Expression> KeySelector(string? sortKey) { return sortKey?.ToLowerInvariant() switch diff --git a/e-suite.Modules.CustomFieldsManager/e-suite.Modules.CustomFieldsManager/CustomFieldManager.cs b/e-suite.Modules.CustomFieldsManager/e-suite.Modules.CustomFieldsManager/CustomFieldManager.cs index 609e70d..f8a46e4 100644 --- a/e-suite.Modules.CustomFieldsManager/e-suite.Modules.CustomFieldsManager/CustomFieldManager.cs +++ b/e-suite.Modules.CustomFieldsManager/e-suite.Modules.CustomFieldsManager/CustomFieldManager.cs @@ -125,23 +125,11 @@ public class CustomFieldManager : ICustomFieldManager var sequences = _customFieldRepository.GetCustomFieldList(); var paginatedData = await PaginatedData.Paginate(sequences, paging, - KeySelector, FilterSelector, cancellationToken); + KeySelector, cancellationToken); return paginatedData; } - - private Expression> FilterSelector(string? key, string value) - { - return key?.ToLowerInvariant() switch - { - "id" => x => x.Id.ToString().Contains(value), - "guid" => x => x.Guid.ToString().Contains(value), - "fieldtype" => x => x.FieldType.ToString().Contains(value), - "defaultvalue" => x => x.DefaultValue.ToString().Contains(value), - _ => x => x.Name.Contains(value) - }; - } - + private Expression> KeySelector(string? sortKey) { return sortKey?.ToLowerInvariant() switch diff --git a/e-suite.Modules.DomainManager/e-suite.Modules.DomainManager/DomainManager.cs b/e-suite.Modules.DomainManager/e-suite.Modules.DomainManager/DomainManager.cs index 347d77c..f8443b6 100644 --- a/e-suite.Modules.DomainManager/e-suite.Modules.DomainManager/DomainManager.cs +++ b/e-suite.Modules.DomainManager/e-suite.Modules.DomainManager/DomainManager.cs @@ -27,22 +27,11 @@ namespace e_suite.Modules.DomainManager var forms = _domainRepository.GetDomains(); var paginatedData = await PaginatedData.Paginate(forms, paging, - KeySelector, FilterSelector, cancellationToken); + KeySelector, cancellationToken); return paginatedData; } - private Expression> FilterSelector(string? key, string value) - { - return key?.ToLowerInvariant() switch - { - "id" => x => x.Id.ToString().Contains(value), - "guid" => x => x.Guid.ToString().Contains(value), - "name" => x => x.Name.Contains(value), - _ => x => x.Name.Contains(value) - }; - } - private Expression> KeySelector(string? sortKey) { return sortKey?.ToLowerInvariant() switch diff --git a/e-suite.Modules.ExceptionLogManager/e-suite.Modules.ExceptionLogManager/ExceptionLogger.cs b/e-suite.Modules.ExceptionLogManager/e-suite.Modules.ExceptionLogManager/ExceptionLogger.cs index 5ae0dcb..359a3a2 100644 --- a/e-suite.Modules.ExceptionLogManager/e-suite.Modules.ExceptionLogManager/ExceptionLogger.cs +++ b/e-suite.Modules.ExceptionLogManager/e-suite.Modules.ExceptionLogManager/ExceptionLogger.cs @@ -25,28 +25,11 @@ public class ExceptionLogger : IExceptionLogManager var exceptionLogs = _exceptionLogRepository.GetExceptionLogs(); var paginatedData = await PaginatedData.Paginate(exceptionLogs, paging, - KeySelector, FilterSelector, cancellationToken); + KeySelector, cancellationToken); return paginatedData; } - [ExcludeFromCodeCoverage] - private Expression> FilterSelector(string? key, string value) - { - return key?.ToLowerInvariant() switch - { - "id" => x => x.Id.ToString().Contains(value), - "application" => x => x.Application.ToString().Contains(value), - "exceptionJson" => x => x.ExceptionJson.ToString().Contains(value), - "message" => x => x.Message.ToString().Contains(value), - "stackTrace" => x => x.StackTrace.ToString().Contains(value), - "supportingData" => x => x.SupportingData.ToString().Contains(value), - "occuredAt" => x => x.OccuredAt.ToString().Contains(value), - _ => x => x.Id.ToString().Contains(value) - }; - } - - [ExcludeFromCodeCoverage] private Expression> KeySelector(string? sortKey) { return sortKey?.ToLowerInvariant() switch diff --git a/e-suite.Modules.FormsManager/e-suite.Modules.FormsManager/FormsManager.cs b/e-suite.Modules.FormsManager/e-suite.Modules.FormsManager/FormsManager.cs index 040d20c..8524dcd 100644 --- a/e-suite.Modules.FormsManager/e-suite.Modules.FormsManager/FormsManager.cs +++ b/e-suite.Modules.FormsManager/e-suite.Modules.FormsManager/FormsManager.cs @@ -135,7 +135,7 @@ public class FormsManager : IFormsManager var forms = _formRepository.GetTemplates(); var paginatedData = await PaginatedData.Paginate(forms, paging, - KeySelector, FilterSelector, cancellationToken); + KeySelector, cancellationToken); var mappedData = new List(); @@ -152,21 +152,6 @@ public class FormsManager : IFormsManager return paginatedResult; } - private Expression> FilterSelector(string? key, string value) - { - return key?.ToLowerInvariant() switch - { - "id" => x => x.Id.ToString().Contains(value), - "guid" => x => x.Guid.ToString().Contains(value), - "version" => x => x.Versions - .Where(v => !v.Deleted) - .Max(v => v.Version) - .ToString() - .Contains(value), - _ => x => x.Name.Contains(value) - }; - } - private Expression> KeySelector(string? sortKey) { return sortKey?.ToLowerInvariant() switch diff --git a/e-suite.Modules.MailTemplatesManager/e-suite.Modules.MailTemplatesManager/MailTemplateManager.cs b/e-suite.Modules.MailTemplatesManager/e-suite.Modules.MailTemplatesManager/MailTemplateManager.cs index aa88407..41726d0 100644 --- a/e-suite.Modules.MailTemplatesManager/e-suite.Modules.MailTemplatesManager/MailTemplateManager.cs +++ b/e-suite.Modules.MailTemplatesManager/e-suite.Modules.MailTemplatesManager/MailTemplateManager.cs @@ -40,22 +40,12 @@ public class MailTemplateManager : IMailTemplateManager var queriableMailTemplateTypes = mailTemplateTypes.BuildMock(); - var paginatedResult = await PaginatedData.Paginate(queriableMailTemplateTypes, paging, KeySelector, FilterSelector, + var paginatedResult = await PaginatedData.Paginate(queriableMailTemplateTypes, paging, KeySelector, cancellationToken); return paginatedResult; } - private Expression> FilterSelector(string? key, string value) - { - return key?.ToLowerInvariant() switch - { - "description" => x => x.Description!.Contains(value), - "mailtype" => x => x.MailType.ToString().Contains(value), - _ => x => x.MailType.ToString().Contains(value) - }; - } - private Expression> KeySelector(string? sortKey) { return sortKey?.ToLowerInvariant() switch diff --git a/e-suite.Modules.OrganisationManager/e-Suite.Modules.OrganisationsManager/OrganisationsManager.cs b/e-suite.Modules.OrganisationManager/e-Suite.Modules.OrganisationsManager/OrganisationsManager.cs index 8d5d64a..38c0738 100644 --- a/e-suite.Modules.OrganisationManager/e-Suite.Modules.OrganisationsManager/OrganisationsManager.cs +++ b/e-suite.Modules.OrganisationManager/e-Suite.Modules.OrganisationsManager/OrganisationsManager.cs @@ -58,24 +58,11 @@ public class OrganisationsManager : IOrganisationsManager var organisations = _organisationsManagerRepository.GetOrganisationsList(); var paginatedData = await PaginatedData.Paginate(organisations, paging, - KeySelector, FilterSelector, cancellationToken); + KeySelector, cancellationToken); return paginatedData; } - private Expression> FilterSelector(string? key, string value) - { - return key?.ToLowerInvariant() switch - { - "id" => x => x.Id.ToString().Contains(value), - "guid" => x => x.Guid.ToString().Contains(value), - "name" => x => x.Name.Contains(value), - "address" => x => x.Address.Contains(value), - "status" => x => x.Status.ToString().ToLower().Contains(value), - _ => x => x.Name.Contains(value) - }; - } - private Expression> KeySelector(string? sortKey) { return sortKey?.ToLowerInvariant() switch diff --git a/e-suite.Modules.PerformanceManager/e-suite.Modules.PerformanceManager/PerformanceManager.cs b/e-suite.Modules.PerformanceManager/e-suite.Modules.PerformanceManager/PerformanceManager.cs index 9e2166e..ad1a330 100644 --- a/e-suite.Modules.PerformanceManager/e-suite.Modules.PerformanceManager/PerformanceManager.cs +++ b/e-suite.Modules.PerformanceManager/e-suite.Modules.PerformanceManager/PerformanceManager.cs @@ -22,7 +22,7 @@ public class PerformanceManager : IPerformanceManager var paginatedData = await PaginatedData.Paginate(performanceReportSummary, paging, - KeySelector, FilterSelector, cancellationToken); + KeySelector, cancellationToken); var paginatedResult = new PaginatedData { @@ -45,24 +45,7 @@ public class PerformanceManager : IPerformanceManager ActionName = performanceReportSummary.ActionName }; } - - private Expression> FilterSelector(string? key, string value) - { - return key?.ToLowerInvariant() switch - { - "host" => x => x.Host.Contains(value, StringComparison.CurrentCultureIgnoreCase), - "controllername" => x => x.ControllerName.Contains(value, StringComparison.CurrentCultureIgnoreCase), - "actionname" => x => x.ActionName.Contains(value, StringComparison.CurrentCultureIgnoreCase), - "requestType" => x => x.RequestType.Contains(value, StringComparison.CurrentCultureIgnoreCase), - "count" => x => x.Count.ToString().Contains(value, StringComparison.CurrentCultureIgnoreCase), - "mintotaltimems" => x => x.MinTotalTimeMs.ToString().Contains(value, StringComparison.CurrentCultureIgnoreCase), - "maxtotaltimemS" => x => x.MaxTotalTimeMs.ToString().Contains(value, StringComparison.CurrentCultureIgnoreCase), - "avgtotaltimems" => x => x.AvgTotalTimeMs.ToString().Contains(value, StringComparison.CurrentCultureIgnoreCase), - "sumtotaltimems" => x => x.SumTotalTimeMs.ToString().Contains(value, StringComparison.CurrentCultureIgnoreCase), - _ => x => x.SumTotalTimeMs.ToString().Contains(value, StringComparison.CurrentCultureIgnoreCase), - }; - } - + private Expression> KeySelector(string? sortKey) { return sortKey?.ToLowerInvariant() switch @@ -92,7 +75,7 @@ public class PerformanceManager : IPerformanceManager var performanceReportSummary = _performanceManagerRepository.GetPerformanceReports(hostName, controllerName, actionName, requestType); var paginatedData = await PaginatedData.Paginate(performanceReportSummary, paging, - PerformanceReportKeySelector, PerformanceReportFilterSelector, cancellationToken); + PerformanceReportKeySelector, cancellationToken); var paginatedResult = new PaginatedData { @@ -132,23 +115,4 @@ public class PerformanceManager : IPerformanceManager _ => x => x.StartDateTime }; } - - private Expression> PerformanceReportFilterSelector(string? key, string value) - { - return key?.ToLowerInvariant() switch - { - "host" => x => x.Host.Contains(value, StringComparison.CurrentCultureIgnoreCase), - "controllername" => x => x.ControllerName.Contains(value, StringComparison.CurrentCultureIgnoreCase), - "actionname" => x => x.ActionName.Contains(value, StringComparison.CurrentCultureIgnoreCase), - "requestType" => x => x.RequestType.Contains(value, StringComparison.CurrentCultureIgnoreCase), - "id" => x => x.Id.ToString().Contains(value, StringComparison.CurrentCultureIgnoreCase), - "actionparameters" => x => - x.ActionParameters.ToString().Contains(value, StringComparison.CurrentCultureIgnoreCase), - "startdateyime" => x => - x.StartDateTime.ToString().Contains(value, StringComparison.CurrentCultureIgnoreCase), - "timings" => x => x.Timings.ToString().Contains(value, StringComparison.CurrentCultureIgnoreCase), - "totaltimems" => x => x.TotalTimeMS.ToString().Contains(value, StringComparison.CurrentCultureIgnoreCase), - _ => x => x.StartDateTime.ToString().Contains(value, StringComparison.CurrentCultureIgnoreCase) - }; - } } \ No newline at end of file diff --git a/e-suite.Modules.RoleManager/e-suite.Modules.RoleManager/RoleManager.cs b/e-suite.Modules.RoleManager/e-suite.Modules.RoleManager/RoleManager.cs index cf23a5a..ec5c882 100644 --- a/e-suite.Modules.RoleManager/e-suite.Modules.RoleManager/RoleManager.cs +++ b/e-suite.Modules.RoleManager/e-suite.Modules.RoleManager/RoleManager.cs @@ -41,7 +41,7 @@ public class RoleManager : IRoleManager } var paginatedData = await PaginatedData.Paginate(roles, paging, - KeySelector, FilterSelector, cancellationToken); + KeySelector, cancellationToken); var paginatedResult = new PaginatedData { @@ -73,18 +73,6 @@ public class RoleManager : IRoleManager DomainName = role.Domain.Name }; } - - private Expression> FilterSelector(string? key, string value) - { - return key?.ToLowerInvariant() switch - { - "id" => x => x.Id.ToString().Contains(value), - "guid" => x => x.Guid.ToString().Contains(value), - "name" => x => x.Name.Contains(value), - _ => x => x.Name.Contains(value) - }; - } - private Expression> KeySelector(string? sortKey) { return sortKey?.ToLowerInvariant() switch @@ -213,7 +201,7 @@ public class RoleManager : IRoleManager } var paginatedData = await PaginatedData.Paginate(roleUsers, paging, - UserRoleKeySelector, UserRoleFilterSelector, cancellationToken); + UserRoleKeySelector, cancellationToken); var paginatedResult = new PaginatedData { @@ -236,17 +224,7 @@ public class RoleManager : IRoleManager DisplayName = userRole.User.DisplayName }; } - - private Expression> UserRoleFilterSelector(string? key, string value) - { - return key?.ToLowerInvariant() switch - { - "userid" => x => x.User.Id == long.Parse(value), - "displayname" => x => ((x.User.FirstName.Trim() + " " + x.User.MiddleNames).Trim() + " " + x.User.LastName).Trim().Contains(value), - _ => x => x.Id.ToString().Contains(value), - }; - } - + private Expression> UserRoleKeySelector(string? sortKey) { return sortKey?.ToLowerInvariant() switch @@ -300,23 +278,11 @@ public class RoleManager : IRoleManager var accessList = EnumerateAccessList(); var paginatedResult = await PaginatedData.Paginate(accessList, paging, - AccessListKeySelector, AccessListFilterSelector, cancellationToken); + AccessListKeySelector, cancellationToken); return paginatedResult; } - - private Expression> AccessListFilterSelector(string? key, string value) - { - return key?.ToLowerInvariant() switch - { - "securityaccess" => x => x.SecurityAccess.ToString().Contains(value), - "name" => x => x.Name.Contains(value), - "description" => x => x.Description.Contains(value), - "groupname" => x => x.GroupName.Contains(value), - _ => x => x.Name.Contains(value) - }; - } - + private Expression> AccessListKeySelector(string? sortKey) { return sortKey?.ToLowerInvariant() switch @@ -334,7 +300,7 @@ public class RoleManager : IRoleManager var accessList = _roleManagerRepository.GetAccessForRole(); var paginatedData = await PaginatedData.Paginate(accessList, paging, - RoleAccessKeySelector, RoleAccessFilterSelector, cancellationToken); + RoleAccessKeySelector, cancellationToken); var paginatedResult = new PaginatedData { @@ -485,16 +451,7 @@ public class RoleManager : IRoleManager return domainToCheck; } - - private Expression> RoleAccessFilterSelector(string? key, string value) - { - return key?.ToLowerInvariant() switch - { - "roleid" => x => x.RoleId == long.Parse(value), - _ => x => x.AccessKey.ToString().Contains(value) - }; - } - + private Expression> RoleAccessKeySelector(string? sortKey) { return sortKey?.ToLowerInvariant() switch diff --git a/e-suite.Modules.SSOManager/e-suite.Modules.SSOManager/SsoManager.cs b/e-suite.Modules.SSOManager/e-suite.Modules.SSOManager/SsoManager.cs index 1deef9c..a9e52a1 100644 --- a/e-suite.Modules.SSOManager/e-suite.Modules.SSOManager/SsoManager.cs +++ b/e-suite.Modules.SSOManager/e-suite.Modules.SSOManager/SsoManager.cs @@ -25,7 +25,7 @@ public class SsoManager : ISsoManager var ssoProviders = _ssoManagerRepository.GetSsoProviders().Where(x => x.Deleted == false); var paginatedData = await PaginatedData.Paginate(ssoProviders, paging, - KeySelector, FilterSelector, cancellationToken); + KeySelector, cancellationToken); var paginatedResult = new PaginatedData { @@ -61,17 +61,6 @@ public class SsoManager : ISsoManager return readSsoProvider; } - - private Expression> FilterSelector(string? key, string value) - { - return key?.ToLowerInvariant() switch - { - "id" => x => x.Id.ToString().Contains(value), - "name" => x => x.Name.Contains(value), - _ => x => x.Name.Contains(value) - }; - } - private Expression> KeySelector(string? sortKey) { return sortKey?.ToLowerInvariant() switch diff --git a/e-suite.Modules.SequenceManager/e-Suite.Modules.SequenceManager/SequenceManager.cs b/e-suite.Modules.SequenceManager/e-Suite.Modules.SequenceManager/SequenceManager.cs index 8ae8453..3e4bef4 100644 --- a/e-suite.Modules.SequenceManager/e-Suite.Modules.SequenceManager/SequenceManager.cs +++ b/e-suite.Modules.SequenceManager/e-Suite.Modules.SequenceManager/SequenceManager.cs @@ -54,7 +54,7 @@ public class SequenceManager : ISequenceManager var sequences = _sequenceManagerRepository.GetSequenceList(); var paginatedData = await PaginatedData.Paginate(sequences, paging, - KeySelector, FilterSelector, cancellationToken); + KeySelector, cancellationToken); var paginatedResult = new PaginatedData() { @@ -73,17 +73,6 @@ public class SequenceManager : ISequenceManager return paginatedResult; } - - private Expression> FilterSelector(string? key, string value) - { - return key?.ToLowerInvariant() switch - { - "id" => x => x.Id.ToString().Contains(value), - "guid" => x => x.Guid.ToString().Contains(value), - _ => x => x.Name.Contains(value) - }; - } - private Expression> KeySelector(string? sortKey) { return sortKey?.ToLowerInvariant() switch diff --git a/e-suite.Modules.SiteManager/e-suite.Modules.SiteManager/SiteManager.cs b/e-suite.Modules.SiteManager/e-suite.Modules.SiteManager/SiteManager.cs index 99a439f..7dab21a 100644 --- a/e-suite.Modules.SiteManager/e-suite.Modules.SiteManager/SiteManager.cs +++ b/e-suite.Modules.SiteManager/e-suite.Modules.SiteManager/SiteManager.cs @@ -41,7 +41,7 @@ public class SiteManager : ISiteManager var paginatedData = await PaginatedData.Paginate(forms, paging, - KeySelector, FilterSelector, cancellationToken); + KeySelector, cancellationToken); var paginatedResult = new PaginatedData { @@ -53,17 +53,6 @@ public class SiteManager : ISiteManager return paginatedResult; } - private Expression> FilterSelector(string? key, string value) - { - return key?.ToLowerInvariant() switch - { - "id" => x => x.Id.ToString().Contains(value), - "guid" => x => x.Guid.ToString().Contains(value), - "organisationid" => x => x.OrganisationId.ToString() == value, - _ => x => x.Name.Contains(value) - }; - } - private Expression> KeySelector(string? sortKey) { return sortKey?.ToLowerInvariant() switch diff --git a/e-suite.Modules.SpecificationManager/e-suite.Modules.SpecificationManager/SpecificationManager.cs b/e-suite.Modules.SpecificationManager/e-suite.Modules.SpecificationManager/SpecificationManager.cs index 23609cb..584e6f8 100644 --- a/e-suite.Modules.SpecificationManager/e-suite.Modules.SpecificationManager/SpecificationManager.cs +++ b/e-suite.Modules.SpecificationManager/e-suite.Modules.SpecificationManager/SpecificationManager.cs @@ -128,7 +128,7 @@ public class SpecificationManager : ISpecificationManager var specifications = _specificationManagerRepository.GetSpecifications(); var paginatedData = await PaginatedData.Paginate(specifications, paging, - KeySelector, FilterSelector, cancellationToken); + KeySelector, cancellationToken); var dataPage = new List(); foreach (var data in paginatedData.Data) @@ -163,19 +163,7 @@ public class SpecificationManager : ISpecificationManager FormInstanceId = formInstance.ToGeneralIdRef()!, }; } - - private Expression> FilterSelector(string? key, string value) - { - return key?.ToLowerInvariant() switch - { - "id" => x => x.Id.ToString().Contains(value), - "guid" => x => x.Guid.ToString().Contains(value), - "name" => x => x.Name.Contains(value), - "site.id" => x => x.Site.Id == long.Parse(value), - _ => x => x.Name.Contains(value) - }; - } - + private Expression> KeySelector(string? sortKey) { return sortKey?.ToLowerInvariant() switch diff --git a/e-suite.Modules.UserManager/e-suite.Modules.UserManager/UserManager.cs b/e-suite.Modules.UserManager/e-suite.Modules.UserManager/UserManager.cs index f5444ae..2aa3f58 100644 --- a/e-suite.Modules.UserManager/e-suite.Modules.UserManager/UserManager.cs +++ b/e-suite.Modules.UserManager/e-suite.Modules.UserManager/UserManager.cs @@ -644,7 +644,7 @@ public class UserManager : IUserManager { var users = _userManagerRepository.GetUsers().Where(x => x.Active == true); - var paginatedData = await PaginatedData.Paginate(users, paging, KeySelector, FilterSelector, cancellationToken); + var paginatedData = await PaginatedData.Paginate(users, paging, KeySelector, cancellationToken); var paginatedResult = new PaginatedData { @@ -656,6 +656,22 @@ public class UserManager : IUserManager return paginatedResult; } + private Expression> KeySelector(string? sortKey) + { + return sortKey?.ToLowerInvariant() switch + { + "firstname" => x => x.FirstName, + "lastname" => x => x.LastName, + "middlenames" => x => x.MiddleNames, + "displayname" => x => ((x.FirstName.Trim() + " " + x.MiddleNames).Trim() + " " + x.LastName).Trim(), + "domainname" => x => x.Domain.Name, + "created" => x => x.Created, + "lastupdated" => x => x.LastUpdated, + "email" => x => x.Email, + _ => x => x.Email + }; + } + public async Task GetUserAsync(GeneralIdRef generalIdRef, CancellationToken cancellationToken) { var user = await _userManagerRepository.GetUserById(generalIdRef, cancellationToken) @@ -696,39 +712,7 @@ public class UserManager : IUserManager return getUser; } - - private Expression> FilterSelector(string? key, string value) - { - return key?.ToLowerInvariant() switch - { - "firstname" => x => x.FirstName.Contains(value), - "lastname" => x => x.LastName.Contains(value), - "middlenames" => x => x.MiddleNames.Contains(value), - "displayname" => x => ( x.FirstName + " " + x.MiddleNames + " " + x.LastName ).Contains(value), - "domainname" => x => x.Domain.Name.Contains(value), - "created" => x => x.Created.ToString().Contains(value), - "lastupdated" => x => x.LastUpdated.ToString().Contains(value), - "email" => x => x.Email.Contains(value), - _ => x => x.Email.Contains(value) - }; - } - - private Expression> KeySelector(string? sortKey) - { - return sortKey?.ToLowerInvariant() switch - { - "firstname" => x => x.FirstName, - "lastname" => x => x.LastName, - "middlenames" => x => x.MiddleNames, - "displayname" => x => x.FirstName + " " + x.MiddleNames + " " + x.LastName, - "domainname" => x => x.Domain.Name, - "created" => x => x.Created, - "lastupdated" => x => x.LastUpdated, - "email" => x => x.Email, - _ => x => x.Email - }; - } - + private void AddPasswordHash(User user,string tokenPass) { if (string.IsNullOrWhiteSpace(tokenPass)) diff --git a/e-suite.Utilities.Pagination/e-suite.Utilities.Pagination.UnitTests/PaginateUnitTests.cs b/e-suite.Utilities.Pagination/e-suite.Utilities.Pagination.UnitTests/PaginateUnitTests.cs index a3b5d0d..4497662 100644 --- a/e-suite.Utilities.Pagination/e-suite.Utilities.Pagination.UnitTests/PaginateUnitTests.cs +++ b/e-suite.Utilities.Pagination/e-suite.Utilities.Pagination.UnitTests/PaginateUnitTests.cs @@ -13,15 +13,6 @@ public class TestData [TestFixture] public class PaginateUnitTests { - private Expression> FilterSelector(string key, string value) - { - return key.ToLowerInvariant() switch - { - "id" => x => x.Id.ToString().Contains(value), - _ => x => x.Name.Contains(value) - }; - } - private Expression> KeySelector(string sortKey) { return sortKey.ToLowerInvariant() switch @@ -42,7 +33,7 @@ public class PaginateUnitTests var queryable = data.BuildMock(); var paging = new Paging(); - var result = await PaginatedData.Paginate(queryable, paging, KeySelector, FilterSelector, CancellationToken.None); + var result = await PaginatedData.Paginate(queryable, paging, KeySelector, CancellationToken.None); Assert.That(result.Count, Is.EqualTo(1)); Assert.That(result.Page, Is.EqualTo(1)); @@ -71,7 +62,7 @@ public class PaginateUnitTests var queryable = data.BuildMock(); var paging = new Paging(); - var result = await PaginatedData.Paginate(queryable, paging, KeySelector, FilterSelector, CancellationToken.None); + var result = await PaginatedData.Paginate(queryable, paging, KeySelector, CancellationToken.None); Assert.That(result.Count, Is.EqualTo(10)); Assert.That(result.Page, Is.EqualTo(1)); @@ -101,7 +92,7 @@ public class PaginateUnitTests var queryable = data.BuildMock(); var paging = new Paging(); - var result = await PaginatedData.Paginate(queryable, paging, KeySelector, FilterSelector, CancellationToken.None); + var result = await PaginatedData.Paginate(queryable, paging, KeySelector, CancellationToken.None); Assert.That(result.Count, Is.EqualTo(11)); Assert.That(result.Page, Is.EqualTo(1)); @@ -134,7 +125,7 @@ public class PaginateUnitTests { Page = 2 }; - var result = await PaginatedData.Paginate(queryable, paging, KeySelector, FilterSelector, CancellationToken.None); + var result = await PaginatedData.Paginate(queryable, paging, KeySelector, CancellationToken.None); Assert.That(result.Count, Is.EqualTo(11)); Assert.That(result.Page, Is.EqualTo(2)); @@ -168,7 +159,7 @@ public class PaginateUnitTests Page = 2 }; - var result = await PaginatedData.Paginate(queryable, paging, KeySelector, FilterSelector, CancellationToken.None); + var result = await PaginatedData.Paginate(queryable, paging, KeySelector, CancellationToken.None); Assert.That(result.Count, Is.EqualTo(11)); Assert.That(result.Page, Is.EqualTo(2)); @@ -207,7 +198,7 @@ public class PaginateUnitTests Page = 2, SortAscending = false }; - var result = await PaginatedData.Paginate(queryable, paging, KeySelector, FilterSelector, CancellationToken.None); + var result = await PaginatedData.Paginate(queryable, paging, KeySelector, CancellationToken.None); Assert.That(result.Count, Is.EqualTo(11)); Assert.That(result.Page, Is.EqualTo(2)); @@ -248,7 +239,7 @@ public class PaginateUnitTests SortAscending = false, }; - var result = await PaginatedData.Paginate(queryable, paging, KeySelector, FilterSelector, CancellationToken.None); + var result = await PaginatedData.Paginate(queryable, paging, KeySelector, CancellationToken.None); Assert.That(result.Count, Is.EqualTo(11)); Assert.That(result.Page, Is.EqualTo(2)); @@ -289,7 +280,7 @@ public class PaginateUnitTests SortAscending = true, }; - var result = await PaginatedData.Paginate(queryable, paging, KeySelector, FilterSelector, CancellationToken.None); + var result = await PaginatedData.Paginate(queryable, paging, KeySelector, CancellationToken.None); Assert.That(result.Count, Is.EqualTo(11)); Assert.That(result.Page, Is.EqualTo(2)); @@ -328,7 +319,7 @@ public class PaginateUnitTests Filters = "{\"id\":\"2\"}" }; - var result = await PaginatedData.Paginate(queryable, paging, KeySelector, FilterSelector, CancellationToken.None); + var result = await PaginatedData.Paginate(queryable, paging, KeySelector, CancellationToken.None); Assert.That(result.Count, Is.EqualTo(1)); Assert.That(result.Page, Is.EqualTo(1)); @@ -367,7 +358,7 @@ public class PaginateUnitTests Filters = "{\"name\":\"test2\"}" }; - var result = await PaginatedData.Paginate(queryable, paging, KeySelector, FilterSelector, CancellationToken.None); + var result = await PaginatedData.Paginate(queryable, paging, KeySelector, CancellationToken.None); Assert.That(result.Count, Is.EqualTo(1)); Assert.That(result.Page, Is.EqualTo(1)); @@ -408,7 +399,7 @@ public class PaginateUnitTests PageSize = 5 }; - var result = await PaginatedData.Paginate(queryable, paging, KeySelector, FilterSelector, CancellationToken.None); + var result = await PaginatedData.Paginate(queryable, paging, KeySelector, CancellationToken.None); Assert.That(result.Count, Is.EqualTo(11)); Assert.That(result.Page, Is.EqualTo(1)); diff --git a/e-suite.Utilities.Pagination/e-suite.Utilities.Pagination/PaginatedData.cs b/e-suite.Utilities.Pagination/e-suite.Utilities.Pagination/PaginatedData.cs index b3ddd8a..e6f7f93 100644 --- a/e-suite.Utilities.Pagination/e-suite.Utilities.Pagination/PaginatedData.cs +++ b/e-suite.Utilities.Pagination/e-suite.Utilities.Pagination/PaginatedData.cs @@ -19,11 +19,10 @@ public static class PaginatedData IQueryable queryable, Paging paging, Func>> keySelector, - Func>> filterSelector, CancellationToken cancellationToken ) { - var filteredData = ApplyFilters(queryable, paging.Filters, filterSelector); + var filteredData = ApplyFilters(queryable, paging.Filters, keySelector); var paginated = new PaginatedData { @@ -46,11 +45,10 @@ public static class PaginatedData IQueryable queryable, Paging paging, Func>> keySelector, - Func>> filterSelector, CancellationToken cancellationToken ) { - var paged = await Paginate(queryable, paging, keySelector, filterSelector, cancellationToken); + var paged = await Paginate(queryable, paging, keySelector, cancellationToken); var result = new PaginatedData { @@ -67,12 +65,11 @@ public static class PaginatedData IQueryable queryable, Paging paging, Func>> keySelector, - Func>> filterSelector, CancellationToken cancellationToken, params object[] args ) { - var paged = await Paginate(queryable, paging, keySelector, filterSelector, cancellationToken); + var paged = await Paginate(queryable, paging, keySelector, cancellationToken); var result = new PaginatedData { @@ -92,8 +89,51 @@ public static class PaginatedData } - private static IQueryable ApplyFilters(IQueryable queryable, string filters, - Func>> filterSelector) + private static Expression> BuildContainsFilter( + Expression> accessor, + string value) + { + var param = accessor.Parameters[0]; + Expression body = accessor.Body; + + // Unwrap boxing: (object)x.Id → x.Id + if (body is UnaryExpression unary && unary.NodeType == ExpressionType.Convert) + body = unary.Operand; + + // If the accessor already returns a string, use it directly + if (body.Type == typeof(string)) + { + // x => x.Property != null && x.Property.ToLower().Contains(value) + var notNull = Expression.NotEqual(body, Expression.Constant(null)); + var toLower = Expression.Call(body, nameof(string.ToLower), Type.EmptyTypes); + var contains = Expression.Call( + toLower, + nameof(string.Contains), + Type.EmptyTypes, + Expression.Constant(value.ToLower()) + ); + + var and = Expression.AndAlso(notNull, contains); + return Expression.Lambda>(and, param); + } + + // Otherwise: convert to string safely + var toString = Expression.Call(body, "ToString", Type.EmptyTypes); + var toLowerCall = Expression.Call(toString, nameof(string.ToLower), Type.EmptyTypes); + var containsCall = Expression.Call( + toLowerCall, + nameof(string.Contains), + Type.EmptyTypes, + Expression.Constant(value.ToLower()) + ); + + return Expression.Lambda>(containsCall, param); + } + + private static IQueryable ApplyFilters( + IQueryable queryable, + string filters, + Func>> keySelector) { if (string.IsNullOrWhiteSpace(filters)) return queryable; @@ -109,13 +149,16 @@ public static class PaginatedData { if (!string.IsNullOrWhiteSpace(filter.Value)) { - filteredQueryable = filteredQueryable.Where(filterSelector(filter.Key, filter.Value)); + var accessor = keySelector(filter.Key); + var filterExpr = BuildContainsFilter(accessor, filter.Value); + filteredQueryable = filteredQueryable.Where(filterExpr); } } return filteredQueryable; } + private static IQueryable ApplySort(IQueryable sequences, string sortKey, bool sortAscending, Func>> keySelector) {