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); } }
protected void FixEventMessageTypeCode(SendEventData eventMessage) { if (eventMessage.TypeCode != null && eventMessage.TypeCode.Length > 20) { eventMessage.TypeCode = eventMessage.TypeCode.Substring(0, 20); } }
public SendEventResponse SendEvent(Guid accountId, SendEventData data) { var request = GetRequest <SendEventRequest>(accountId); request.Data = data; var dispatcher = DispatcherHelper.GetDispatcherService(); return(dispatcher.SendEvent(request)); }
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); } } }
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; } } }
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) }); }
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, "Время начала события значительно больше, чем текущее время"); } }
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); }