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