diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepository.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepository.cs index 960222679f..12e5987777 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepository.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepository.cs @@ -24,6 +24,8 @@ namespace Volo.Abp.Domain.Repositories.MongoDB IMongoQueryable GetMongoQueryable(); Task> GetMongoQueryableAsync(CancellationToken cancellationToken = default); + + Task> GetAggregateAsync(CancellationToken cancellationToken = default); } public interface IMongoDbRepository : IMongoDbRepository, IRepository 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 fcb51a687c..c9f2508a68 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 @@ -16,6 +16,7 @@ using Volo.Abp.EventBus.Distributed; using Volo.Abp.EventBus.Local; using Volo.Abp.Guids; using Volo.Abp.MongoDB; +using Volo.Abp.MultiTenancy; namespace Volo.Abp.Domain.Repositories.MongoDB { @@ -473,6 +474,17 @@ namespace Volo.Abp.Domain.Repositories.MongoDB ); } + public async Task> GetAggregateAsync(CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(cancellationToken); + var collection = await GetCollectionAsync(cancellationToken); + + return ApplyDataFilters( + dbContext.SessionHandle != null + ? collection.Aggregate(dbContext.SessionHandle) + : collection.Aggregate()); + } + protected virtual bool IsHardDeleted(TEntity entity) { var hardDeletedEntities = UnitOfWorkManager?.Current?.Items.GetOrDefault(UnitOfWorkItemNames.HardDeletedEntities) as HashSet; @@ -621,6 +633,22 @@ namespace Volo.Abp.Domain.Repositories.MongoDB throw new AbpDbConcurrencyException("Database operation expected to affect 1 row but actually affected 0 row. Data may have been modified or deleted since entities were loaded. This exception has been thrown on optimistic concurrency check."); } + protected virtual IAggregateFluent ApplyDataFilters(IAggregateFluent aggregate) + { + if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)) && DataFilter.IsEnabled()) + { + aggregate = aggregate.Match(e => ((ISoftDelete)e).IsDeleted == false); + } + + if (typeof(IMultiTenant).IsAssignableFrom(typeof(TEntity)) && DataFilter.IsEnabled()) + { + var tenantId = CurrentTenant.Id; + aggregate = aggregate.Match(e => ((IMultiTenant)e).TenantId == tenantId); + } + + return aggregate; + } + [Obsolete("This method will be removed in future versions.")] public QueryableExecutionModel GetExecutionModel() { diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDbCoreRepositoryExtensions.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDbCoreRepositoryExtensions.cs index 90605f416e..bcbdc00d9e 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDbCoreRepositoryExtensions.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDbCoreRepositoryExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Threading; using System.Threading.Tasks; using MongoDB.Driver; using MongoDB.Driver.Linq; @@ -16,10 +17,10 @@ namespace Volo.Abp.Domain.Repositories return repository.ToMongoDbRepository().Database; } - public static Task GetDatabaseAsync(this IBasicRepository repository) + public static Task GetDatabaseAsync(this IBasicRepository repository, CancellationToken cancellationToken = default) where TEntity : class, IEntity { - return repository.ToMongoDbRepository().GetDatabaseAsync(); + return repository.ToMongoDbRepository().GetDatabaseAsync(cancellationToken); } [Obsolete("Use GetCollectionAsync method.")] @@ -29,10 +30,10 @@ namespace Volo.Abp.Domain.Repositories return repository.ToMongoDbRepository().Collection; } - public static Task> GetCollectionAsync(this IBasicRepository repository) + public static Task> GetCollectionAsync(this IBasicRepository repository, CancellationToken cancellationToken = default) where TEntity : class, IEntity { - return repository.ToMongoDbRepository().GetCollectionAsync(); + return repository.ToMongoDbRepository().GetCollectionAsync(cancellationToken); } [Obsolete("Use GetMongoQueryableAsync method.")] @@ -42,10 +43,16 @@ namespace Volo.Abp.Domain.Repositories return repository.ToMongoDbRepository().GetMongoQueryable(); } - public static Task> GetMongoQueryableAsync(this IBasicRepository repository) + public static Task> GetMongoQueryableAsync(this IBasicRepository repository, CancellationToken cancellationToken = default) where TEntity : class, IEntity { - return repository.ToMongoDbRepository().GetMongoQueryableAsync(); + return repository.ToMongoDbRepository().GetMongoQueryableAsync(cancellationToken); + } + + public static Task> GetAggregateAsync(this IBasicRepository repository, CancellationToken cancellationToken = default) + where TEntity : class, IEntity + { + return repository.ToMongoDbRepository().GetAggregateAsync(cancellationToken); } public static IMongoDbRepository ToMongoDbRepository(this IBasicRepository repository)