protected override void Send(ILogger logger, Notification notification, AccountDbContext accountDbContext, string accountName, Guid accountId) { var to = notification.Address; var componentRepository = accountDbContext.GetComponentRepository(); var component = componentRepository.GetById(notification.Event.OwnerId); var path = ComponentHelper.GetComponentPathText(component); var subject = string.Format("{0} - {1}", path, GetEventImportanceText(notification.Event.Importance)); if (notification.Reason == NotificationReason.Reminder) { subject = subject + " (напоминание)"; } // составляем тело письма var user = accountDbContext.GetUserRepository().GetById(notification.UserId); var htmlBody = GetStatusEventHtml(user, logger, notification, component, accountDbContext, accountName); // сохраняем письмо в очередь var emailRepository = accountDbContext.GetSendEmailCommandRepository(); var command = new SendEmailCommand() { Id = Guid.NewGuid(), Body = htmlBody, IsHtml = true, Subject = subject, To = to, ReferenceId = notification.Id }; emailRepository.Add(command); }
public SubscriptionsTableModel GetTable(SubscriptionObject obj) { var model = new SubscriptionsTableModel() { Object = obj, UserId = UserId }; var subscriptions = Subscriptions.Where(x => x.Object == obj).ToArray(); // подписки по умолчанию if (obj == SubscriptionObject.Default) { var emails = subscriptions.Where(x => x.Channel == SubscriptionChannel.Email).ToArray(); var sms = subscriptions.Where(x => x.Channel == SubscriptionChannel.Sms).ToArray(); var row = new SubscriptionsTableRowModel() { Email = new ShowSubscriptionCellModel() { Channel = SubscriptionChannel.Email, Object = SubscriptionObject.Default }, Sms = new ShowSubscriptionCellModel() { Channel = SubscriptionChannel.Sms, Object = SubscriptionObject.Default } }; row.Email.Subscription = emails.SingleOrDefault(x => x.Object == SubscriptionObject.Default); row.Sms.Subscription = sms.SingleOrDefault(x => x.Object == SubscriptionObject.Default); model.Rows = new[] { row }; } // подписки на тип компонента if (obj == SubscriptionObject.ComponentType) { var componentTypeGroups = subscriptions.GroupBy(x => x.ComponentTypeId).Select(x => new { ComponentType = x.First().ComponentType, Subscriptions = x.ToArray() }) .OrderBy(x => x.ComponentType.DisplayName) .ToArray(); var rows = new List <SubscriptionsTableRowModel>(); foreach (var componentTypeGroup in componentTypeGroups) { var row = new SubscriptionsTableRowModel() { Email = new ShowSubscriptionCellModel() { Channel = SubscriptionChannel.Email, Object = SubscriptionObject.ComponentType, ObjectId = componentTypeGroup.ComponentType.Id }, Sms = new ShowSubscriptionCellModel() { Channel = SubscriptionChannel.Sms, Object = SubscriptionObject.ComponentType, ObjectId = componentTypeGroup.ComponentType.Id } }; row.Email.Subscription = componentTypeGroup.Subscriptions.SingleOrDefault(x => x.Channel == SubscriptionChannel.Email); row.Sms.Subscription = componentTypeGroup.Subscriptions.SingleOrDefault(x => x.Channel == SubscriptionChannel.Sms); rows.Add(row); } model.Rows = rows.ToArray(); } // подписки на компонент if (obj == SubscriptionObject.Component) { var componentGroups = subscriptions.GroupBy(x => x.ComponentId).Select(x => new { Component = x.First().Component, FullName = ComponentHelper.GetComponentPathText(x.First().Component), Subscriptions = x.ToArray() }) .OrderBy(x => x.FullName) .ToArray(); var rows = new List <SubscriptionsTableRowModel>(); foreach (var componentGroup in componentGroups) { var row = new SubscriptionsTableRowModel() { Email = new ShowSubscriptionCellModel() { Channel = SubscriptionChannel.Email, Object = SubscriptionObject.Component, ObjectId = componentGroup.Component.Id }, Sms = new ShowSubscriptionCellModel() { Channel = SubscriptionChannel.Sms, Object = SubscriptionObject.Component, ObjectId = componentGroup.Component.Id } }; row.Email.Subscription = componentGroup.Subscriptions.SingleOrDefault(x => x.Channel == SubscriptionChannel.Email); row.Sms.Subscription = componentGroup.Subscriptions.SingleOrDefault(x => x.Channel == SubscriptionChannel.Sms); rows.Add(row); } model.Rows = rows.ToArray(); } // родительские связи foreach (var row in model.Rows) { row.Table = model; row.Email.Row = row; row.Sms.Row = row; } return(model); }
protected string GetStatusEventText(ILogger logger, Notification notification, Component component, AccountDbContext accountDbContext, string accountName) { var statusEvent = notification.Event; var text = new StringBuilder(); // Делаем строку: // ОШИБКА - ASMO/ПДК-10 var eventImportance = statusEvent.Importance; var statusName = GetEventImportanceText(eventImportance); text.Append(statusName); text.Append(" - "); var componentPathText = ComponentHelper.GetComponentPathText(component); text.Append(componentPathText); // Причину показываем, только если статус стал опаснее if (statusEvent.ImportanceHasGrown) { var reasonEvent = GetRecentReasonEvent(statusEvent, accountDbContext); if (reasonEvent != null) { text.Append(", причина: "); // причина - ошибка компонента if (reasonEvent.Category == Core.Api.EventCategory.ApplicationError) { var eventTypeRepository = accountDbContext.GetEventTypeRepository(); var errorType = eventTypeRepository.GetById(reasonEvent.EventTypeId); var errorTitle = "ошибка " + (errorType.Code != null ? errorType.Code : errorType.DisplayName); text.Append(errorTitle); } // причина - событие компонента if (reasonEvent.Category == Core.Api.EventCategory.ComponentEvent) { var eventTypeRepository = accountDbContext.GetEventTypeRepository(); var componentEventType = eventTypeRepository.GetById(reasonEvent.EventTypeId); var errorTitle = "событие компонента " + componentEventType.DisplayName; text.Append(errorTitle); } // причина - статус дочернего компонента if (reasonEvent.Category == Core.Api.EventCategory.ComponentExternalStatus) { var componentRepository = accountDbContext.GetComponentRepository(); var childComponent = componentRepository.GetById(reasonEvent.OwnerId); var errorTitle = "статус " + statusName + " дочернего компонента " + childComponent.DisplayName; text.Append(errorTitle); } // причина - результат проверки if (reasonEvent.Category == Core.Api.EventCategory.UnitTestResult) { var unitTestRepository = accountDbContext.GetUnitTestRepository(); var unitTest = unitTestRepository.GetById(reasonEvent.OwnerId); var errorTitle = "результат проверки " + unitTest.DisplayName; text.Append(errorTitle); } // причина - значение метрики if (reasonEvent.Category == Core.Api.EventCategory.MetricStatus) { var metricRepository = accountDbContext.GetMetricRepository(); var metric = metricRepository.GetById(reasonEvent.OwnerId); var metricHistoryRepository = accountDbContext.GetMetricHistoryRepository(); var firstValue = metricHistoryRepository.GetAllByStatus(reasonEvent.Id) .OrderBy(x => x.BeginDate) .FirstOrDefault(); var firstValueText = firstValue != null?firstValue.Value.ToString() : "null"; var errorTitle = "значение метрики " + metric.MetricType.DisplayName + " = " + firstValueText; text.Append(errorTitle); } } } var body = text.ToString(); return(body); }