public TicketItemProperty ToggleProperty(MenuItemPropertyGroup group, MenuItemProperty menuItemProperty)
        {
            var ti = _model.ToggleProperty(group, menuItemProperty);

            if (ti != null)
            {
                RuleExecutor.NotifyEvent(RuleEventNames.ModifierSelected,
                                         new
                {
                    Ticket                    = AppServices.MainDataContext.SelectedTicket,
                    TicketItem                = Model,
                    TicketTag                 = AppServices.MainDataContext.SelectedTicket.Tag,
                    MenuItemName              = _model.MenuItemName,
                    ModifierGroupName         = group.Name,
                    ModifierName              = menuItemProperty.Name,
                    ModifierPrice             = ti.PropertyPrice.Amount + ti.VatAmount,
                    ModifierQuantity          = ti.Quantity,
                    IsRemoved                 = !_model.Properties.Contains(ti),
                    IsPriceAddedToParentPrice = ti.CalculateWithParentPrice,
                    TotalPropertyCount        = Model.Properties.Count,
                    TotalModifierQuantity     = Model.Properties.Where(x => x.PropertyGroupId == group.Id).Sum(x => x.Quantity),
                    TotalModifierPrice        = Model.Properties.Where(x => x.PropertyGroupId == group.Id).Sum(x => x.PropertyPrice.Amount + x.VatAmount)
                });
            }
            RefreshProperties();
            RaisePropertyChanged("Properties");
            RaisePropertyChanged("TotalPrice");
            RaisePropertyChanged("Quantity");
            return(ti);
        }
Exemple #2
0
        public void UpdateTag(TicketTagGroup tagGroup, TicketTag ticketTag)
        {
            Model.SetTagValue(tagGroup.Name, ticketTag.Name);
            if (tagGroup.Numerator != null)
            {
                Model.TicketNumber = "";
                AppServices.MainDataContext.UpdateTicketNumber(Model, tagGroup.Numerator);
            }

            if (ticketTag.AccountId > 0)
            {
                AppServices.MainDataContext.AssignCustomerToTicket(Model,
                                                                   Dao.SingleWithCache <Customer>(x => x.Id == ticketTag.AccountId));
            }

            ClearSelectedItems();

            var tagData = new TicketTagData {
                Action = tagGroup.Action, TagName = tagGroup.Name, TagValue = ticketTag.Name, NumericValue = tagGroup.NumericTags || tagGroup.PriceTags ? Convert.ToDecimal(ticketTag.Name) : 0
            };

            RuleExecutor.NotifyEvent(RuleEventNames.TicketTagSelected,
                                     new
            {
                Ticket = Model,
                tagData.TagName,
                tagData.TagValue,
                tagData.NumericValue,
                TicketTag = Model.Tag
            });

            tagData.PublishEvent(EventTopicNames.TagSelectedForSelectedTicket);
        }
Exemple #3
0
        public static void AssignTableToSelectedTicket(int locationId)
        {
            var oldLocation = AppServices.MainDataContext.SelectedTicket != null ? AppServices.MainDataContext.SelectedTicket.LocationName : "";

            AppServices.MainDataContext.AssignTableToSelectedTicket(locationId);
            RuleExecutor.NotifyEvent(RuleEventNames.TicketLocationChanged, new { Ticket = AppServices.MainDataContext.SelectedTicket, OldLocation = oldLocation, NewLocation = AppServices.MainDataContext.SelectedTicket.LocationName });
        }
        private static void RegisterNotifiers()
        {
            EventServiceFactory.EventService.GetEvent <GenericEvent <Message> >().Subscribe(x =>
            {
                if (x.Topic == EventTopicNames.MessageReceivedEvent && x.Value.Command == "ActionMessage")
                {
                    RuleExecutor.NotifyEvent(RuleEventNames.MessageReceived, new { Command = x.Value.Data });
                }

                if (x.Topic == EventTopicNames.MessageReceivedEvent && x.Value.Command == "SHUTDOWN")
                {
                    RuleExecutor.NotifyEvent(RuleEventNames.MessageReceived, new { Command = "SHUTDOWN" });
                }
            });

            EventServiceFactory.EventService.GetEvent <GenericEvent <User> >().Subscribe(x =>
            {
                if (x.Topic == EventTopicNames.UserLoggedIn)
                {
                    RuleExecutor.NotifyEvent(RuleEventNames.UserLoggedIn, new { User = x.Value, UserName = x.Value.Name, RoleName = x.Value.UserRole.Name });
                }

                if (x.Topic == EventTopicNames.UserLoggedOut)
                {
                    RuleExecutor.NotifyEvent(RuleEventNames.UserLoggedOut, new { User = x.Value, UserName = x.Value.Name, RoleName = x.Value.UserRole.Name });
                }
            });
        }
 public async Task ExecuteAsync(RuleImp rule)
 {
     foreach (var item in Order.Items)
     {
         this.GetService <OrderStateService>().CurrentOrderItem = item;
         await RuleExecutor.ExecuteAsync(this, rule);
     }
 }
Exemple #6
0
 private void OnStartOfDayExecute(string obj)
 {
     AppServices.MainDataContext.StartWorkPeriod(StartDescription, CashAmount, CreditCardAmount, TicketAmount);
     Refresh();
     AppServices.MainDataContext.CurrentWorkPeriod.PublishEvent(EventTopicNames.WorkPeriodStatusChanged);
     RuleExecutor.NotifyEvent(RuleEventNames.WorkPeriodStarts, new { WorkPeriod = AppServices.MainDataContext.CurrentWorkPeriod, UserName = AppServices.CurrentLoggedInUser.Name });
     InteractionService.UserIntraction.GiveFeedback(Resources.StartingWorkPeriodCompleted);
     EventServiceFactory.EventService.PublishEvent(EventTopicNames.ActivateNavigation);
 }
Exemple #7
0
 private void OnEndOfDayExecute(string obj)
 {
     StopTimer();
     AppServices.MainDataContext.StopWorkPeriod(EndDescription);
     Refresh();
     AppServices.MainDataContext.CurrentWorkPeriod.PublishEvent(EventTopicNames.WorkPeriodStatusChanged);
     RuleExecutor.NotifyEvent(RuleEventNames.WorkPeriodEnds, new { WorkPeriod = AppServices.MainDataContext.CurrentWorkPeriod, UserName = AppServices.CurrentLoggedInUser.Name });
     InteractionService.UserIntraction.GiveFeedback(Resources.WorkPeriodEndsMessage);
     EventServiceFactory.EventService.PublishEvent(EventTopicNames.ActivateNavigation);
 }
Exemple #8
0
        private void ProcessPayment(PaymentType paymentType)
        {
            var tenderedAmount         = GetTenderedValue();
            var originalTenderedAmount = tenderedAmount;
            var remainingTicketAmount  = GetPaymentValue();
            var returningAmount        = 0m;

            if (tenderedAmount == 0)
            {
                tenderedAmount = remainingTicketAmount;
            }

            if (tenderedAmount > remainingTicketAmount)
            {
                returningAmount = tenderedAmount - remainingTicketAmount;
                tenderedAmount  = remainingTicketAmount;
            }

            if (tenderedAmount > 0)
            {
                if (tenderedAmount > AppServices.MainDataContext.SelectedTicket.GetRemainingAmount())
                {
                    tenderedAmount = AppServices.MainDataContext.SelectedTicket.GetRemainingAmount();
                }

                TicketViewModel.AddPaymentToSelectedTicket(tenderedAmount, paymentType);

                PaymentAmount = (GetPaymentValue() - tenderedAmount).ToString("#,#0.00");

                LastTenderedAmount = tenderedAmount <= AppServices.MainDataContext.SelectedTicket.GetRemainingAmount()
                    ? tenderedAmount.ToString("#,#0.00")
                    : AppServices.MainDataContext.SelectedTicket.GetRemainingAmount().ToString("#,#0.00");
            }

            ReturningAmount           = string.Format(Resources.ChangeAmount_f, returningAmount.ToString(LocalSettings.DefaultCurrencyFormat));
            ReturningAmountVisibility = returningAmount > 0 ? Visibility.Visible : Visibility.Collapsed;

            if (returningAmount > 0)
            {
                RuleExecutor.NotifyEvent(RuleEventNames.ChangeAmountChanged,
                                         new { Ticket = SelectedTicket.Model, TicketAmount = SelectedTicket.Model.TotalAmount, ChangeAmount = returningAmount, TenderedAmount = originalTenderedAmount });
            }

            if (returningAmount == 0 && AppServices.MainDataContext.SelectedTicket.GetRemainingAmount() == 0)
            {
                ClosePaymentScreen();
            }
            else
            {
                PersistMergedItems();
            }
        }
Exemple #9
0
        private decimal ProcessTransaction(TransactionRequest request)
        {
            //To insert fresh Record
            InsertOperation repo = new InsertOperation();

            repo.InsertFreshTransaction(request);

            RuleExecutor rule = new RuleExecutor();

            var score = rule.RunRules(request.Transactionid);

            return(score);
        }
Exemple #10
0
        public TicketItemViewModel AddNewItem(int menuItemId, decimal quantity, bool gift, string defaultProperties, string portionName)
        {
            if (!Model.CanSubmit)
            {
                return(null);
            }
            ClearSelectedItems();
            var menuItem = AppServices.DataAccessService.GetMenuItem(menuItemId);

            if (menuItem.Portions.Count == 0)
            {
                return(null);
            }

            var portion = menuItem.Portions[0];

            if (!string.IsNullOrEmpty(portionName) && menuItem.Portions.Count(x => x.Name == portionName) > 0)
            {
                portion = menuItem.Portions.First(x => x.Name == portionName);
            }

            var departmentId = AppServices.CurrentTerminal.DepartmentId > 0
                                   ? AppServices.MainDataContext.SelectedDepartment.Id
                                   : Model.DepartmentId;

            var ti = Model.AddTicketItem(AppServices.CurrentLoggedInUser.Id, departmentId, menuItem, portion.Name, AppServices.MainDataContext.SelectedDepartment.PriceTag, defaultProperties);

            ti.Quantity = quantity > 9 ? decimal.Round(quantity / portion.Multiplier, LocalSettings.Decimals) : quantity;

            ti.Gifted = gift;
            var ticketItemViewModel = new TicketItemViewModel(ti);

            _items.Add(ticketItemViewModel);
            RecalculateTicket();
            RuleExecutor.NotifyEvent(RuleEventNames.TicketLineAdded, new
            {
                Ticket     = AppServices.MainDataContext.SelectedTicket,
                TicketItem = ti,
                TicketId   = AppServices.MainDataContext.SelectedTicket.Id,
                TicketTag  = AppServices.MainDataContext.SelectedTicket.Tag,
                Quantity   = quantity,
                Model.CustomerId,
                Model.CustomerName,
                Model.CustomerGroupCode,
                MenuItemName      = menuItem.Name,
                MenuItemGroupCode = menuItem.GroupCode
            });
            ticketItemViewModel.PublishEvent(EventTopicNames.TicketItemAdded);
            return(ticketItemViewModel);
        }
 public void UpdatePortion(MenuItemPortion portion, string priceTag)
 {
     _model.UpdatePortion(portion, priceTag, AppServices.MainDataContext.GetVatTemplate(portion.MenuItemId));
     RuleExecutor.NotifyEvent(RuleEventNames.PortionSelected,
                              new
     {
         Ticket       = AppServices.MainDataContext.SelectedTicket,
         TicketItem   = Model,
         TicketTag    = AppServices.MainDataContext.SelectedTicket.Tag,
         MenuItemName = _model.MenuItemName,
         PortionName  = portion.Name,
         PortionPrice = _model.Price
     });
     RaisePropertyChanged("Description");
     RaisePropertyChanged("TotalPrice");
 }
Exemple #12
0
 private static void OnCronTrigger(CronObject cronobject)
 {
     using (var workspace = WorkspaceFactory.Create())
     {
         var trigger = workspace.Single <Trigger>(x => x.Id == ((Trigger)cronobject.Object).Id);
         if (trigger != null)
         {
             trigger.LastTrigger = DateTime.Now;
             workspace.CommitChanges();
             if (AppServices.ActiveAppScreen != AppScreens.Dashboard)
             {
                 RuleExecutor.NotifyEvent(RuleEventNames.TriggerExecuted, new { TriggerName = trigger.Name });
             }
         }
         else
         {
             cronobject.Stop();
         }
     }
 }
Exemple #13
0
 public void CancelItems(IEnumerable <TicketItemViewModel> ticketItems, int userId)
 {
     VoidItems(ticketItems, 0, userId);
     foreach (var ticketItemViewModel in ticketItems)
     {
         var mi = AppServices.DataAccessService.GetMenuItem(ticketItemViewModel.Model.MenuItemId);
         RuleExecutor.NotifyEvent(RuleEventNames.TicketLineCancelled, new
         {
             Ticket     = AppServices.MainDataContext.SelectedTicket,
             TicketItem = ticketItemViewModel.Model,
             TicketTag  = AppServices.MainDataContext.SelectedTicket.Tag,
             ticketItemViewModel.Quantity,
             Model.CustomerId,
             Model.CustomerName,
             Model.CustomerGroupCode,
             ticketItemViewModel.Model.MenuItemName,
             MenuItemGroupCode = mi.GroupCode
         });
     }
 }
        public async Task <IActionResult> Index([FromBody] RuleModel request)
        {
            try
            {
                var sampleDefinition = new RuleDefinition()
                {
                    //EngineCode = "{if (Values[\"IsCallEvent\"].ToString() == \"true\" & ((long)Values[\"StatusId\"] == 8005 | (long)Values[\"StatusId\"] == 8010))    {        if ((long)Values[\"CallDuration\"] >= 127)            Values[\"StatusId\"] = (long)8015;    }}"
                    //EngineCode = "{    if (Values[\"IsCallEvent\"].ToBool() == true & (Values[\"StatusId\"].ToInt() == 8005 | Values[\"StatusId\"].ToInt() == 8010))    {        if (Values[\"CallDuration\"].ToNumber() >= 127)            Values[\"StatusId\"] = 8015;        else if (Values[\"CallDuration\"].ToNumber() < 127         )            Values[\"StatusId\"] = 8010;    }}"
                    EngineCode = "{    if (Values[\"IsCallEvent\"].ToBool() == true & Values[\"StatusId\"].ToInt().IsOneOf(8005, 8010))    {        if (Values[\"CallDuration\"].ToNumber() >= 127)            Values[\"StatusId\"] = 8015;        else if (Values[\"CallDuration\"].ToNumber() < 127         )            Values[\"StatusId\"] = 8010;    }}"
                };

                var executor = new RuleExecutor(sampleDefinition);
                var result   = await executor.ApplyAsync(request);

                return(Ok(result));
            }
            catch (Exception ex)
            {
                return(Ok());
            }
        }
Exemple #15
0
        public static void RecalculateTicket(Ticket ticket)
        {
            var total = ticket.TotalAmount;

            AppServices.MainDataContext.Recalculate(ticket);
            if (total != ticket.TotalAmount)
            {
                RuleExecutor.NotifyEvent(RuleEventNames.TicketTotalChanged,
                                         new
                {
                    Ticket        = ticket,
                    PreviousTotal = total,
                    TicketTotal   = ticket.GetSum(),
                    DiscountTotal = ticket.GetDiscountAndRoundingTotal(),
                    GiftTotal     = ticket.GetTotalGiftAmount(),
                    PaymentTotal  = ticket.GetPaymentAmount(),
                    ticket.CustomerName,
                    ticket.CustomerId,
                    ticket.CustomerGroupCode
                });
            }
        }
Exemple #16
0
        public static void AddPaymentToSelectedTicket(decimal amount, PaymentType paymentType)
        {
            var ticket = AppServices.MainDataContext.SelectedTicket;

            var departmentId = AppServices.CurrentTerminal.DepartmentId > 0
               ? AppServices.MainDataContext.SelectedDepartment.Id
               : ticket.DepartmentId;

            ticket.AddPayment(DateTime.Now, amount, paymentType, AppServices.CurrentLoggedInUser.Id, departmentId);
            string paymentName = Resources.Cash;

            if (paymentType == PaymentType.CreditCard)
            {
                paymentName = Resources.CreditCard;
            }
            if (paymentType == PaymentType.Ticket)
            {
                paymentName = Resources.Voucher;
            }

            RuleExecutor.NotifyEvent(RuleEventNames.PaymentReceived,
                                     new { Ticket = ticket, PaymentType = paymentName, Amount = amount, TicketTag = ticket.Tag, ticket.CustomerId, ticket.CustomerName, ticket.CustomerGroupCode, SelectedLinesCount = ticket.GetPaidItems().Count() });
        }
Exemple #17
0
        public async Task <HttpResponseMessage> RunAsync(HttpRequestMessage req, CancellationToken cancellationToken)
        {
            _log.LogDebug($"Context: {_context.InvocationId} {_context.FunctionName} {_context.FunctionDirectory} {_context.FunctionAppDirectory}");

            var ruleName          = _context.FunctionName;
            var aggregatorVersion = GetCustomAttribute <System.Reflection.AssemblyInformationalVersionAttribute>()?.InformationalVersion;

            _log.LogInformation($"Aggregator v{aggregatorVersion} executing rule '{ruleName}'");
            cancellationToken.ThrowIfCancellationRequested();

            // Get request body
            var eventData = await GetWebHookEvent(req);

            if (eventData == null)
            {
                return(req.CreateErrorResponse(HttpStatusCode.BadRequest, "Request body is empty"));
            }

            // sanity check
            if (!DevOpsEvents.IsValidEvent(eventData.EventType) ||
                eventData.PublisherId != DevOpsEvents.PublisherId)
            {
                return(req.CreateErrorResponse(HttpStatusCode.BadRequest, "Not a good Azure DevOps post..."));
            }

            var eventContext = CreateContextFromEvent(eventData);

            if (eventContext.IsTestEvent())
            {
                return(req.CreateTestEventResponse(aggregatorVersion, ruleName));
            }

            var configContext = GetConfigurationContext();
            var configuration = AggregatorConfiguration.ReadConfiguration(configContext)
                                .UpdateFromUrl(ruleName, req.RequestUri);

            var logger       = new ForwarderLogger(_log);
            var ruleProvider = new AzureFunctionRuleProvider(logger, _context.FunctionDirectory);
            var ruleExecutor = new RuleExecutor(logger, configuration);

            using (_log.BeginScope($"WorkItem #{eventContext.WorkItemPayload.WorkItem.Id}"))
            {
                try
                {
                    var rule = await ruleProvider.GetRule(ruleName);

                    var execResult = await ruleExecutor.ExecuteAsync(rule, eventContext, cancellationToken);

                    if (string.IsNullOrEmpty(execResult))
                    {
                        return(req.CreateResponse(HttpStatusCode.OK));
                    }
                    else
                    {
                        _log.LogInformation($"Returning '{execResult}' from '{rule.Name}'");
                        return(req.CreateResponse(HttpStatusCode.OK, execResult));
                    }
                }
                catch (Exception ex)
                {
                    _log.LogWarning($"Rule '{ruleName}' failed: {ex.Message}");
                    return(req.CreateErrorResponse(HttpStatusCode.NotImplemented, ex));
                }
            }
        }
Exemple #18
0
        protected override void InitializeShell()
        {
            LocalizeDictionary.ChangeLanguage(LocalSettings.CurrentLanguage);

            LocalSettings.SetTraceLogPath("app");
            InteractionService.UserIntraction = ServiceLocator.Current.GetInstance <IUserInteraction>();
            InteractionService.UserIntraction.ToggleSplashScreen();

            AppServices.MainDispatcher = Application.Current.Dispatcher;

            AppServices.MessagingService.RegisterMessageListener(new MessageListener());

            if (LocalSettings.StartMessagingClient)
            {
                AppServices.MessagingService.StartMessagingClient();
            }

            GenericRuleRegistator.RegisterOnce();

            PresentationServices.Initialize();

            base.InitializeShell();

            try
            {
                var creationService = new DataCreationService();
                creationService.CreateData();
            }
            catch (Exception e)
            {
                if (!string.IsNullOrEmpty(LocalSettings.ConnectionString))
                {
                    var connectionString =
                        InteractionService.UserIntraction.GetStringFromUser(
                            "Connection String",
                            Resources.DatabaseErrorMessage + e.Message,
                            LocalSettings.ConnectionString);

                    var cs = String.Join(" ", connectionString);

                    if (!string.IsNullOrEmpty(cs))
                    {
                        LocalSettings.ConnectionString = cs.Trim();
                    }

                    AppServices.LogError(e, Resources.CurrentErrorLoggedMessage);
                }
                else
                {
                    AppServices.LogError(e);
                    LocalSettings.ConnectionString = "";
                }
                LocalSettings.SaveSettings();
                Environment.Exit(1);
            }

            if (string.IsNullOrEmpty(LocalSettings.MajorCurrencyName))
            {
                LocalSettings.MajorCurrencyName    = Resources.Dollar;
                LocalSettings.MinorCurrencyName    = Resources.Cent;
                LocalSettings.PluralCurrencySuffix = Resources.PluralCurrencySuffix;
            }

            Application.Current.MainWindow = (Shell)Shell;
            Application.Current.MainWindow.Show();
            InteractionService.UserIntraction.ToggleSplashScreen();
            TriggerService.UpdateCronObjects();

            RuleExecutor.NotifyEvent(RuleEventNames.ApplicationStarted, new { CommandLineArguments = LocalSettings.StartupArguments });
        }
        public async Task <IActionResult> RunAsync(/*HttpRequest request, */ WebHookEvent eventData, CancellationToken cancellationToken)
        {
            _log.LogDebug($"Context: {_executionContext.InvocationId} {_executionContext.FunctionName} {_executionContext.FunctionDirectory} {_executionContext.FunctionAppDirectory}");

            var ruleName          = _executionContext.FunctionName;
            var aggregatorVersion = RequestHelper.AggregatorVersion;

            _log.LogInformation($"Aggregator v{aggregatorVersion} executing rule '{ruleName}'");
            cancellationToken.ThrowIfCancellationRequested();

            if (eventData == null)
            {
                return(BadRequest("Request body is empty"));
            }

            // sanity check
            if (!DevOpsEvents.IsValidEvent(eventData.EventType) ||
                eventData.PublisherId != DevOpsEvents.PublisherId)
            {
                _log.LogDebug("return BadRequest");
                return(BadRequest(new { Error = "Not a good Azure DevOps post..." }));
            }

            var helper       = new RequestHelper(_log);
            var eventContext = helper.CreateContextFromEvent(eventData);

            if (eventContext.IsTestEvent())
            {
                Response.AddCustomHeaders(aggregatorVersion, ruleName);
                return(RespondToTestEventMessage(aggregatorVersion, ruleName));
            }

            var configContext = GetConfigurationContext();
            var configuration = AggregatorConfiguration.ReadConfiguration(configContext)
                                .UpdateFromUrl(ruleName, GetRequestUri());

            var logger       = new ForwarderLogger(_log);
            var ruleProvider = new AzureFunctionRuleProvider(logger, _executionContext.FunctionDirectory);
            var ruleExecutor = new RuleExecutor(logger, configuration);

            using (_log.BeginScope($"WorkItem #{eventContext.WorkItemPayload.WorkItem.Id}"))
            {
                try
                {
                    var rule = await ruleProvider.GetRule(ruleName);

                    var execResult = await ruleExecutor.ExecuteAsync(rule, eventContext, cancellationToken);

                    if (string.IsNullOrEmpty(execResult))
                    {
                        return(Ok());
                    }
                    else
                    {
                        _log.LogInformation($"Returning '{execResult}' from '{rule.Name}'");
                        return(Ok(execResult));
                    }
                }
                catch (Exception ex)
                {
                    _log.LogWarning($"Rule '{ruleName}' failed: {ex.Message}");
                    return(BadRequest(ex.Message));
                }
            }
        }
Exemple #20
0
        public void ExecutingNonExistingRule()
        {
            var ruleExecuter = new RuleExecutor();

            Assert.AreEqual(ruleExecuter.Execute(string.Empty, string.Empty), string.Empty);
        }
Exemple #21
0
        public async Task <IActionResult> PostAsync(WebHookEvent eventData, string ruleName, CancellationToken cancellationToken)
        {
            var aggregatorVersion = RequestHelper.AggregatorVersion;

            _log.LogInformation($"Aggregator v{aggregatorVersion} executing rule '{ruleName}'");

            var webHookStartEvent = new EventTelemetry()
            {
                Name = "WebHookEvent Start"
            };

            webHookStartEvent.Properties["rule"]            = ruleName;
            webHookStartEvent.Properties["eventType"]       = eventData?.EventType;
            webHookStartEvent.Properties["resourceVersion"] = eventData?.ResourceVersion;
            Telemetry.TrackEvent(webHookStartEvent);

            if (eventData == null)
            {
                return(BadRequest("Request body is empty"));
            }

            // sanity check
            if (!DevOpsEvents.IsValidEvent(eventData.EventType) ||
                eventData.PublisherId != DevOpsEvents.PublisherId)
            {
                _log.LogDebug("return BadRequest");
                return(BadRequest(new { Error = "Not a good Azure DevOps post..." }));
            }

            var helper       = new RequestHelper(_log);
            var eventContext = helper.CreateContextFromEvent(eventData);

            if (eventContext.IsTestEvent())
            {
                Response.AddCustomHeaders(aggregatorVersion, ruleName);
                return(RespondToTestEventMessage(aggregatorVersion, ruleName));
            }

            var configContext = _configuration;
            var configuration = AggregatorConfiguration.ReadConfiguration(configContext)
                                .UpdateFromUrl(ruleName, GetRequestUri());

            var logger       = new ForwarderLogger(_log);
            var ruleProvider = new AspNetRuleProvider(logger, _configuration);
            var ruleExecutor = new RuleExecutor(logger, configuration);

            using (_log.BeginScope($"WorkItem #{eventContext.WorkItemPayload.WorkItem.Id}"))
            {
                try
                {
                    var rule = await ruleProvider.GetRule(ruleName);

                    var ruleStartEvent = new EventTelemetry()
                    {
                        Name = "Rule Exec Start"
                    };
                    ruleStartEvent.Properties["rule"] = rule.Name;
                    ruleStartEvent.Properties["ImpersonateExecution"] = rule.ImpersonateExecution.ToString();
                    ruleStartEvent.Properties["EnableRevisionCheck"]  = rule.Settings.EnableRevisionCheck.ToString();
                    ruleStartEvent.Properties["eventType"]            = eventContext.EventType;
                    Telemetry.TrackEvent(ruleStartEvent);
                    var ruleExecTimer = new Stopwatch();
                    ruleExecTimer.Start();

                    var execResult = await ruleExecutor.ExecuteAsync(rule, eventContext, cancellationToken);

                    ruleExecTimer.Stop();
                    var ruleEndEvent = new EventTelemetry()
                    {
                        Name = "Rule Exec End"
                    };
                    ruleEndEvent.Properties["rule"]  = ruleName;
                    ruleEndEvent.Metrics["duration"] = ruleExecTimer.ElapsedMilliseconds;
                    Telemetry.TrackEvent(ruleEndEvent);

                    if (string.IsNullOrEmpty(execResult))
                    {
                        return(Ok());
                    }
                    else
                    {
                        _log.LogInformation($"Returning '{execResult}' from '{rule.Name}'");
                        return(Ok(execResult));
                    }
                }
                catch (Exception ex)
                {
                    _log.LogWarning($"Rule '{ruleName}' failed: {ex.Message}");
                    Telemetry.TrackException(ex);
                    return(BadRequest(ex.Message));
                }
            }
        }
Exemple #22
0
 public static void CreateNewTicket()
 {
     AppServices.MainDataContext.CreateNewTicket();
     RuleExecutor.NotifyEvent(RuleEventNames.TicketCreated, new { Ticket = AppServices.MainDataContext.SelectedTicket });
 }