diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs index bbaa8087f4..2b261b065e 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs @@ -197,42 +197,27 @@ public class EfCoreIdentityUserRepository : EfCoreRepository().Where(q => q.RoleId == roleId.Value).Select(q => q.OrganizationUnitId).ToArrayAsync(cancellationToken: cancellationToken); - query = query.Where(identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value) || identityUser.OrganizationUnits.Any(x => organizationUnitIds.Contains(x.OrganizationUnitId))); - } - - return await query - .WhereIf( - !filter.IsNullOrWhiteSpace(), - u => - u.NormalizedUserName.Contains(upperFilter) || - u.NormalizedEmail.Contains(upperFilter) || - (u.Name != null && u.Name.Contains(filter)) || - (u.Surname != null && u.Surname.Contains(filter)) || - (u.PhoneNumber != null && u.PhoneNumber.Contains(filter)) - ) - .WhereIf(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) - .WhereIf(!string.IsNullOrWhiteSpace(userName), x => x.UserName.Contains(userName)) - .WhereIf(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber.Contains(phoneNumber)) - .WhereIf(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email.Contains(emailAddress)) - .WhereIf(!string.IsNullOrWhiteSpace(name), x => x.Name.Contains(name)) - .WhereIf(!string.IsNullOrWhiteSpace(surname), x => x.Surname.Contains(surname)) - .WhereIf(isLockedOut.HasValue, x => (x.LockoutEnabled && x.LockoutEnd.HasValue && x.LockoutEnd.Value.CompareTo(DateTime.UtcNow) > 0) == isLockedOut.Value) - .WhereIf(notActive.HasValue, x => x.IsActive == !notActive.Value) - .WhereIf(emailConfirmed.HasValue, x => x.EmailConfirmed == emailConfirmed.Value) - .WhereIf(isExternal.HasValue, x => x.IsExternal == isExternal.Value) - .WhereIf(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) - .WhereIf(minCreationTime != null, p => p.CreationTime >= minCreationTime) - .WhereIf(maxModifitionTime != null, p => p.LastModificationTime <= maxModifitionTime) - .WhereIf(minModifitionTime != null, p => p.LastModificationTime >= minModifitionTime) + var query = await GetFilteredQueryableAsync( + filter, + roleId, + organizationUnitId, + userName, + phoneNumber, + emailAddress, + name, + surname, + isLockedOut, + notActive, + emailConfirmed, + isExternal, + maxCreationTime, + minCreationTime, + maxModifitionTime, + minModifitionTime, + cancellationToken + ); + + return await query.IncludeDetails(includeDetails) .OrderBy(sorting.IsNullOrWhiteSpace() ? nameof(IdentityUser.UserName) : sorting) .PageBy(skipCount, maxResultCount) .ToListAsync(GetCancellationToken(cancellationToken)); @@ -288,33 +273,25 @@ public class EfCoreIdentityUserRepository : EfCoreRepository - u.NormalizedUserName.Contains(upperFilter) || - u.NormalizedEmail.Contains(upperFilter) || - (u.Name != null && u.Name.Contains(filter)) || - (u.Surname != null && u.Surname.Contains(filter)) || - (u.PhoneNumber != null && u.PhoneNumber.Contains(filter)) - ) - .WhereIf(roleId.HasValue, identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value)) - .WhereIf(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) - .WhereIf(!string.IsNullOrWhiteSpace(userName), x => x.UserName == userName) - .WhereIf(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber == phoneNumber) - .WhereIf(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email == emailAddress) - .WhereIf(!string.IsNullOrWhiteSpace(name), x => x.Name == name) - .WhereIf(!string.IsNullOrWhiteSpace(surname), x => x.Surname == surname) - .WhereIf(isLockedOut.HasValue, x => (x.LockoutEnabled && x.LockoutEnd.HasValue && x.LockoutEnd.Value.CompareTo(DateTime.UtcNow) > 0) == isLockedOut.Value) - .WhereIf(notActive.HasValue, x => x.IsActive == !notActive.Value) - .WhereIf(emailConfirmed.HasValue, x => x.EmailConfirmed == emailConfirmed.Value) - .WhereIf(isExternal.HasValue, x => x.IsExternal == isExternal.Value) - .WhereIf(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) - .WhereIf(minCreationTime != null, p => p.CreationTime >= minCreationTime) - .WhereIf(maxModifitionTime != null, p => p.LastModificationTime <= maxModifitionTime) - .WhereIf(minModifitionTime != null, p => p.LastModificationTime >= minModifitionTime) - .LongCountAsync(GetCancellationToken(cancellationToken)); + return await (await GetFilteredQueryableAsync( + filter, + roleId, + organizationUnitId, + userName, + phoneNumber, + emailAddress, + name, + surname, + isLockedOut, + notActive, + emailConfirmed, + isExternal, + maxCreationTime, + minCreationTime, + maxModifitionTime, + minModifitionTime, + cancellationToken + )).LongCountAsync(GetCancellationToken(cancellationToken)); } public virtual async Task> GetOrganizationUnitsAsync( @@ -438,4 +415,59 @@ public class EfCoreIdentityUserRepository : EfCoreRepository().Where(x => x.OrganizationUnitId == sourceOrganizationId).ExecuteDeleteAsync(GetCancellationToken(cancellationToken)); } } + + protected virtual async Task> GetFilteredQueryableAsync( + string filter = null, + Guid? roleId = null, + Guid? organizationUnitId = null, + string userName = null, + string phoneNumber = null, + string emailAddress = null, + string name = null, + string surname = null, + bool? isLockedOut = null, + bool? notActive = null, + bool? emailConfirmed = null, + bool? isExternal = null, + DateTime? maxCreationTime = null, + DateTime? minCreationTime = null, + DateTime? maxModifitionTime = null, + DateTime? minModifitionTime = null, + CancellationToken cancellationToken = default) + { + var upperFilter = filter?.ToUpperInvariant(); + var query = await GetQueryableAsync(); + + if (roleId.HasValue) + { + var dbContext = await GetDbContextAsync(); + var organizationUnitIds = await dbContext.Set().Where(q => q.RoleId == roleId.Value).Select(q => q.OrganizationUnitId).ToArrayAsync(cancellationToken: cancellationToken); + query = query.Where(identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value) || identityUser.OrganizationUnits.Any(x => organizationUnitIds.Contains(x.OrganizationUnitId))); + } + + return query + .WhereIf( + !filter.IsNullOrWhiteSpace(), + u => + u.NormalizedUserName.Contains(upperFilter) || + u.NormalizedEmail.Contains(upperFilter) || + (u.Name != null && u.Name.Contains(filter)) || + (u.Surname != null && u.Surname.Contains(filter)) || + (u.PhoneNumber != null && u.PhoneNumber.Contains(filter)) + ) + .WhereIf(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) + .WhereIf(!string.IsNullOrWhiteSpace(userName), x => x.UserName == userName) + .WhereIf(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber == phoneNumber) + .WhereIf(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email == emailAddress) + .WhereIf(!string.IsNullOrWhiteSpace(name), x => x.Name == name) + .WhereIf(!string.IsNullOrWhiteSpace(surname), x => x.Surname == surname) + .WhereIf(isLockedOut.HasValue, x => (x.LockoutEnabled && x.LockoutEnd.HasValue && x.LockoutEnd.Value.CompareTo(DateTime.UtcNow) > 0) == isLockedOut.Value) + .WhereIf(notActive.HasValue, x => x.IsActive == !notActive.Value) + .WhereIf(emailConfirmed.HasValue, x => x.EmailConfirmed == emailConfirmed.Value) + .WhereIf(isExternal.HasValue, x => x.IsExternal == isExternal.Value) + .WhereIf(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) + .WhereIf(minCreationTime != null, p => p.CreationTime >= minCreationTime) + .WhereIf(maxModifitionTime != null, p => p.LastModificationTime <= maxModifitionTime) + .WhereIf(minModifitionTime != null, p => p.LastModificationTime >= minModifitionTime); + } } diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs index aab3e3c63a..1ce97c4dfd 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs @@ -164,45 +164,28 @@ public class MongoIdentityUserRepository : MongoDbRepository(cancellationToken)) - .Where(ou => ou.Roles.Any(r => r.RoleId == roleId.Value)) - .Select(userOrganizationUnit => userOrganizationUnit.Id) - .ToArray(); - - query = query.Where(identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value) || identityUser.OrganizationUnits.Any(x => organizationUnitIds.Contains(x.OrganizationUnitId))); - } + { + var query = await GetFilteredQueryableAsync( + filter, + roleId, + organizationUnitId, + userName, + phoneNumber, + emailAddress, + name, + surname, + isLockedOut, + notActive, + emailConfirmed, + isExternal, + maxCreationTime, + minCreationTime, + maxModifitionTime, + minModifitionTime, + cancellationToken + ); return await query - .WhereIf>( - !filter.IsNullOrWhiteSpace(), - u => - u.NormalizedUserName.Contains(upperFilter) || - u.NormalizedEmail.Contains(upperFilter) || - (u.Name != null && u.Name.Contains(filter)) || - (u.Surname != null && u.Surname.Contains(filter)) || - (u.PhoneNumber != null && u.PhoneNumber.Contains(filter)) - ) - .WhereIf>(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) - .WhereIf>(!string.IsNullOrWhiteSpace(userName), x => x.UserName.Contains(userName)) - .WhereIf>(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber.Contains(phoneNumber)) - .WhereIf>(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email.Contains(emailAddress)) - .WhereIf>(!string.IsNullOrWhiteSpace(name), x => x.Name.Contains(name)) - .WhereIf>(!string.IsNullOrWhiteSpace(surname), x => x.Surname.Contains(surname)) - .WhereIf>(isLockedOut.HasValue && isLockedOut.Value, x => x.LockoutEnabled && x.LockoutEnd != null && x.LockoutEnd > DateTimeOffset.UtcNow) - .WhereIf>(isLockedOut.HasValue && !isLockedOut.Value, x => !(x.LockoutEnabled && x.LockoutEnd != null && x.LockoutEnd > DateTimeOffset.UtcNow)) - .WhereIf>(notActive.HasValue, x => x.IsActive == !notActive.Value) - .WhereIf>(emailConfirmed.HasValue, x => x.EmailConfirmed == emailConfirmed.Value) - .WhereIf>(isExternal.HasValue, x => x.IsExternal == isExternal.Value) - .WhereIf(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) - .WhereIf(minCreationTime != null, p => p.CreationTime >= minCreationTime) - .WhereIf(maxModifitionTime != null, p => p.LastModificationTime <= maxModifitionTime) - .WhereIf(minModifitionTime != null, p => p.LastModificationTime >= minModifitionTime) .OrderBy(sorting.IsNullOrWhiteSpace() ? nameof(IdentityUser.UserName) : sorting) .As>() .PageBy>(skipCount, maxResultCount) @@ -262,34 +245,27 @@ public class MongoIdentityUserRepository : MongoDbRepository>( - !filter.IsNullOrWhiteSpace(), - u => - u.NormalizedUserName.Contains(upperFilter) || - u.NormalizedEmail.Contains(upperFilter) || - (u.Name != null && u.Name.Contains(filter)) || - (u.Surname != null && u.Surname.Contains(filter)) || - (u.PhoneNumber != null && u.PhoneNumber.Contains(filter)) - ) - .WhereIf>(roleId.HasValue, identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value)) - .WhereIf>(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) - .WhereIf>(!string.IsNullOrWhiteSpace(userName), x => x.UserName == userName) - .WhereIf>(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber == phoneNumber) - .WhereIf>(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email == emailAddress) - .WhereIf>(!string.IsNullOrWhiteSpace(name), x => x.Name == name) - .WhereIf>(!string.IsNullOrWhiteSpace(surname), x => x.Surname == surname) - .WhereIf>(isLockedOut.HasValue && isLockedOut.Value, x => x.LockoutEnabled && x.LockoutEnd != null && x.LockoutEnd > DateTimeOffset.UtcNow) - .WhereIf>(isLockedOut.HasValue && !isLockedOut.Value, x => !(x.LockoutEnabled && x.LockoutEnd != null && x.LockoutEnd > DateTimeOffset.UtcNow)) - .WhereIf>(notActive.HasValue, x => x.IsActive == !notActive.Value) - .WhereIf>(emailConfirmed.HasValue, x => x.EmailConfirmed == emailConfirmed.Value) - .WhereIf>(isExternal.HasValue, x => x.IsExternal == isExternal.Value) - .WhereIf>(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) - .WhereIf>(minCreationTime != null, p => p.CreationTime >= minCreationTime) - .WhereIf>(maxModifitionTime != null, p => p.LastModificationTime <= maxModifitionTime) - .WhereIf>(minModifitionTime != null, p => p.LastModificationTime >= minModifitionTime) - .LongCountAsync(GetCancellationToken(cancellationToken)); + var query = await GetFilteredQueryableAsync( + filter, + roleId, + organizationUnitId, + userName, + phoneNumber, + emailAddress, + name, + surname, + isLockedOut, + notActive, + emailConfirmed, + isExternal, + maxCreationTime, + minCreationTime, + maxModifitionTime, + minModifitionTime, + cancellationToken + ); + + return await query.LongCountAsync(GetCancellationToken(cancellationToken)); } public virtual async Task> GetUsersInOrganizationUnitAsync( @@ -431,4 +407,63 @@ public class MongoIdentityUserRepository : MongoDbRepository> GetFilteredQueryableAsync( + string filter = null, + Guid? roleId = null, + Guid? organizationUnitId = null, + string userName = null, + string phoneNumber = null, + string emailAddress = null, + string name = null, + string surname = null, + bool? isLockedOut = null, + bool? notActive = null, + bool? emailConfirmed = null, + bool? isExternal = null, + DateTime? maxCreationTime = null, + DateTime? minCreationTime = null, + DateTime? maxModifitionTime = null, + DateTime? minModifitionTime = null, + CancellationToken cancellationToken = default) + { + var upperFilter = filter?.ToUpperInvariant(); + var query = await GetMongoQueryableAsync(cancellationToken); + + if (roleId.HasValue) + { + var organizationUnitIds = (await GetMongoQueryableAsync(cancellationToken)) + .Where(ou => ou.Roles.Any(r => r.RoleId == roleId.Value)) + .Select(userOrganizationUnit => userOrganizationUnit.Id) + .ToArray(); + + query = query.Where(identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value) || identityUser.OrganizationUnits.Any(x => organizationUnitIds.Contains(x.OrganizationUnitId))); + } + + return query + .WhereIf>( + !filter.IsNullOrWhiteSpace(), + u => + u.NormalizedUserName.Contains(upperFilter) || + u.NormalizedEmail.Contains(upperFilter) || + (u.Name != null && u.Name.Contains(filter)) || + (u.Surname != null && u.Surname.Contains(filter)) || + (u.PhoneNumber != null && u.PhoneNumber.Contains(filter)) + ) + .WhereIf>(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) + .WhereIf>(!string.IsNullOrWhiteSpace(userName), x => x.UserName == userName) + .WhereIf>(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber == phoneNumber) + .WhereIf>(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email == emailAddress) + .WhereIf>(!string.IsNullOrWhiteSpace(name), x => x.Name == name) + .WhereIf>(!string.IsNullOrWhiteSpace(surname), x => x.Surname == surname) + .WhereIf>(isLockedOut.HasValue && isLockedOut.Value, x => x.LockoutEnabled && x.LockoutEnd != null && x.LockoutEnd > DateTimeOffset.UtcNow) + .WhereIf>(isLockedOut.HasValue && !isLockedOut.Value, x => !(x.LockoutEnabled && x.LockoutEnd != null && x.LockoutEnd > DateTimeOffset.UtcNow)) + .WhereIf>(notActive.HasValue, x => x.IsActive == !notActive.Value) + .WhereIf>(emailConfirmed.HasValue, x => x.EmailConfirmed == emailConfirmed.Value) + .WhereIf>(isExternal.HasValue, x => x.IsExternal == isExternal.Value) + .WhereIf>(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) + .WhereIf>(minCreationTime != null, p => p.CreationTime >= minCreationTime) + .WhereIf>(maxModifitionTime != null, p => p.LastModificationTime <= maxModifitionTime) + .WhereIf>(minModifitionTime != null, p => p.LastModificationTime >= minModifitionTime); + } }