Пример #1
0
        public IHttpActionResult PutAuditEntries(Guid id, AuditEntries auditEntries)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (id != auditEntries.AuditEntryId)
            {
                return(BadRequest());
            }

            db.Entry(auditEntries).State = EntityState.Modified;

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!AuditEntriesExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(StatusCode(HttpStatusCode.NoContent));
        }
Пример #2
0
        //ObjectContext IObjectContextAdapter.ObjectContext => this is IObjectContextAdapter objectContext ? objectContext.ObjectContext : null;

        void IDbContext.SaveChanges(string wamsId)
        {
            var changes = ChangeTracker
                          .Entries()
                          .Where(e => e.State != EntityState.Unchanged);

            var auditEntries = new List <AuditEntry>();

            foreach (var change in changes)
            {
                var type = ObjectContext.GetObjectType(change.Entity.GetType());
                //var proxytype = change.Entity.GetType();

                var auditEntry = new AuditEntry
                {
                    CreatedBy      = wamsId ?? "SYSTEM",
                    StateName      = change.State.ToString(),
                    State          = (int)change.State,
                    EntityTypeName = type.Name,
                    CreatedDate    = DateTime.Now
                };
                var properties = change.State == EntityState.Deleted ?
                                 change.OriginalValues :
                                 change.CurrentValues;

                foreach (var propertyName in properties.PropertyNames)
                {
                    var auditEntryProperty = new AuditEntryProperty
                    {
                        PropertyName = propertyName
                    };

                    if (change.State == EntityState.Modified || change.State == EntityState.Added)
                    {
                        var currentValues = change.CurrentValues;
                        var current       = currentValues[propertyName];
                        auditEntryProperty.NewValue = current?.ToString() ?? "";
                    }

                    if (change.State == EntityState.Modified || change.State == EntityState.Deleted)
                    {
                        var originalValues = change.OriginalValues;
                        var original       = originalValues[propertyName];
                        auditEntryProperty.OldValue = original?.ToString() ?? "";
                    }

                    auditEntry.AuditEntryProperties.Add(auditEntryProperty);
                }

                auditEntries.Add(auditEntry);
            }

            auditEntries.ForEach(a => AuditEntries.Add(a));

            SaveChanges();
        }
Пример #3
0
        public IHttpActionResult GetAuditEntries(Guid id)
        {
            AuditEntries auditEntries = db.AuditEntries.Find(id);

            if (auditEntries == null)
            {
                return(NotFound());
            }

            return(Ok(auditEntries));
        }
Пример #4
0
        public IHttpActionResult PostAuditEntries(AuditEntries auditEntries)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            db.AuditEntries.Add(auditEntries);
            db.SaveChanges();

            return(CreatedAtRoute("DefaultApi", new { id = auditEntries.AuditEntryId }, auditEntries));
        }
Пример #5
0
        public IHttpActionResult DeleteAuditEntries(Guid id)
        {
            AuditEntries auditEntries = db.AuditEntries.Find(id);

            if (auditEntries == null)
            {
                return(NotFound());
            }

            db.AuditEntries.Remove(auditEntries);
            db.SaveChanges();

            return(Ok(auditEntries));
        }
Пример #6
0
        public override int SaveChanges()
        {
            var changes = from e in ChangeTracker.Entries()
                          where e.State != EntityState.Unchanged
                          select e;

            var auditEntries = new List <AuditEntry>();

            foreach (var change in changes)
            {
                var type = change.Entity.GetType();

                var auditEntry = new AuditEntry
                {
                    CreatedBy      = "SYSTEM",
                    CreatedDate    = DateTime.Now,
                    StateName      = change.State.ToString(),
                    State          = (int)change.State,
                    EntityTypeName = type.Name
                };

                var originalValues = Entry(change.Entity).OriginalValues;
                var currentValues  = Entry(change.Entity).CurrentValues;

                foreach (var property in originalValues.Properties)
                {
                    var original = originalValues[property.Name];
                    var current  = currentValues[property.Name];


                    auditEntry.AuditEntryProperties.Add(new AuditEntryProperty
                    {
                        OldValue     = original?.ToString() ?? "",
                        NewValue     = current?.ToString() ?? "",
                        PropertyName = property.Name
                    });
                }

                auditEntries.Add(auditEntry);
            }

            auditEntries.ForEach(a => AuditEntries.Add(a));

            return(base.SaveChanges());
        }
        protected override async Task AfterSaveChanges()
        {
            if (null != AuditEntries && AuditEntries.Count > 0)
            {
                await base.AfterSaveChanges();

                AuditRecords.AddRange(AuditEntries.Select(a => new AuditRecord()
                {
                    TableName     = a.TableName,
                    OperationType = a.OperationType,
                    Extra         = a.Properties.Count == 0 ? null : a.Properties.ToJson(),
                    OriginValue   = a.OriginalValues?.ToJson(),
                    NewValue      = a.NewValues?.ToJson(),
                    ObjectId      = a.KeyValues.ToJson(),
                    UpdatedAt     = a.UpdatedAt,
                    UpdatedBy     = a.UpdatedBy,
                }));
                await base.SaveChangesAsync();
            }
        }
Пример #8
0
        /// <inheritdoc />
        /// <summary>
        /// Asynchronously saves all changes made in this context to the database.
        /// </summary>
        /// <param name="acceptAllChangesOnSuccess"></param>
        /// <param name="cancellationToken"></param>
        /// <exception cref="AuditUserNullException"></exception>
        /// <returns></returns>
        public override async Task <int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default)
        {
            var currentUser = _auditUserFunc();

            if (currentUser == null)
            {
                throw new AuditUserNullException();
            }
            var correlationId = Guid.NewGuid();

            if (BeforeSavingChanges != null)
            {
                var beforeSavingChangesEventArgs = new BeforeSavingChangesEventArgs(correlationId);
                BeforeSavingChanges.Invoke(this, beforeSavingChangesEventArgs);

                if (beforeSavingChangesEventArgs.Cancel)
                {
                    return(-1);
                }
            }
            var auditEntries    = new List <AuditEntry>();
            int result          = 0;
            var modifiedEntries = this.GetChangeset(w => w.State == EntityState.Deleted || w.State == EntityState.Modified);
            var newEntries      = this.GetChangeset(w => w.State == EntityState.Added);

            auditEntries.AddRange(modifiedEntries.GetAuditEntries(currentUser, correlationId, false));

            result = await base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);

            if (modifiedEntries.Count > 0 || newEntries.Count > 0)
            {
                auditEntries.AddRange(newEntries.GetAuditEntries(currentUser, correlationId, _auditRConfiguration.AddChangesetWhenInsert));
                AuditEntries.AddRange(auditEntries);
                await base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
            }

            AfterSavingChanges?.Invoke(this, new AfterSavingChangesEventArgs(correlationId));
            return(result);
        }
Пример #9
0
        private void RecordAudit()
        {
            var entries = ChangeTracker.Entries().ToArray();

            if (entries.Length == 1 && entries[0].State == EntityState.Added && entries[0].Entity is User)
            {
                // Skip audit for user creation, because audit requires the user.
                return;
            }

            var operatingUser = _operatingUserProvider.GetOperatingUser();

            // Skip audit for API endpoints.
            // TODO: Enable this back when we have token auth.
            if (operatingUser == null)
            {
                return;
            }

            var dateTime = _dateTimeProvider.Now();

            foreach (var entry in entries)
            {
                AuditEntry audit = null;

                switch (entry.State)
                {
                case EntityState.Deleted:
                    // Save all values as old
                    audit = new AuditEntry {
                        OldValue = Serialize(entry.CurrentValues)
                    };
                    break;

                case EntityState.Modified:
                    // Save changed properties
                    audit = new AuditEntry
                    {
                        NewValue = Serialize(entry.CurrentValues),
                        OldValue = Serialize(entry.OriginalValues)
                    };
                    break;

                case EntityState.Added:
                    // Save new values
                    audit = new AuditEntry {
                        NewValue = Serialize(entry.CurrentValues)
                    };
                    break;

                default:
                    continue;
                }

                // Do not create audit for audit. This should not happen.
                // Debug.Assert(!(entry.Entity is AuditEntry));

                if (!(entry.Entity is AuditEntry))
                {
                    audit.EntityName = entry.Metadata.DisplayName();
                    audit.UserId     = (operatingUser).Id;
                    audit.Date       = dateTime;
                    //NOTE: Was not recording audit entries
                    AuditEntries.Add(audit);
                }
            }
        }