Пример #1
0
        public IEnumerable <AuditedEntity> GetAuditEntities()
        {
            var entities = new List <AuditedEntity>();

            foreach (var entry in ChangeTracker.Entries())
            {
                AuditedEntity auditEntity = null;
                switch (entry.State)
                {
                case EntityState.Added:
                    auditEntity = GetAuditEntity(entry, OperationType.Add);
                    break;

                case EntityState.Modified:
                    auditEntity = GetAuditEntity(entry, OperationType.Modify);
                    break;

                case EntityState.Deleted:
                    auditEntity = GetAuditEntity(entry, OperationType.Delete);
                    break;
                }

                if (auditEntity != null)
                {
                    entities.Add(auditEntity);
                }
            }

            return(entities);
        }
Пример #2
0
        public async Task GetAsync_WhenMultipleEntitesMatchSpecification_ReturnsFirstEntityFound()
        {
            var createdBy   = _fixture.Create <string>();
            var firstEntity = new AuditedEntity {
                CreatedBy = createdBy
            };
            var secondEntity = new AuditedEntity {
                CreatedBy = createdBy
            };

            await _memoryDb.Context.Set <AuditedEntity>().AddAsync(firstEntity);

            await _memoryDb.Context.SaveChangesAsync();

            await _memoryDb.Context.Set <AuditedEntity>().AddAsync(secondEntity);

            await _memoryDb.Context.SaveChangesAsync();

            var entity = await _memoryDb.Repository.GetAsync(new CreatedBySpec(createdBy));

            Assert.Multiple(() =>
            {
                Assert.AreEqual(firstEntity, entity);
                Assert.AreNotEqual(secondEntity, entity);
            });
        }
Пример #3
0
        public async Task ListAsync_WhenMultipleEntitesMatchSpecification_WithOrderBy_ReturnsAllEntities()
        {
            var createdBy   = _fixture.Create <string>();
            var firstEntity = new AuditedEntity {
                CreatedBy = createdBy, Name = "banana"
            };
            var secondEntity = new AuditedEntity {
                CreatedBy = createdBy, Name = "apple"
            };

            await _memoryDb.Context.Set <AuditedEntity>().AddAsync(firstEntity);

            await _memoryDb.Context.Set <AuditedEntity>().AddAsync(secondEntity);

            await _memoryDb.Context.SaveChangesAsync();

            var entities = await _memoryDb.Repository.ListAsync(new CreatedBySpec(createdBy).OrderByDescending(a => a.Name));

            Assert.Multiple(() =>
            {
                Assert.AreEqual(2, entities.Count);
                CollectionAssert.Contains(entities, firstEntity);
                CollectionAssert.Contains(entities, secondEntity);
            });
        }
        public override void SaveAuditedEntity(AuditedEntity auditedEntity)
        {
            string userName = System.Threading.Thread.CurrentPrincipal.Identity.Name;
            var    audit    = new AuditRecord
            {
                Action              = (byte)auditedEntity.Action,
                AuditDate           = DateTime.Now,
                EntityTable         = auditedEntity.EntityType.Name,
                EntityTableKey      = auditedEntity.EntityKey,
                AssociationTable    = auditedEntity.ParentEntityType.Name,
                AssociationTableKey = auditedEntity.ParentKey,
                UserName            = userName
            };

            foreach (var modifiedProperty in auditedEntity.ModifiedProperties)
            {
                if (modifiedProperty.DisplayName.Trim() != "Date Updated" &&
                    modifiedProperty.DisplayName.Trim() != "User Updated Id")
                {
                    audit.AuditRecordFields.Add(
                        new AuditRecordField
                    {
                        MemberName = modifiedProperty.DisplayName,
                        OldValue   = modifiedProperty.OldValue,
                        NewValue   = modifiedProperty.NewValue
                    });
                }
            }
            if (audit.AuditRecordFields.Count > 0)
            {
                AuditRecords.InsertOnSubmit(audit);
            }
        }
Пример #5
0
        public override void SaveAuditedEntity(AuditedEntity auditedEntity)
        {
            var userName = "******"; // HttpContext.Current.User.Identity.Name;

            var audit = new AuditRecord
            {
                Action             = (byte)auditedEntity.Action,
                AuditDate          = DateTime.Now,
                ParentTable        = auditedEntity.ParentEntityType.Name,
                ParentKey          = auditedEntity.ParentKey,
                Table              = auditedEntity.EntityType.Name,
                TableKey           = auditedEntity.EntityKey,
                UserName           = userName,
                ModifiedProperties = auditedEntity.ModifiedProperties
                                     .Select(auditedProperty => new AuditRecordProperty
                {
                    PropertyName = auditedProperty.DisplayName,
                    OldValue     = auditedProperty.OldValue,
                    NewValue     = auditedProperty.NewValue
                })
                                     .ToList()
            };

            if (audit.ModifiedProperties.Count > 0)
            {
                AuditRecords.Add(audit);
            }
        }
Пример #6
0
        public override void SaveAuditedEntity(AuditedEntity auditedEntity)
        {
            var audit = new AuditRecord
            {
                Action      = (byte)auditedEntity.Action,
                AuditDate   = DateTime.Now,
                ParentTable = auditedEntity.ParentEntityType.Name,
                ParentKey   = auditedEntity.ParentKey,
                Table       = auditedEntity.EntityType.Name,
                TableKey    = auditedEntity.EntityKey,
                UserName    = "******",
            };

            foreach (var modifiedProperty in auditedEntity.ModifiedProperties)
            {
                audit.AuditRecordProperties.Add(
                    new AuditRecordProperty
                {
                    PropertyName = modifiedProperty.DisplayName,
                    OldValue     = modifiedProperty.OldValue,
                    NewValue     = modifiedProperty.NewValue
                });
            }

            if (audit.AuditRecordProperties.Count > 0)
            {
                AuditRecords.AddObject(audit);
            }
        }
Пример #7
0
        public void SetUpdatedDataFields(AuditedEntity AuditedEntity, DataRow row)
        {
            String userGuid            = (row["LastUpdatedUserGuid"].ToString() == "" || row["LastUpdatedUserGuid"] == null) ? userGuid = ZEROSGUID : userGuid = row["LastUpdatedUserGuid"].ToString();
            Guid   LastUpdatedUserGuid = new Guid(userGuid);

            AuditedEntity.LastUpdatedDate = (row["LastUpdatedDate"].ToString()).Length == 0 ? AuditedEntity.LastUpdatedDate : DateTime.Parse(row["LastUpdatedDate"].ToString());
            AuditedEntity.LastUpdatedUser = ZEROSGUID.Equals(LastUpdatedUserGuid) ? AuditedEntity.LastUpdatedUser : (User)UsersDB[LastUpdatedUserGuid];
            AuditedEntity.SyncDate        = DateTime.Now;
        }
Пример #8
0
        public async Task Init()
        {
            _entity = new AuditedEntity {
                Id = Guid.NewGuid(), CreatedBy = _fixture.Create <string>(), CreatedProcess = _fixture.Create <string>(), CreatedOn = DateTime.UtcNow, Name = _fixture.Create <string>()
            };

            _memoryDb.Context.Add(_entity);
            await _memoryDb.Context.SaveChangesAsync();
        }
Пример #9
0
        public async Task SaveChangesAsync_WithAddedEntity_SavesToSet()
        {
            var entity = new AuditedEntity();

            await _memoryDb.Repository.AddAsync(entity);

            await _memoryDb.Repository.SaveAsync();

            Assert.Contains(entity, _memoryDb.Context.Set <AuditedEntity>().ToList());
        }
Пример #10
0
        public async Task AddAsync_WhenAddingEntity_VerifyDbSetContainsAddedEntity()
        {
            var auditEntity = new AuditedEntity();

            await _memoryDb.Repository.AddAsync(auditEntity);

            Assert.Multiple(() =>
            {
                CollectionAssert.Contains(_memoryDb.Context.Set <AuditedEntity>().Local, auditEntity);
                CollectionAssert.DoesNotContain(_memoryDb.Context.Set <AuditedEntity>(), auditEntity);
            });
        }
Пример #11
0
        public void Attach_WhenAttachingEntity_VerifyDbSetContainsEntity()
        {
            var auditEntity = new AuditedEntity();

            _memoryDb.Repository.Attach(auditEntity);

            Assert.Multiple(() =>
            {
                CollectionAssert.Contains(_memoryDb.Context.Set <AuditedEntity>().Local, auditEntity);
                CollectionAssert.DoesNotContain(_memoryDb.Context.Set <AuditedEntity>(), auditEntity);
            });
        }
Пример #12
0
        public async Task GetAsync_WhenEntityDoesNotMatchSpecification_ReturnsNull()
        {
            var createdBy   = _fixture.Create <string>();
            var auditEntity = new AuditedEntity
            {
                CreatedBy = _fixture.Create <string>()
            };

            _memoryDb.Context.Set <AuditedEntity>().Add(auditEntity);
            _memoryDb.Context.SaveChanges();

            var entity = await _memoryDb.Repository.GetAsync(new CreatedBySpec(createdBy));

            Assert.IsNull(entity);
        }
Пример #13
0
        public void Remove_WhenRemovingEntity_VerifyDbSetDoesNotContainRemovedEntity()
        {
            var auditEntity = new AuditedEntity();

            _memoryDb.Context.Add(auditEntity);
            _memoryDb.Context.SaveChanges();

            _memoryDb.Repository.Remove(auditEntity);

            Assert.Multiple(() =>
            {
                CollectionAssert.DoesNotContain(_memoryDb.Context.Set <AuditedEntity>().Local, auditEntity);
                CollectionAssert.Contains(_memoryDb.Context.Set <AuditedEntity>(), auditEntity);
            });
        }
Пример #14
0
        public void SetCreationDataFields(AuditedEntity AuditedEntity, DataRow row, Guid Guid)
        {
            if (AuditedEntity.CreatedDate != null && AuditedEntity.SyncDate != null)
            {
                return;
            }

            String userGuid        = (row["CreatedUserGuid"].ToString() == "" || row["CreatedUserGuid"] == null) ? userGuid = ZEROSGUID : userGuid = row["CreatedUserGuid"].ToString();
            Guid   CreatedUserGuid = new Guid(userGuid);

            AuditedEntity.CreatedDate = (row["CreatedDate"].ToString()).Length == 0 ? AuditedEntity.CreatedDate : DateTime.Parse(row["CreatedDate"].ToString());
            AuditedEntity.CreatedUser = ZEROSGUID.Equals(CreatedUserGuid.ToString()) ? AuditedEntity.CreatedUser : (User)UsersDB[CreatedUserGuid];
            AuditedEntity.SyncDate    = DateTime.Now;
            AuditedEntity.SyncGuid    = Guid;
        }
Пример #15
0
        public async Task GetAsync_WhenEntityMatchesSpecification_ReturnsEntity()
        {
            var createdBy   = _fixture.Create <string>();
            var auditEntity = new AuditedEntity
            {
                CreatedBy = createdBy
            };

            await _memoryDb.Context.AddAsync(auditEntity);

            await _memoryDb.Context.SaveChangesAsync();

            var entity = await _memoryDb.Repository.GetAsync(new CreatedBySpec(createdBy));

            Assert.AreEqual(auditEntity, entity);
        }
Пример #16
0
        public void SetLastUpdatedUserID(AuditedEntity auditedEntity)
        {
            User user = GetUserInfo();

            if (auditedEntity.GetType().FullName.Equals("VPPS.CSI.Domain.Beneficiary"))
            {
                ((Beneficiary)auditedEntity).LastUpdatedUserID = user.UserID;
            }
            if (auditedEntity.GetType().FullName.Equals("VPPS.CSI.Domain.ChildStatusHistory"))
            {
                ((ChildStatusHistory)auditedEntity).LastUpdatedUserID = user.UserID;
            }
            if (auditedEntity.GetType().FullName.Equals("VPPS.CSI.Domain.ChildStatus"))
            {
                ((ChildStatus)auditedEntity).LastUpdatedUserID = user.UserID;
            }
        }
Пример #17
0
        public void UndeleteLog()
        {
            var data = new AuditedEntity
            {
                Id     = Randomizer.Next(),
                Value1 = Randomizer.GetString()
            };
            var auditLog = AuditGenerator.UndeleteLog(data, AuditGenerator.NewLog(data));

            Assert.AreEqual(2, auditLog.Entries.Count());
            Assert.AreEqual(AuditType.Undelete, auditLog.Entries.ElementAt(1).Type);
            Assert.AreEqual(2, auditLog.Entries.ElementAt(1).Changes.Count());
            Assert.IsTrue(auditLog.Entries.ElementAt(1).Changes.Any(x =>
                                                                    x.PropertyName == "Id" && x.NewValue.Equals(data.Id) && x.OldValue == null));
            Assert.IsTrue(auditLog.Entries.ElementAt(1).Changes.Any(x =>
                                                                    x.PropertyName == "Value1" && x.NewValue.Equals(data.Value1) && x.OldValue == null));
        }
Пример #18
0
        public async Task SingleAsync_WhenMoreThanOneEntityMatchesSpecification_ThrowsInvalidOperationException()
        {
            var createdBy   = _fixture.Create <string>();
            var firstEntity = new AuditedEntity {
                Id = Guid.NewGuid(), CreatedBy = createdBy
            };
            var secondEntity = new AuditedEntity {
                Id = Guid.NewGuid(), CreatedBy = createdBy
            };

            await _memoryDb.Context.Set <AuditedEntity>().AddAsync(firstEntity);

            await _memoryDb.Context.Set <AuditedEntity>().AddAsync(secondEntity);

            await _memoryDb.Context.SaveChangesAsync();

            Assert.ThrowsAsync <InvalidOperationException>(async() => await _memoryDb.Repository.SingleAsync(new CreatedBySpec(createdBy)));
        }
Пример #19
0
        public void Setup()
        {
            Randomizer = Randomizer.CreateRandomizer();

            ExpectedBasicEntity1 = new BasicEntity {
                Id = Randomizer.Next()
            };
            ExpectedBasicEntity2 = new BasicEntity {
                Id = Randomizer.Next()
            };
            ExpectedIndexedEntity = new IndexedEntity {
                Id = Randomizer.Next(), IndexedValue = Randomizer.GetString()
            };
            ExpectedAuditedEntity = new AuditedEntity {
                Id = Randomizer.Next()
            };
            ExpectedAuditedEntityAuditLog = new AuditLog();
            ExpectedIndexKey = new IndexKey <string>()
            {
                Value = Randomizer.GetString()
            };

            MockDataStream = new Mock <IDataWorker>();
            MockDataStream
            .Setup(x => x.Exists <BasicEntity>(ExpectedBasicEntity1.Id))
            .ReturnsAsync(true);
            MockDataStream
            .Setup(x => x.Read <BasicEntity>(ExpectedBasicEntity1.Id))
            .ReturnsAsync(ExpectedBasicEntity1);
            MockDataStream
            .Setup(x => x.Exists <BasicEntity>(ExpectedIndexedEntity.Id))
            .ReturnsAsync(true);
            MockDataStream
            .Setup(x => x.Exists <IndexedEntity>(ExpectedIndexedEntity.Id))
            .ReturnsAsync(true);
            MockDataStream
            .Setup(x => x.Read <BasicEntity>(ExpectedIndexedEntity.Id))
            .ReturnsAsync(ExpectedIndexedEntity);
            MockDataStream
            .Setup(x => x.Read <IndexedEntity>(ExpectedIndexedEntity.Id))
            .ReturnsAsync(ExpectedIndexedEntity);
            MockDataStream
            .Setup(x => x.Exists <BasicEntity>(ExpectedAuditedEntity.Id))
            .ReturnsAsync(true);
            MockDataStream
            .Setup(x => x.Exists <AuditedEntity>(ExpectedAuditedEntity.Id))
            .ReturnsAsync(true);
            MockDataStream
            .Setup(x => x.Read <BasicEntity>(ExpectedAuditedEntity.Id))
            .ReturnsAsync(ExpectedAuditedEntity);
            MockDataStream
            .Setup(x => x.Read <AuditedEntity>(ExpectedAuditedEntity.Id))
            .ReturnsAsync(ExpectedAuditedEntity);
            MockDataStream
            .Setup(x => x.WriteAndCommit(ExpectedBasicEntity1.Id, ExpectedBasicEntity1))
            .ReturnsAsync(true);
            MockDataStream
            .Setup(x => x.WriteAndCommit(ExpectedIndexedEntity.Id, ExpectedIndexedEntity))
            .ReturnsAsync(true);
            MockDataStream
            .Setup(x => x.Write(ExpectedAuditedEntity.Id, ExpectedAuditedEntity))
            .ReturnsAsync(true);
            MockDataStream
            .Setup(x => x.Commit <BasicEntity>(ExpectedAuditedEntity.Id))
            .ReturnsAsync(true);
            MockDataStream
            .Setup(x => x.Delete <BasicEntity>(ExpectedBasicEntity1.Id))
            .ReturnsAsync(true);
            MockDataStream
            .Setup(x => x.Delete <AuditedEntity>(ExpectedAuditedEntity.Id))
            .ReturnsAsync(true);
            ExpectedNextBasicEntityId = Randomizer.Next();
            MockDataStream
            .Setup(x => x.NextId <BasicEntity>())
            .Returns(ExpectedNextBasicEntityId);
            MockDataStream
            .Setup(x => x.ReadAll <BasicEntity>())
            .Returns(ExpectedBasicEntityList);

            MockIndexer = new Mock <IIndexWorker>();
            MockIndexer
            .Setup(x => x.IndexExist <IndexedEntity>("IndexedValue"))
            .ReturnsAsync(true);
            MockIndexer
            .Setup(
                x => x.GetIdsFromIndex <IndexedEntity, string>("IndexedValue", ExpectedIndexedEntity.IndexedValue))
            .Returns(ExpectedIndexEntityList);
            MockIndexer
            .Setup(
                x => x.GetKeysFromIndex <IndexedEntity, string>("IndexedValue"))
            .Returns(ExpectedIndexKeysEntityList);
            MockIndexer
            .Setup(x => x.Index(ExpectedBasicEntity1))
            .ReturnsAsync(true);
            MockIndexer
            .Setup(x => x.Index(ExpectedIndexedEntity))
            .ReturnsAsync(true);
            MockIndexer
            .Setup(x => x.Index(ExpectedAuditedEntity))
            .ReturnsAsync(true);
            MockIndexer
            .Setup(x => x.Unindex(ExpectedBasicEntity1))
            .ReturnsAsync(true);
            MockIndexer
            .Setup(x => x.Unindex(ExpectedAuditedEntity))
            .ReturnsAsync(true);

            MockAudit = new Mock <IAuditWorker>();
            MockAudit
            .Setup(x => x.CreationEvent(ExpectedAuditedEntity))
            .ReturnsAsync(true);
            MockAudit
            .Setup(x => x.UpdateEvent(ExpectedAuditedEntity, ExpectedAuditedEntity))
            .ReturnsAsync(true);
            MockAudit
            .Setup(x => x.DeleteEvent(ExpectedAuditedEntity))
            .ReturnsAsync(true);
            MockAudit
            .Setup(x => x.CommitEvents(ExpectedAuditedEntity))
            .ReturnsAsync(true);
            MockAudit
            .Setup(x => x.ReadAllEvents <AuditedEntity>(ExpectedAuditedEntity.Id))
            .ReturnsAsync(ExpectedAuditedEntityAuditLog);

            MockLogger = new Mock <ILogger>();

            DataManager = new DataManager(MockDataStream.Object, MockIndexer.Object, MockAudit.Object,
                                          MockLogger.Object);
        }
Пример #20
0
        protected virtual AuditedEntity GetAuditEntity(EntityEntry entry, OperationType operationType)
        {
            var type     = entry.Entity.GetType();
            var typeName = type.FullName;

            string entityId   = null;
            var    properties = new List <AuditedProperty>();

            foreach (var property in entry.CurrentValues.Properties)
            {
                if (property.IsConcurrencyToken)
                {
                    continue;
                }

                var propertyName  = property.Name;
                var propertyEntry = entry.Property(property.Name);
                if (property.IsPrimaryKey())
                {
                    entityId = entry.State == EntityState.Deleted
                                                ? propertyEntry.OriginalValue?.ToString()
                                                : propertyEntry.CurrentValue?.ToString();
                }

                string propertyType  = property.ClrType.ToString();
                string originalValue = null;
                string newValue      = null;

                if (entry.State == EntityState.Added)
                {
                    newValue = propertyEntry.CurrentValue?.ToString();
                }
                else if (entry.State == EntityState.Deleted)
                {
                    originalValue = propertyEntry.OriginalValue?.ToString();
                }
                else if (entry.State == EntityState.Modified)
                {
                    var currentValue = propertyEntry.CurrentValue?.ToString();
                    originalValue = propertyEntry.OriginalValue?.ToString();
                    if (currentValue == originalValue)
                    {
                        continue;
                    }

                    newValue = currentValue;
                }

                if (string.IsNullOrWhiteSpace(originalValue))
                {
                    // 原值为空,新值不为空则记录
                    if (!string.IsNullOrWhiteSpace(newValue))
                    {
                        properties.Add(new AuditedProperty(propertyName, propertyType, originalValue, newValue));
                    }
                }
                else
                {
                    if (!originalValue.Equals(newValue))
                    {
                        properties.Add(new AuditedProperty(propertyName, propertyType, originalValue, newValue));
                    }
                }
            }

            var auditedEntity = new AuditedEntity(typeName, entityId, operationType);

            auditedEntity.AddProperties(properties);
            return(auditedEntity);
        }
Пример #21
0
        public async Task RegisterUpdate(AuditedEntity entity)
        {
            var user = await currentUserProvider.GetCurrentUser();

            entity.MarkAsUpdated(user);
        }
Пример #22
0
 /// <summary>
 /// Use this method to define how to save the actual audit record into the database
 /// </summary>
 public abstract void SaveAuditedEntity(AuditedEntity record);
Пример #23
0
 protected AuditedEntity SetCreatedUser(AuditedEntity entity)
 {
     entity.CreatedUser = user;
     return(entity);
 }
Пример #24
0
 public virtual void SaveAuditedEntity(AuditedEntity record)
 {
 }
Пример #25
0
 protected AuditedEntity SetLastUpdatedUser(AuditedEntity entity)
 {
     entity.LastUpdatedUser = user;
     return(entity);
 }