示例#1
0
        protected void FixEventMessageNames(SendEventData eventMessage)
        {
            // поправим имена
            if (eventMessage.TypeSystemName == null)
            {
                eventMessage.TypeSystemName = eventMessage.TypeDisplayName;
            }
            if (eventMessage.TypeDisplayName == null)
            {
                eventMessage.TypeDisplayName = eventMessage.TypeSystemName;
            }
            if (string.IsNullOrEmpty(eventMessage.TypeSystemName))
            {
                throw new ParameterRequiredException("TypeSystemName");
            }

            if (eventMessage.TypeSystemName.Length > 255)
            {
                eventMessage.TypeSystemName = eventMessage.TypeSystemName.Substring(0, 255);
            }

            if (eventMessage.TypeDisplayName.Length > 255)
            {
                eventMessage.TypeDisplayName = eventMessage.TypeDisplayName.Substring(0, 255);
            }
        }
示例#2
0
 protected void FixEventMessageTypeCode(SendEventData eventMessage)
 {
     if (eventMessage.TypeCode != null && eventMessage.TypeCode.Length > 20)
     {
         eventMessage.TypeCode = eventMessage.TypeCode.Substring(0, 20);
     }
 }
示例#3
0
        public SendEventResponse SendEvent(Guid accountId, SendEventData data)
        {
            var request = GetRequest <SendEventRequest>(accountId);

            request.Data = data;
            var dispatcher = DispatcherHelper.GetDispatcherService();

            return(dispatcher.SendEvent(request));
        }
示例#4
0
 protected void FixEventMessageJoinKey(SendEventData message)
 {
     if (message.JoinKey == null)
     {
         if (message.Category == EventCategory.ApplicationError)
         {
             var stack = message.Properties.GetValue(ExtentionPropertyName.Stack);
             message.JoinKey = HashHelper.GetInt64(message.TypeSystemName, stack);
         }
     }
 }
示例#5
0
 protected void FixEventMessageJoinInterval(SendEventData message)
 {
     if (message.JoinInterval == null)
     {
         if (message.Category == EventCategory.ApplicationError)
         {
             message.JoinInterval = TimeSpan.FromDays(1).TotalSeconds;
         }
         else if (message.Category == EventCategory.ComponentEvent)
         {
             message.JoinInterval = 0;
         }
     }
 }
示例#6
0
 public static SendEventRequestDtoData GetSendEventRequestDtoData(SendEventData data)
 {
     if (data == null)
     {
         return(null);
     }
     return(new SendEventRequestDtoData()
     {
         Category = data.Category,
         ComponentId = data.ComponentId,
         Count = data.Count,
         Importance = data.Importance,
         JoinIntervalSeconds = GetSeconds(data.JoinInterval),
         JoinKey = data.JoinKey,
         Message = data.Message,
         StartDate = data.StartDate,
         TypeCode = data.TypeCode,
         TypeDisplayName = data.TypeDisplayName,
         TypeSystemName = data.TypeSystemName,
         Version = data.Version,
         Properties = GetExtentionPropertyDtos(data.Properties)
     });
 }
示例#7
0
 protected void CheckEventStartDate(SendEventData message, Guid accountId, Guid eventTypeId, Guid eventId)
 {
     if (message.StartDate > DateTime.Now.AddMinutes(5))
     {
         var now = DateTime.Now;
         try
         {
             var eventData = new SendEventData()
             {
                 JoinInterval = TimeSpan.FromHours(1).TotalSeconds,
                 Category     = EventCategory.ComponentEvent,
                 Count        = 1,
                 StartDate    = now,
                 Importance   = EventImportance.Warning,
                 Message      = string.Format(
                     "Время начала события: {0}, текущее время: {1}",
                     (message.StartDate ?? now).ToString("dd.MM.yyyy HH:mm:ss"),
                     now.ToString("dd.MM.yyyy HH:mm:ss")),
                 TypeSystemName  = "System.FutureEvent",
                 TypeDisplayName = "Время начала события значительно больше, чем текущее время",
                 Version         = message.Version,
                 Properties      = new List <Api.ExtentionPropertyDto>()
             };
             eventData.Properties.AddValue("EventId", eventId);
             eventData.Properties.AddValue("EventTypeId", eventTypeId);
             eventData.Properties.AddValue("EventMessage", message.Message);
             SendEvent(accountId, message.ComponentId ?? Guid.Empty, eventData);
         }
         catch (Exception)
         {
             // todo Что тут должно быть?
         }
         throw new ResponseCodeException(
                   Zidium.Api.ResponseCode.FutureEvent,
                   "Время начала события значительно больше, чем текущее время");
     }
 }
示例#8
0
        public IEventCacheReadObject SendEvent(Guid accountId, Guid componentId, SendEventData message)
        {
            // Проверим, что компонент вообще есть
            var componentRequest = new AccountCacheRequest()
            {
                AccountId = accountId,
                ObjectId  = componentId
            };
            var component = AllCaches.Components.Find(componentRequest);

            if (component == null)
            {
                throw new UnknownComponentIdException(componentId, accountId);
            }
            if (component.CanProcess == false)
            {
                throw new ResponseCodeException(Zidium.Api.ResponseCode.ObjectDisabled, "Компонент выключен");
            }

            // проверка лимитов
            var accountDbContext = Context.GetAccountDbContext(accountId);
            var limitChecker     = AccountLimitsCheckerManager.GetCheckerForAccount(accountId);

            limitChecker.CheckEventsRequestsPerDay(accountDbContext);

            // Проверим лимит размера хранилища
            var size = message.GetSize();

            limitChecker.CheckStorageSize(accountDbContext, size);

            // todo нет проверки обязательных параметров
            FixEventMessageNames(message);
            FixEventMessageTypeCode(message);
            FixEventMessageJoinKey(message); // todo не уверен, что нужно менять ключ склейки при разных версиях (но склеивать с  разными версиями нельзя!)
            FixEventMessageJoinInterval(message);

            // категория
            if (message.Category == null)
            {
                message.Category = EventCategory.ComponentEvent;
            }

            // важность
            message.Importance = GetEventImportance(message.Importance, message.Category.Value);

            if (message.StartDate == null)
            {
                message.StartDate = DateTime.Now;
            }

            var eventType = GetOrCreateEventType(
                accountId,
                message.Category.Value,
                message.TypeSystemName,
                message.TypeDisplayName,
                component.ComponentTypeId,
                message.TypeCode);

            var joinTime = DataConverter.GetTimeSpanFromSeconds(message.JoinInterval);

            var localEvent = CreateEvent(
                accountId,
                message.StartDate,
                message.StartDate,
                message.Count,
                message.Version,
                message.Importance,
                TimeSpan.FromMinutes(1),
                message.Message,
                message.Properties,
                eventType,
                componentId,
                message.JoinKey ?? 0);

            // eventType.JoinInterval стоит на первом месте, чтобы можно было изменить поведение БЕЗ перекомпиляции кода
            var joinInterval = eventType.JoinInterval ?? joinTime ?? TimeSpan.Zero;

            if (!EventCategoryHelper.IsCustomerEventCategory(eventType.Category))
            {
                throw new Exception("Недопустимая категория события: " + eventType.Category);
            }

            var result = ProcessSimpleEvent(componentId, localEvent, null, joinInterval, accountId);

            limitChecker.AddEventsRequestsPerDay(accountDbContext);
            limitChecker.AddEventsSizePerDay(accountDbContext, size);

            // если есть закрытый или тестируемый дефект и событие - новая ошибка, то переоткроем дефект
            if (eventType.Defect != null)
            {
                var defectStatus = eventType.Defect.GetStatus();
                if ((defectStatus == DefectStatus.Closed || defectStatus == DefectStatus.Testing) && !EventIsOld(eventType.OldVersion, result.Version))
                {
                    var defectService = accountDbContext.GetDefectService();
                    defectService.AutoReopen(accountId, eventType.Defect);
                    accountDbContext.SaveChanges();
                }
            }

            // проверим "событие из будущего"
            CheckEventStartDate(message, accountId, eventType.Id, result.Id);

            return(result);
        }