From bc02f0e980c60abf18a3173ccf1f4ccb9c983f14 Mon Sep 17 00:00:00 2001 From: iyilm4z Date: Wed, 11 Dec 2019 18:37:16 +0300 Subject: [PATCH] AddGlobalFilters method of MongoDbRepository extracted to a service --- .../MongoDB/IMongoDbRepositoryFilterer.cs | 20 ++++++ .../Repositories/MongoDB/MongoDbRepository.cs | 59 ++-------------- .../MongoDB/MongoDbRepositoryFilterer.cs | 68 +++++++++++++++++++ 3 files changed, 94 insertions(+), 53 deletions(-) create mode 100644 framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepositoryFilterer.cs create mode 100644 framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepositoryFilterer.cs diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepositoryFilterer.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepositoryFilterer.cs new file mode 100644 index 0000000000..680afce38f --- /dev/null +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepositoryFilterer.cs @@ -0,0 +1,20 @@ +using MongoDB.Driver; +using System.Collections.Generic; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.Domain.Repositories.MongoDB +{ + public interface IMongoDbRepositoryFilterer + where TEntity : class, IEntity + { + void AddGlobalFilters(List> filters); + } + + public interface IMongoDbRepositoryFilterer : IMongoDbRepositoryFilterer + where TEntity : class, IEntity + { + FilterDefinition CreateEntityFilter(TKey id, bool applyFilters = false); + + FilterDefinition CreateEntityFilter(TEntity entity, bool withConcurrencyStamp = false, string concurrencyStamp = null); + } +} 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 057f72bbb5..8dd452463f 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 @@ -14,8 +14,6 @@ using Volo.Abp.EventBus.Distributed; using Volo.Abp.EventBus.Local; using Volo.Abp.Guids; using Volo.Abp.MongoDB; -using Volo.Abp.MultiTenancy; -using Volo.Abp.Reflection; using Volo.Abp.Threading; namespace Volo.Abp.Domain.Repositories.MongoDB @@ -411,6 +409,8 @@ namespace Volo.Abp.Domain.Repositories.MongoDB where TMongoDbContext : IAbpMongoDbContext where TEntity : class, IEntity { + public virtual IMongoDbRepositoryFilterer RepositoryFilterer { get; set; } + public MongoDbRepository(IMongoDbContextProvider dbContextProvider) : base(dbContextProvider) { @@ -450,18 +450,18 @@ namespace Volo.Abp.Domain.Repositories.MongoDB CancellationToken cancellationToken = default) { return await Collection - .Find(CreateEntityFilter(id, true)) + .Find(RepositoryFilterer.CreateEntityFilter(id, true)) .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); } public virtual TEntity Find(TKey id, bool includeDetails = true) { - return Collection.Find(CreateEntityFilter(id, true)).FirstOrDefault(); + return Collection.Find(RepositoryFilterer.CreateEntityFilter(id, true)).FirstOrDefault(); } public virtual void Delete(TKey id, bool autoSave = false) { - Collection.DeleteOne(CreateEntityFilter(id)); + Collection.DeleteOne(RepositoryFilterer.CreateEntityFilter(id)); } public virtual Task DeleteAsync( @@ -470,56 +470,9 @@ namespace Volo.Abp.Domain.Repositories.MongoDB CancellationToken cancellationToken = default) { return Collection.DeleteOneAsync( - CreateEntityFilter(id), + RepositoryFilterer.CreateEntityFilter(id), GetCancellationToken(cancellationToken) ); } - - protected override FilterDefinition CreateEntityFilter(TEntity entity, bool withConcurrencyStamp = false, string concurrencyStamp = null) - { - if (!withConcurrencyStamp || !(entity is IHasConcurrencyStamp entityWithConcurrencyStamp)) - { - return Builders.Filter.Eq(e => e.Id, entity.Id); - } - - if (concurrencyStamp == null) - { - concurrencyStamp = entityWithConcurrencyStamp.ConcurrencyStamp; - } - - return Builders.Filter.And( - Builders.Filter.Eq(e => e.Id, entity.Id), - Builders.Filter.Eq(e => ((IHasConcurrencyStamp)e).ConcurrencyStamp, concurrencyStamp) - ); - } - - protected virtual FilterDefinition CreateEntityFilter(TKey id, bool applyFilters = false) - { - var filters = new List> - { - Builders.Filter.Eq(e => e.Id, id) - }; - - if (applyFilters) - { - AddGlobalFilters(filters); - } - - return Builders.Filter.And(filters); - } - - protected virtual void AddGlobalFilters(List> filters) - { - if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)) && DataFilter.IsEnabled()) - { - filters.Add(Builders.Filter.Eq(e => ((ISoftDelete)e).IsDeleted, false)); - } - - if (typeof(IMultiTenant).IsAssignableFrom(typeof(TEntity))) - { - var tenantId = CurrentTenant.Id; - filters.Add(Builders.Filter.Eq(e => ((IMultiTenant)e).TenantId, tenantId)); - } - } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepositoryFilterer.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepositoryFilterer.cs new file mode 100644 index 0000000000..5222121cab --- /dev/null +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepositoryFilterer.cs @@ -0,0 +1,68 @@ +using MongoDB.Driver; +using System.Collections.Generic; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.Domain.Repositories.MongoDB +{ + public class MongoDbRepositoryFilterer : IMongoDbRepositoryFilterer, ITransientDependency + where TEntity : class, IEntity + { + public IDataFilter DataFilter { get; set; } + + public ICurrentTenant CurrentTenant { get; set; } + + public void AddGlobalFilters(List> filters) + { + if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)) && DataFilter.IsEnabled()) + { + filters.Add(Builders.Filter.Eq(e => ((ISoftDelete)e).IsDeleted, false)); + } + + if (typeof(IMultiTenant).IsAssignableFrom(typeof(TEntity))) + { + var tenantId = CurrentTenant.Id; + filters.Add(Builders.Filter.Eq(e => ((IMultiTenant)e).TenantId, tenantId)); + } + } + } + + public class MongoDbRepositoryFilterer : MongoDbRepositoryFilterer, IMongoDbRepositoryFilterer, ITransientDependency + where TEntity : class, IEntity + { + public FilterDefinition CreateEntityFilter(TKey id, bool applyFilters = false) + { + var filters = new List> + { + Builders.Filter.Eq(e => e.Id, id) + }; + + if (applyFilters) + { + AddGlobalFilters(filters); + } + + return Builders.Filter.And(filters); + } + + public FilterDefinition CreateEntityFilter(TEntity entity, bool withConcurrencyStamp = false, string concurrencyStamp = null) + { + if (!withConcurrencyStamp || !(entity is IHasConcurrencyStamp entityWithConcurrencyStamp)) + { + return Builders.Filter.Eq(e => e.Id, entity.Id); + } + + if (concurrencyStamp == null) + { + concurrencyStamp = entityWithConcurrencyStamp.ConcurrencyStamp; + } + + return Builders.Filter.And( + Builders.Filter.Eq(e => e.Id, entity.Id), + Builders.Filter.Eq(e => ((IHasConcurrencyStamp)e).ConcurrencyStamp, concurrencyStamp) + ); + } + } +}