public async Task <OperationResult> Update(NotificationRuleModel ruleModel) { using (var transaction = await _dbContext.Database.BeginTransactionAsync()) { try { var rule = await _dbContext.Rules .Include(x => x.Recipients) .FirstOrDefaultAsync(x => x.WorkflowState != Constants.WorkflowStates.Removed && x.Id == ruleModel.Id); if (rule == null) { return(new OperationResult(false, _localizationService.GetString("NotificationRuleNotFound"))); } rule.AttachReport = ruleModel.AttachReport; rule.AttachLink = ruleModel.AttachLink; rule.IncludeValue = ruleModel.IncludeValue; rule.RuleType = ruleModel.RuleType; rule.Subject = ruleModel.Subject; rule.CheckListId = ruleModel.CheckListId; rule.Text = ruleModel.Text; rule.DataItemId = ruleModel.DataItemId; if (ruleModel.Data != null) { rule.Data = ruleModel.Data.ToString(); } await rule.Update(_dbContext); // work with recipients var currentRecipients = ruleModel.Recipients.Select(x => x.Id).ToList(); var recipientsDelete = await _dbContext.Recipients .Where(r => r.NotificationRuleId == rule.Id && !currentRecipients.Contains(r.Id)) .ToListAsync(); foreach (var rd in recipientsDelete) { await rd.Delete(_dbContext); } foreach (var recipientModel in ruleModel.Recipients.Where(r => r.Id == null)) { var recipient = new Recipient { Email = recipientModel.Email, NotificationRuleId = rule.Id, CreatedByUserId = UserId, UpdatedByUserId = UserId }; await recipient.Create(_dbContext); } // work with device users var currentDeviseUserId = ruleModel.DeviceUsers.Select(x => x.Id).ToList(); var deviceUsersDelete = await _dbContext.DeviceUsers .Where(r => r.NotificationRuleId == rule.Id && !currentDeviseUserId.Contains(r.DeviceUserId)) .ToListAsync(); foreach (var dud in deviceUsersDelete) { await dud.Delete(_dbContext); } foreach (var deviceUserModel in ruleModel.DeviceUsers) { if (!await _dbContext.DeviceUsers.AnyAsync( x => x.DeviceUserId == deviceUserModel.Id && x.NotificationRuleId == rule.Id && x.WorkflowState != Constants.WorkflowStates.Removed)) { if (deviceUserModel.Id != null) { var deviceUser = new DeviceUser() { NotificationRuleId = rule.Id, CreatedByUserId = UserId, UpdatedByUserId = UserId, DeviceUserId = (int)deviceUserModel.Id, }; await deviceUser.Create(_dbContext); } } } transaction.Commit(); return(new OperationResult( true, _localizationService.GetString("NotificationRuleHasBeenUpdated"))); } catch (Exception e) { transaction.Rollback(); _logger.LogError(e.Message); return(new OperationResult( false, _localizationService.GetString("ErrorWhileUpdatingNotificationRule"))); } } }
public async Task <OperationResult> Create(NotificationRuleModel ruleModel) { using (var transaction = await _dbContext.Database.BeginTransactionAsync()) { try { var notificationRule = new NotificationRule() { Subject = ruleModel.Subject, Text = ruleModel.Text, AttachReport = ruleModel.AttachReport, AttachLink = ruleModel.AttachLink, IncludeValue = ruleModel.IncludeValue, DataItemId = ruleModel.DataItemId, CheckListId = ruleModel.CheckListId, RuleType = ruleModel.RuleType, CreatedByUserId = UserId, UpdatedByUserId = UserId, }; if (ruleModel.Data != null) { notificationRule.Data = ruleModel.Data?.ToString(); } await notificationRule.Create(_dbContext); foreach (var recipientModel in ruleModel.Recipients) { var recipient = new Recipient() { CreatedByUserId = UserId, UpdatedByUserId = UserId, Email = recipientModel.Email, NotificationRuleId = notificationRule.Id, }; await recipient.Create(_dbContext); } var deviceUsersGroupedIds = ruleModel.DeviceUsers .Where(x => x.Id != null) .GroupBy(x => x.Id) .Select(x => x.Key) .ToList(); foreach (var deviceUserId in deviceUsersGroupedIds) { if (deviceUserId != null) { var deviceUser = new DeviceUser() { CreatedByUserId = UserId, UpdatedByUserId = UserId, NotificationRuleId = notificationRule.Id, DeviceUserId = (int)deviceUserId, }; await deviceUser.Create(_dbContext); } } transaction.Commit(); return(new OperationResult( true, _localizationService.GetString("NotificationRuleCreatedSuccessfully"))); } catch (Exception e) { transaction.Rollback(); _logger.LogError(e.Message); return(new OperationResult( false, _localizationService.GetString("ErrorWhileCreatingNotificationRule"))); } } }