diff --git a/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditPropertySetter.cs b/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditPropertySetter.cs index 715fcbc058..3f0c393a19 100644 --- a/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditPropertySetter.cs +++ b/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditPropertySetter.cs @@ -8,9 +8,7 @@ namespace Volo.Abp.Auditing public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency { protected ICurrentUser CurrentUser { get; } - protected ICurrentTenant CurrentTenant { get; } - protected IClock Clock { get; } public AuditPropertySetter( @@ -23,7 +21,7 @@ namespace Volo.Abp.Auditing Clock = clock; } - public void SetCreationAuditProperties(object targetObject) + public void SetCreationProperties(object targetObject) { if (!(targetObject is IHasCreationTime objectWithCreationTime)) { @@ -69,14 +67,14 @@ namespace Volo.Abp.Auditing creationAuditedObject.CreatorId = CurrentUser.Id; } - public void SetModificationAuditProperties(object auditedObject) + public void SetModificationProperties(object targetObject) { - if (auditedObject is IHasModificationTime objectWithModificationTime) + if (targetObject is IHasModificationTime objectWithModificationTime) { objectWithModificationTime.LastModificationTime = Clock.Now; } - if (!(auditedObject is IModificationAudited modificationAuditedObject)) + if (!(targetObject is IModificationAudited modificationAuditedObject)) { return; } @@ -107,5 +105,43 @@ namespace Volo.Abp.Auditing modificationAuditedObject.LastModifierId = CurrentUser.Id; } + + public void SetDeletionProperties(object targetObject) + { + if (targetObject is IHasDeletionTime objectWithDeletionTime) + { + if (objectWithDeletionTime.DeletionTime == null) + { + objectWithDeletionTime.DeletionTime = Clock.Now; + } + } + + if (!(targetObject is IDeletionAudited deletionAuditedObject)) + { + return; + } + + if (deletionAuditedObject.DeleterId != null) + { + return; + } + + if (!CurrentUser.Id.HasValue) + { + deletionAuditedObject.DeleterId = null; + return; + } + + if (deletionAuditedObject is IMultiTenant multiTenantEntity) + { + if (multiTenantEntity.TenantId != CurrentUser.TenantId) + { + deletionAuditedObject.DeleterId = null; + return; + } + } + + deletionAuditedObject.DeleterId = CurrentUser.Id; + } } } diff --git a/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditPropertySetter.cs b/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditPropertySetter.cs index f8934fd895..d598340cf6 100644 --- a/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditPropertySetter.cs +++ b/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditPropertySetter.cs @@ -2,8 +2,10 @@ { public interface IAuditPropertySetter { - void SetCreationAuditProperties(object targetObject); + void SetCreationProperties(object targetObject); - void SetModificationAuditProperties(object auditedObject); + void SetModificationProperties(object targetObject); + + void SetDeletionProperties(object targetObject); } } \ No newline at end of file diff --git a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs index 6f068001e3..a8eb636d5b 100644 --- a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs +++ b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs @@ -9,6 +9,7 @@ using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Metadata; +using Volo.Abp.Auditing; using Volo.Abp.Data; using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Entities.Events; @@ -24,6 +25,7 @@ namespace Volo.Abp.EntityFrameworkCore public Guid? CurrentTenantId => CurrentTenant?.Id; protected virtual bool IsMayHaveTenantFilterEnabled => DataFilter.IsEnabled(); + protected virtual bool IsSoftDeleteFilterEnabled => DataFilter.IsEnabled(); public ICurrentTenant CurrentTenant { get; set; } @@ -34,6 +36,8 @@ namespace Volo.Abp.EntityFrameworkCore public IEntityChangeEventHelper EntityChangeEventHelper { get; set; } + public IAuditPropertySetter AuditPropertySetter { get; set; } + private static readonly MethodInfo ConfigureGlobalFiltersMethodInfo = typeof(AbpDbContext).GetMethod(nameof(ConfigureGlobalFilters), BindingFlags.Instance | BindingFlags.NonPublic); protected AbpDbContext(DbContextOptions options) @@ -149,15 +153,18 @@ namespace Volo.Abp.EntityFrameworkCore protected virtual void ApplyAbpConceptsForAddedEntity(EntityEntry entry, EntityChangeReport changeReport) { CheckAndSetId(entry); + SetCreationAuditProperties(entry); changeReport.ChangedEntities.Add(new EntityChangeEntry(entry.Entity, EntityChangeType.Created)); } protected virtual void ApplyAbpConceptsForModifiedEntity(EntityEntry entry, EntityChangeReport changeReport) { HandleConcurrencyStamp(entry); + SetModificationAuditProperties(entry); if (entry.Entity is ISoftDelete && entry.Entity.As().IsDeleted) { + SetDeletionAuditProperties(entry); changeReport.ChangedEntities.Add(new EntityChangeEntry(entry.Entity, EntityChangeType.Deleted)); } else @@ -170,6 +177,7 @@ namespace Volo.Abp.EntityFrameworkCore { CancelDeletionForSoftDelete(entry); HandleConcurrencyStamp(entry); + SetDeletionAuditProperties(entry); changeReport.ChangedEntities.Add(new EntityChangeEntry(entry.Entity, EntityChangeType.Deleted)); } @@ -231,6 +239,21 @@ namespace Volo.Abp.EntityFrameworkCore } } + protected virtual void SetCreationAuditProperties(EntityEntry entry) + { + AuditPropertySetter.SetCreationProperties(entry.Entity); + } + + protected virtual void SetModificationAuditProperties(EntityEntry entry) + { + AuditPropertySetter.SetModificationProperties(entry.Entity); + } + + protected virtual void SetDeletionAuditProperties(EntityEntry entry) + { + AuditPropertySetter.SetDeletionProperties(entry.Entity); + } + protected void ConfigureGlobalFilters(ModelBuilder modelBuilder, IMutableEntityType entityType) where TEntity : class { diff --git a/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AuditPropertySetter_CreationAudit_Tests.cs b/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AuditPropertySetter_CreationAudit_Tests.cs index 9ca0f16101..2003a2381c 100644 --- a/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AuditPropertySetter_CreationAudit_Tests.cs +++ b/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AuditPropertySetter_CreationAudit_Tests.cs @@ -9,13 +9,13 @@ namespace Volo.Abp.Auditing [Fact] public void Should_Do_Nothing_For_Non_Audited_Entity() { - AuditPropertySetter.SetCreationAuditProperties(new MyEmptyObject()); + AuditPropertySetter.SetCreationProperties(new MyEmptyObject()); } [Fact] public void Should_Set_CreationTime() { - AuditPropertySetter.SetCreationAuditProperties(TargetObject); + AuditPropertySetter.SetCreationProperties(TargetObject); TargetObject.CreationTime.ShouldBe(Now); } @@ -23,7 +23,7 @@ namespace Volo.Abp.Auditing [Fact] public void Should_Not_Set_CreatorId_If_Current_User_Is_Not_Available() { - AuditPropertySetter.SetCreationAuditProperties(TargetObject); + AuditPropertySetter.SetCreationProperties(TargetObject); TargetObject.CreationTime.ShouldBe(Now); TargetObject.CreatorId.ShouldBe(null); @@ -34,7 +34,7 @@ namespace Volo.Abp.Auditing { CurrentUserId = Guid.NewGuid(); - AuditPropertySetter.SetCreationAuditProperties(TargetObject); + AuditPropertySetter.SetCreationProperties(TargetObject); TargetObject.CreationTime.ShouldBe(Now); TargetObject.CreatorId.ShouldBe(CurrentUserId); @@ -48,7 +48,7 @@ namespace Volo.Abp.Auditing CurrentUserId = Guid.NewGuid(); TargetObject.CreatorId = oldCreatorUserId; - AuditPropertySetter.SetCreationAuditProperties(TargetObject); + AuditPropertySetter.SetCreationProperties(TargetObject); TargetObject.CreationTime.ShouldBe(Now); TargetObject.CreatorId.ShouldBe(oldCreatorUserId); @@ -63,7 +63,7 @@ namespace Volo.Abp.Auditing CurrentUserTenantId = CurrentTenantId; TargetObject.TenantId = CurrentTenantId; - AuditPropertySetter.SetCreationAuditProperties(TargetObject); + AuditPropertySetter.SetCreationProperties(TargetObject); TargetObject.CreationTime.ShouldBe(Now); TargetObject.CreatorId.ShouldBe(CurrentUserId); @@ -78,7 +78,7 @@ namespace Volo.Abp.Auditing CurrentUserTenantId = CurrentTenantId; TargetObject.TenantId = Guid.NewGuid(); - AuditPropertySetter.SetCreationAuditProperties(TargetObject); + AuditPropertySetter.SetCreationProperties(TargetObject); TargetObject.CreationTime.ShouldBe(Now); TargetObject.CreatorId.ShouldBe(null); diff --git a/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AuditPropertySetter_ModificationAudit_Tests.cs b/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AuditPropertySetter_ModificationAudit_Tests.cs index 8dd9c03520..041492bba5 100644 --- a/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AuditPropertySetter_ModificationAudit_Tests.cs +++ b/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AuditPropertySetter_ModificationAudit_Tests.cs @@ -9,13 +9,13 @@ namespace Volo.Abp.Auditing [Fact] public void Should_Do_Nothing_For_Non_Audited_Entity() { - AuditPropertySetter.SetModificationAuditProperties(new MyEmptyObject()); + AuditPropertySetter.SetModificationProperties(new MyEmptyObject()); } [Fact] public void Should_Set_LastModificationTime() { - AuditPropertySetter.SetModificationAuditProperties(TargetObject); + AuditPropertySetter.SetModificationProperties(TargetObject); TargetObject.LastModificationTime.ShouldBe(Now); } @@ -25,7 +25,7 @@ namespace Volo.Abp.Auditing { TargetObject.LastModifierId = Guid.NewGuid(); - AuditPropertySetter.SetModificationAuditProperties(TargetObject); + AuditPropertySetter.SetModificationProperties(TargetObject); TargetObject.LastModificationTime.ShouldBe(Now); TargetObject.LastModifierId.ShouldBe(null); @@ -36,7 +36,7 @@ namespace Volo.Abp.Auditing { CurrentUserId = Guid.NewGuid(); - AuditPropertySetter.SetModificationAuditProperties(TargetObject); + AuditPropertySetter.SetModificationProperties(TargetObject); TargetObject.LastModificationTime.ShouldBe(Now); TargetObject.LastModifierId.ShouldBe(CurrentUserId); @@ -48,7 +48,7 @@ namespace Volo.Abp.Auditing CurrentUserId = Guid.NewGuid(); TargetObject.LastModifierId = Guid.NewGuid(); - AuditPropertySetter.SetModificationAuditProperties(TargetObject); + AuditPropertySetter.SetModificationProperties(TargetObject); TargetObject.LastModificationTime.ShouldBe(Now); TargetObject.LastModifierId.ShouldBe(CurrentUserId); @@ -63,7 +63,7 @@ namespace Volo.Abp.Auditing CurrentUserTenantId = CurrentTenantId; TargetObject.TenantId = CurrentTenantId; - AuditPropertySetter.SetModificationAuditProperties(TargetObject); + AuditPropertySetter.SetModificationProperties(TargetObject); TargetObject.LastModificationTime.ShouldBe(Now); TargetObject.LastModifierId.ShouldBe(CurrentUserId); @@ -78,7 +78,7 @@ namespace Volo.Abp.Auditing TargetObject.TenantId = Guid.NewGuid(); TargetObject.LastModifierId = Guid.NewGuid(); - AuditPropertySetter.SetModificationAuditProperties(TargetObject); + AuditPropertySetter.SetModificationProperties(TargetObject); TargetObject.LastModificationTime.ShouldBe(Now); TargetObject.LastModifierId.ShouldBe(null);