From ff83ff4ff91ce5078ac8f657ea01e6a36c4fa2f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 12 Nov 2021 10:27:35 +0300 Subject: [PATCH] Apply data filters while querying from roles. --- .../Abp/Domain/Repositories/RepositoryBase.cs | 10 ++++++++-- .../Repositories/MongoDB/MongoDbRepository.cs | 11 ++++++++--- .../MongoDB/MongoIdentityUserRepository.cs | 18 +++++++++--------- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryBase.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryBase.cs index da10901420..5595a43b6e 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryBase.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryBase.cs @@ -66,12 +66,18 @@ namespace Volo.Abp.Domain.Repositories protected virtual TQueryable ApplyDataFilters(TQueryable query) where TQueryable : IQueryable { - if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity))) + return ApplyDataFilters(query); + } + + protected virtual TQueryable ApplyDataFilters(TQueryable query) + where TQueryable : IQueryable + { + if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEnt))) { query = (TQueryable)query.WhereIf(DataFilter.IsEnabled(), e => ((ISoftDelete)e).IsDeleted == false); } - if (typeof(IMultiTenant).IsAssignableFrom(typeof(TEntity))) + if (typeof(IMultiTenant).IsAssignableFrom(typeof(TEnt))) { var tenantId = CurrentTenant.Id; query = (TQueryable)query.WhereIf(DataFilter.IsEnabled(), e => ((IMultiTenant)e).TenantId == tenantId); diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs index 5f57ef25d0..e96f35cbb7 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs @@ -518,14 +518,19 @@ namespace Volo.Abp.Domain.Repositories.MongoDB ); } - public virtual async Task> GetMongoQueryableAsync(CancellationToken cancellationToken = default) + public virtual Task> GetMongoQueryableAsync(CancellationToken cancellationToken = default) + { + return GetMongoQueryableAsync(cancellationToken); + } + + protected virtual async Task> GetMongoQueryableAsync(CancellationToken cancellationToken = default) { cancellationToken = GetCancellationToken(cancellationToken); var dbContext = await GetDbContextAsync(cancellationToken); - var collection = dbContext.Collection(); + var collection = dbContext.Collection(); - return ApplyDataFilters( + return ApplyDataFilters, TEnt>( dbContext.SessionHandle != null ? collection.AsQueryable(dbContext.SessionHandle) : collection.AsQueryable() 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 30a8c147aa..990c375f9a 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 @@ -72,8 +72,9 @@ namespace Volo.Abp.Identity.MongoDB var roleIds = organizationUnits.SelectMany(x => x.Roles.Select(r => r.RoleId)).ToArray(); - return await dbContext.Roles //TODO: Such usage suppress filters! - .AsQueryable() + var queryable = await GetMongoQueryableAsync(cancellationToken); + + return await queryable .Where(r => roleIds.Contains(r.Id)) .Select(r => r.Name) .ToListAsync(GetCancellationToken(cancellationToken)); @@ -117,7 +118,9 @@ namespace Volo.Abp.Identity.MongoDB { cancellationToken = GetCancellationToken(cancellationToken); - var role = await (await GetDbContextAsync(cancellationToken)).Roles.AsQueryable() //TODO: Such usages breaks data filters + var queryable = await GetMongoQueryableAsync(cancellationToken); + + var role = await queryable .Where(x => x.NormalizedName == normalizedRoleName) .OrderBy(x => x.Id) .FirstOrDefaultAsync(cancellationToken); @@ -244,8 +247,7 @@ namespace Volo.Abp.Identity.MongoDB { var result = await (await GetMongoQueryableAsync(cancellationToken)) .Where(u => u.OrganizationUnits.Any(uou => uou.OrganizationUnitId == organizationUnitId)) - .ToListAsync(GetCancellationToken(cancellationToken)) - ; + .ToListAsync(GetCancellationToken(cancellationToken)); return result; } @@ -255,8 +257,7 @@ namespace Volo.Abp.Identity.MongoDB { var result = await (await GetMongoQueryableAsync(cancellationToken)) .Where(u => u.OrganizationUnits.Any(uou => organizationUnitIds.Contains(uou.OrganizationUnitId))) - .ToListAsync(GetCancellationToken(cancellationToken)) - ; + .ToListAsync(GetCancellationToken(cancellationToken)); return result; } @@ -269,8 +270,7 @@ namespace Volo.Abp.Identity.MongoDB var organizationUnitIds = await (await GetDbContextAsync(cancellationToken)).OrganizationUnits.AsQueryable() .Where(ou => ou.Code.StartsWith(code)) .Select(ou => ou.Id) - .ToListAsync(cancellationToken) - ; + .ToListAsync(cancellationToken); return await (await GetMongoQueryableAsync(cancellationToken)) .Where(u => u.OrganizationUnits.Any(uou => organizationUnitIds.Contains(uou.OrganizationUnitId)))