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)); }
//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(); }
public IHttpActionResult GetAuditEntries(Guid id) { AuditEntries auditEntries = db.AuditEntries.Find(id); if (auditEntries == null) { return(NotFound()); } return(Ok(auditEntries)); }
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)); }
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)); }
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(); } }
/// <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); }
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); } } }