From 55158bf1ada731be90827e7bff62ad059319ed85 Mon Sep 17 00:00:00 2001 From: Ahmet Date: Wed, 8 Apr 2020 12:02:34 +0300 Subject: [PATCH] entityhistory implemented to auditlog repository --- .../Volo/Abp/AuditLogging/EntityHistory.cs | 9 ++ .../Abp/AuditLogging/IAuditLogRepository.cs | 2 + .../EfCoreAuditLogRepository.cs | 9 ++ .../MongoDB/MongoAuditLogRepository.cs | 13 ++ .../AuditLogging/AuditLogRepository_Tests.cs | 120 ++++++++++++++++++ 5 files changed, 153 insertions(+) create mode 100644 modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo/Abp/AuditLogging/EntityHistory.cs diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo/Abp/AuditLogging/EntityHistory.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo/Abp/AuditLogging/EntityHistory.cs new file mode 100644 index 0000000000..981eba161b --- /dev/null +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo/Abp/AuditLogging/EntityHistory.cs @@ -0,0 +1,9 @@ +namespace Volo.Abp.AuditLogging +{ + public class EntityHistory + { + public EntityChange EntityChange { get; set; } + + public string UserName { get; set; } + } +} \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo/Abp/AuditLogging/IAuditLogRepository.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo/Abp/AuditLogging/IAuditLogRepository.cs index 0e907b2a8e..ed0666f2e2 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo/Abp/AuditLogging/IAuditLogRepository.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo/Abp/AuditLogging/IAuditLogRepository.cs @@ -69,5 +69,7 @@ namespace Volo.Abp.AuditLogging string entityId = null, string entityTypeFullName = null, CancellationToken cancellationToken = default); + + Task> GetEntityHistoriesAsync(string entityId, string entityTypeFullName); } } diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/EfCoreAuditLogRepository.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/EfCoreAuditLogRepository.cs index 80e381e02b..690273ae1f 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/EfCoreAuditLogRepository.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/EfCoreAuditLogRepository.cs @@ -182,6 +182,15 @@ namespace Volo.Abp.AuditLogging.EntityFrameworkCore return totalCount; } + public virtual async Task> GetEntityHistoriesAsync(string entityId, string entityTypeFullName) + { + var query = DbContext.Set().AsNoTracking().IncludeDetails().Where(x => x.EntityId == entityId && x.EntityTypeFullName == entityTypeFullName); + + return await (from e in query + join auditLog in DbSet on e.AuditLogId equals auditLog.Id + select new EntityHistory() {EntityChange = e, UserName = auditLog.UserName}).ToListAsync(); + } + protected virtual IQueryable GetEntityChangeListQuery( Guid? auditLogId = null, DateTime? startTime = null, diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/MongoAuditLogRepository.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/MongoAuditLogRepository.cs index 3541dfc88d..cc7248c9f2 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/MongoAuditLogRepository.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/MongoAuditLogRepository.cs @@ -191,6 +191,19 @@ namespace Volo.Abp.AuditLogging.MongoDB return count; } + public virtual async Task> GetEntityHistoriesAsync(string entityId, string entityTypeFullName) + { + var auditLogs = await GetMongoQueryable().Where(x => + x.EntityChanges.Any(y => y.EntityId == entityId && y.EntityTypeFullName == entityTypeFullName)).As>().ToListAsync(); + + var entityChanges = auditLogs.SelectMany(x => x.EntityChanges).ToList(); + + entityChanges.RemoveAll(x => x.EntityId != entityId || x.EntityTypeFullName != entityTypeFullName); + + return entityChanges.Select(x => new EntityHistory() + {EntityChange = x, UserName = auditLogs.First(y => y.Id == x.AuditLogId).UserName}).ToList(); + } + protected virtual IQueryable GetEntityChangeListQuery( Guid? auditLogId = null, DateTime? startTime = null, diff --git a/modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo/Abp/AuditLogging/AuditLogRepository_Tests.cs b/modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo/Abp/AuditLogging/AuditLogRepository_Tests.cs index 6de00a0f49..25720e83aa 100644 --- a/modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo/Abp/AuditLogging/AuditLogRepository_Tests.cs +++ b/modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo/Abp/AuditLogging/AuditLogRepository_Tests.cs @@ -4,6 +4,7 @@ using System.Globalization; using System.Linq; using System.Net; using System.Threading.Tasks; +using Microsoft.VisualBasic; using Shouldly; using Volo.Abp.Auditing; using Volo.Abp.Guids; @@ -761,5 +762,124 @@ namespace Volo.Abp.AuditLogging entityChanges.ShouldNotBeNull(); entityChanges.Count.ShouldBe(1); } + + [Fact] + public async Task GetEntityHistoryAsync() + { + // Arrange + var userId = new Guid("4456fb0d-74cc-4807-9eee-23e551e6cb06"); + var userId2 = new Guid("4456fb0d-74cc-4807-9eee-23e551e6cb06"); + var ipAddress = "153.1.7.61"; + var firstComment = "first Comment"; + + var firstUser = "Douglas"; + var secondUser = "John Doe"; + + var entityId = Guid.NewGuid().ToString(); + var entityType = "Volo.Abp.AuditLogging.TestEntity"; + + var log1 = new AuditLogInfo + { + UserId = userId, + ImpersonatorUserId = Guid.NewGuid(), + ImpersonatorTenantId = Guid.NewGuid(), + ExecutionTime = DateTime.Today, + ExecutionDuration = 42, + ClientIpAddress = ipAddress, + ClientName = "MyDesktop", + BrowserInfo = "Chrome", + Comments = new List { firstComment, "Second Comment" }, + UserName = firstUser, + EntityChanges = { + new EntityChangeInfo + { + EntityId = entityId, + EntityTypeFullName = entityType, + ChangeType = EntityChangeType.Created, + ChangeTime = DateTime.Now, + PropertyChanges = new List + { + new EntityPropertyChangeInfo + { + PropertyTypeFullName = typeof(string).FullName, + PropertyName = "Name", + NewValue = "New value", + OriginalValue = null + } + } + }, + new EntityChangeInfo + { + EntityId = Guid.NewGuid().ToString(), + EntityTypeFullName = "Volo.Abp.AuditLogging.TestEntity", + ChangeType = EntityChangeType.Created, + ChangeTime = DateTime.Now, + PropertyChanges = new List + { + new EntityPropertyChangeInfo + { + PropertyTypeFullName = typeof(string).FullName, + PropertyName = "Name", + NewValue = "New value", + OriginalValue = null + } + } + } + + } + }; + + var log2 = new AuditLogInfo + { + UserId = userId2, + ImpersonatorUserId = Guid.NewGuid(), + ImpersonatorTenantId = Guid.NewGuid(), + ExecutionTime = DateTime.Today, + ExecutionDuration = 42, + ClientIpAddress = ipAddress, + ClientName = "MyDesktop", + BrowserInfo = "Chrome", + Comments = new List { firstComment, "Second Comment" }, + HttpStatusCode = (int?)HttpStatusCode.Accepted, + UserName = secondUser, + EntityChanges = { + new EntityChangeInfo + { + EntityId = entityId, + EntityTypeFullName = entityType, + ChangeType = EntityChangeType.Updated, + ChangeTime = DateTime.Now, + PropertyChanges = new List + { + new EntityPropertyChangeInfo + { + PropertyTypeFullName = typeof(string).FullName, + PropertyName = "Name", + NewValue = "New value", + OriginalValue = null + } + } + } + + } + }; + + await AuditLogRepository.InsertAsync(new AuditLog(GuidGenerator, log1)); + await AuditLogRepository.InsertAsync(new AuditLog(GuidGenerator, log2)); + + //Assert + var entityHistory = await AuditLogRepository.GetEntityHistoriesAsync(entityId, entityType); + + entityHistory.Count.ShouldBe(2); + var firstUserChange = entityHistory.First(x => x.UserName == firstUser); + firstUserChange.ShouldNotBeNull(); + firstUserChange.EntityChange.ShouldNotBeNull(); + firstUserChange.EntityChange.ChangeType.ShouldBe(EntityChangeType.Created); + + var secondUserChange = entityHistory.First(x => x.UserName == secondUser); + secondUserChange.ShouldNotBeNull(); + secondUserChange.EntityChange.ShouldNotBeNull(); + secondUserChange.EntityChange.ChangeType.ShouldBe(EntityChangeType.Updated); + } } }