Пример #1
0
 /// <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);
     }
 }
Пример #2
0
        /// <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);
        }
Пример #3
0
        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);
        }