/// <summary> /// Store audit in context /// </summary> /// <typeparam name="TContext"></typeparam> /// <param name="audit"></param> /// <param name="context"></param> /// <returns></returns> public static bool Store <TContext>(this TrackAudit audit, TContext context) where TContext : DbContext, ITrackerDbContext { try { context.Add(audit); context.SaveChanges(); return(true); } catch (Exception ex) { Debug.WriteLine(ex); return(false); } }
/// <summary> /// Check and get track able entity /// </summary> /// <param name="eventArgs"></param> /// <returns></returns> public static ResultModel <(TrackAudit, object)> ExtractAudit(EntityEntry eventArgs) { var response = new ResultModel <(TrackAudit, object)>(); //If is trackable entity return if (eventArgs.Entity is TrackAudit || eventArgs.Entity is TrackAuditDetails) { return(response); } if (!(eventArgs.Entity is IBase <Guid> baseModel)) { return(response); } var(isTrackable, trackOption) = IsTrackable(eventArgs.Entity.GetType()); if (!isTrackable) { return(response); } try { dynamic entry = eventArgs.Entity; var contextName = eventArgs.Context.GetType().FullName; var audit = new TrackAudit { TypeFullName = eventArgs.Entity.GetType().FullName, Author = nameof(System), ModifiedBy = nameof(System), Version = baseModel.Version, TrackEventType = GetRecordState(eventArgs.State), DatabaseContextName = contextName, RecordId = baseModel.Id, UserName = baseModel.ModifiedBy, TenantId = baseModel.TenantId }; var auditDetails = new List <TrackAuditDetails>(); if (trackOption.Equals(TrackEntityOption.SelectedFields)) { auditDetails.AddRange(eventArgs.Entity.GetType().GetProperties().Where(IsFieldTrackable) .Select(x => new TrackAuditDetails { ModifiedBy = audit.UserName, PropertyName = x.Name, PropertyType = x.PropertyType.FullName, Value = x.GetValue(eventArgs.Entity)?.ToString() })); } else { auditDetails.AddRange(eventArgs.Entity.GetType().GetProperties().Where(IsFieldNotIgnored) .Select(x => new TrackAuditDetails { ModifiedBy = audit.UserName, PropertyName = x.Name, PropertyType = x.PropertyType.FullName, Value = x.GetValue(eventArgs.Entity)?.ToString() })); } audit.AuditDetailses = auditDetails; response.IsSuccess = true; response.Result = (audit, entry); return(response); } catch (Exception e) { response.Errors.Add(new ErrorModel(nameof(Exception), e.Message)); response.Errors.Add(new ErrorModel(nameof(Exception), e.InnerException?.ToString())); } return(response); }
public static TrackAudit GetTrackAuditFromDictionary(this Dictionary <string, object> keys, string contextName, Guid?tenantId, Type objectType, TrackEventType eventType) { if (keys == null) { return(null); } var details = new List <TrackAuditDetails>(); var audit = new TrackAudit { Created = DateTime.Now, Changed = DateTime.Now, DatabaseContextName = contextName, TenantId = tenantId, TypeFullName = objectType?.FullName, TrackEventType = eventType, Version = 1 }; if (keys.ContainsKey("Id")) { audit.RecordId = keys["Id"].ToString().ToGuid(); } if (eventType == TrackEventType.Updated) { if (keys.ContainsKey("Version")) { try { var version = Convert.ToInt32(keys["Version"]); audit.Version = version; } catch (Exception ex) { Debug.WriteLine(ex); } } } foreach (var prop in keys) { try { var detailObject = new TrackAuditDetails { PropertyName = prop.Key, PropertyType = prop.Value?.GetType().FullName, Value = prop.Value?.ToString(), TenantId = tenantId }; details.Add(detailObject); } catch (Exception ex) { Debug.WriteLine(ex); } } audit.AuditDetailses = details; return(audit); }