public async Task AuditAsync(ChangeTracker changeTracker)
        {
            var entries = changeTracker.Entries()
                          .Where(x => x.Entity.GetType().IsClass &&
                                 !x.Entity.GetType().IsAbstract &&
                                 x.Entity.GetType().GetInterfaces().Contains(typeof(IDomainEntity)) &&
                                 (x.State == EntityState.Added || x.State == EntityState.Modified))
                          .ToList();

            if (entries.Count == 0)
            {
                return;
            }

            var creationAuditedInterface = typeof(ICreationAudited <,>);
            var creationAudits           = entries.Where(x => IsElegibleToAuditByInterface(x, EntityState.Added, creationAuditedInterface)).ToList();

            foreach (var entry in creationAudits)
            {
                await _auditManager.AuditCreation(entry.Entity as IDomainEntity, GetAuditableInterfaceArguments(entry, creationAuditedInterface));
            }

            var modificationAuditedInterface = typeof(IModificationAudited <,>);
            var modificationAudits           = entries.Where(x => IsElegibleToAuditByInterface(x, EntityState.Modified, modificationAuditedInterface)).ToList();

            foreach (var entry in modificationAudits)
            {
                await _auditManager.AuditModification(entry.Entity as IDomainEntity, GetAuditableInterfaceArguments(entry, modificationAuditedInterface));
            }

            var deletionAuditedInterface = typeof(IDeletionAudited <,>);
            var deletionAudits           = entries.Where(x =>
                                                         IsElegibleToAuditByInterface(x, EntityState.Modified, deletionAuditedInterface) &&
                                                         (bool?)x.Entity.GetType().GetProperty("IsDeleted")?.GetValue(x.Entity) == true)
                                           .ToList();

            foreach (var entry in deletionAudits)
            {
                await _auditManager.AuditDeletion(entry.Entity as IDomainEntity, GetAuditableInterfaceArguments(entry, deletionAuditedInterface));
            }
        }
Exemple #2
0
        public override async Task AddAsync(TEntity entity)
        {
            await _auditManager.AuditCreation <TEntityKey>(entity);

            await base.AddAsync(entity);
        }