public IHttpActionResult Get(int id)
        {
            var crate = _manifest.GetById(id);

            if (crate != null)
            {
                return(Ok(_crateManager.ToDto(crate)));
            }
            return(Ok());
        }
        public Task <string> SendEventOrIncidentReport(string terminalName, string eventType)
        {
            if (eventsDisabled)
            {
                return(Task.FromResult(string.Empty));
            }
            //SF DEBUG -- Skip this event call for local testing
            //return;
            //make Post call
            var restClient       = PrepareRestClient();
            var loggingDataCrate = _loggingDataCrateFactory.Create(new LoggingDataCM
            {
                ObjectId          = terminalName,
                Data              = "service_start_up",
                PrimaryCategory   = "Operations",
                SecondaryCategory = "System Startup",
                Activity          = "system startup"
            });

            //TODO inpect this
            //I am not sure what to supply for parameters eventName and palletId, so i passed terminalName and eventType
            return(restClient.PostAsync(new Uri(eventWebServerUrl, UriKind.Absolute),
                                        _crateManager.ToDto(_eventReportCrateFactory.Create(eventType, terminalName, loggingDataCrate))));
        }
Exemplo n.º 3
0
        public async Task ProcessInboundEvents(Crate curCrateStandardEventReport)
        {
            var inboundEvent = curCrateStandardEventReport.Get <EventReportCM>();

            if (string.IsNullOrWhiteSpace(inboundEvent.ExternalDomainId) && string.IsNullOrWhiteSpace(inboundEvent.ExternalAccountId))
            {
                Logger.GetLogger().Error($"External event has no information about external account or external domain. Processing is cancelled. Event names - {inboundEvent.EventNames}, " +
                                         $"manufacturer - {inboundEvent.Manufacturer} ");
                return;
            }

            var systemUser = _fr8Account.GetSystemUser();

            if (systemUser == null)
            {
                throw new ApplicationException("System User Account is Missing");
            }
            string systemUserEmail = systemUser.UserName;

            using (var uow = ObjectFactory.GetInstance <IUnitOfWork>())
            {
                Logger.GetLogger().Info($"Received external event for account '{inboundEvent.ExternalAccountId}'");
                if (inboundEvent.ExternalAccountId == systemUserEmail)
                {
                    try
                    {
                        var eventCm = curCrateStandardEventReport.Get <EventReportCM>();

                        EventRouter currentRouter = GetEventRouter(eventCm);

                        var errorMsgList = new List <string>();
                        foreach (var crate in eventCm.EventPayload)
                        {
                            if (crate.ManifestType.Id != (int)Fr8.Infrastructure.Data.Constants.MT.LoggingData)
                            {
                                errorMsgList.Add("Don't know how to process an EventReport with the Contents: " + _crateManager.ToDto(crate));
                                continue;
                            }

                            var loggingData = crate.Get <LoggingDataCM>();
                            currentRouter(loggingData);
                        }

                        if (errorMsgList.Count > 0)
                        {
                            throw new InvalidOperationException(String.Join(";;;", errorMsgList));
                        }
                    }
                    catch (Exception ex)
                    {
                        EventManager.UnexpectedError(ex);
                    }
                }
                else
                {
                    //Find the corresponding Fr8 accounts
                    var authTokens = uow.AuthorizationTokenRepository.GetPublicDataQuery();
                    if (!string.IsNullOrWhiteSpace(inboundEvent.ExternalDomainId))
                    {
                        authTokens = authTokens.Where(x => x.ExternalDomainId == inboundEvent.ExternalDomainId);
                    }
                    //If external account Id doesn't exist it means that event is domain-wide i.e. it relates to all accounts that belong to specified domain
                    if (!string.IsNullOrWhiteSpace(inboundEvent.ExternalAccountId))
                    {
                        authTokens = authTokens.Where(x => x.ExternalAccountId == inboundEvent.ExternalAccountId);
                    }
                    //Checking both domain and account is additional way to protect from running plans not related to the event as account Id is often an email and can be the same across
                    //multiple terminals
                    var planOwnerIds = authTokens.Select(x => x.UserID).Distinct().ToArray();
                    Logger.GetLogger().Info($"External event for domain '{inboundEvent.ExternalDomainId}' and account '{inboundEvent.ExternalAccountId}' relates to {planOwnerIds.Length} user(s)");
                    if (string.IsNullOrEmpty(inboundEvent.ExternalDomainId) && planOwnerIds.Length > 1)
                    {
                        Logger.GetLogger().Warn($"Multiple users are identified as owners of plans related to external domain '{inboundEvent.ExternalDomainId}' and account '{inboundEvent.ExternalAccountId}'");
                    }
                    foreach (var planOwnerId in planOwnerIds)
                    {
                        try
                        {
                            FindAndExecuteAccountPlans(uow, inboundEvent, curCrateStandardEventReport, planOwnerId);
                        }
                        catch (Exception ex)
                        {
                            EventManager.UnexpectedError(ex);
                        }
                    }
                }
            }
        }