public void Register(List <AuditActionDto> businessActionDtos)
        {
            try
            {
                List <Persistance.Models.Action> actions          = new List <Persistance.Models.Action>();
                List <ActionUserGroup>           actionUserGroups = new List <ActionUserGroup>();

                AddDatabaseActions(actions);

                var businessActionsRegistration = new BusinessActionsRegistration(businessActionDtos, actions, actionUserGroups, AuditUnitOfWork, ErrorLoger);
                businessActionsRegistration.AddBusinessActions();

                if (actions.Any())
                {
                    AuditUnitOfWork.ActionRepository.Add(actions);
                }

                if (actionUserGroups.Any())
                {
                    AuditUnitOfWork.ActionUserGroupRepository.Add(actionUserGroups);
                }

                AuditUnitOfWork.Save();
            }
            catch (Exception ex)
            {
                ErrorLoger.Log(ex);
            }
        }
        //3 database hits
        public async Task SaveCustomActionsAuditTrailAsync(string actionCode, string actionData, string userName)
        {
            try
            {
                AuditTrail auditTrail = new AuditTrail
                {
                    Audit_ActionCode = actionCode,
                    ActionData       = actionData,
                    UserName         = userName
                };

                await AuditUnitOfWork.AuditTrailRepository.AddAsync(auditTrail);

                await notificationService.SaveNotificationAsync(actionCode);

                await AuditUnitOfWork.SaveAsync();
            }
            catch (Exception ex)
            {
                await ErrorLoger.Log(ex);
            }
        }
        public async Task CheckNotificationsAndSend()
        {
            try
            {
                var notSentNotifications = await AuditUnitOfWork.NotificationRepository.GetAsync(a => a.Sent == false);

                if (notSentNotifications.Any())
                {
                    List <NotificationLog> notificationLogs = new List <NotificationLog>();

                    notSentNotifications.ForEach(async notification =>
                    {
                        var result = await EmailService.SendAsync("", notification.ToEmails.Split(',').ToList(), "", notification.Message);

                        if (result.Succeeded)
                        {
                            notification.Sent = result.Succeeded;
                            AuditUnitOfWork.NotificationRepository.Update(notification);
                        }

                        NotificationLog notificationLog = new NotificationLog();
                        notificationLog.NotificationId  = notification.Id;
                        notificationLog.SendSucceeded   = result.Succeeded;
                        notificationLog.ErrorMessage    = result.ErrorMessage;
                        notificationLog.TryDate         = DateTime.Now;
                        notificationLogs.Add(notificationLog);
                    });

                    await AuditUnitOfWork.NotificationLogRepository.AddAsync(notificationLogs);

                    await AuditUnitOfWork.SaveAsync();
                }
            }
            catch (Exception ex)
            {
                await ErrorLoger.Log(ex);
            }
        }
        //4 database hits
        public async Task SaveDbActionsAuditTrailAsync(List <DatabaseChangesDto> databaseChanges)
        {
            try
            {
                List <AuditTrail> auditTrails = new List <AuditTrail>();
                var updatedList = AuditUnitOfWork.AuditTrailRepository.AddToAuditTrailList(databaseChanges, DatabaseAuditActionsEnum.DatabaseUpdate.ToString(), EntityState.Modified, auditTrails);
                var addedList   = AuditUnitOfWork.AuditTrailRepository.AddToAuditTrailList(databaseChanges, DatabaseAuditActionsEnum.DatabaseAdd.ToString(), EntityState.Added, auditTrails);
                var deletedList = AuditUnitOfWork.AuditTrailRepository.AddToAuditTrailList(databaseChanges, DatabaseAuditActionsEnum.DatabaseDelete.ToString(), EntityState.Deleted, auditTrails);

                await AuditUnitOfWork.AuditTrailRepository.AddAsync(auditTrails);

                await notificationService.SaveNotificationsAsync(DatabaseAuditActionsEnum.DatabaseUpdate.ToString(), updatedList);

                await notificationService.SaveNotificationsAsync(DatabaseAuditActionsEnum.DatabaseAdd.ToString(), addedList);

                await notificationService.SaveNotificationsAsync(DatabaseAuditActionsEnum.DatabaseDelete.ToString(), deletedList);

                await AuditUnitOfWork.SaveAsync();
            }
            catch (Exception ex)
            {
                await ErrorLoger.Log(ex);
            }
        }
 public AuditAttributeImpl(AuditUnitOfWork unitOfWork)
 {
     _stopWatch  = new Stopwatch();
     _time       = new DateTime();
     _unitOfWork = unitOfWork;
 }
 public AuditAttributeImpl(AuditUnitOfWork auditUnitOfWork)
 {
     _stopwatch       = new Stopwatch();
     _auditUnitOfWork = auditUnitOfWork;
     _time            = new DateTime();
 }