Exemple #1
0
        /// <summary>
        /// This method will check to confirm that an update is required for this change message
        /// </summary>
        /// <param name="providerAndSubscriberOptInLookup">List of providers opted in to AIG</param>
        /// <param name="baseChangeMessage">Base change message to check</param>
        /// <returns>True if successful otherwise False</returns>
        private static bool IsChangeMessageRequiredUpdate(ProviderSubscriberOptInsLookup providerAndSubscriberOptInLookup, BaseChangeMessage baseChangeMessage)
        {
            if (providerAndSubscriberOptInLookup.ContainsProvider(baseChangeMessage.ProviderId))
            {
                var subscriberByOptinList = providerAndSubscriberOptInLookup.GetSubscribersByProviderId(baseChangeMessage.ProviderId);

                if (subscriberByOptinList == null)
                {
                    return false;
                }
                    
                //updates involving a businessaccount being activated/deactivated will not contain a distributor id
                if (baseChangeMessage.SubscriberId == Guid.Empty)
                {
                    return true;
                }

                if (subscriberByOptinList.ContainsSubscriber(baseChangeMessage.SubscriberId))
                {
                    return true;
                }
            }

            return false;
        }
        /// <summary>
        /// Process the change for a provider
        /// </summary>
        /// <param name="queueItem">queue item with push provider payload to process</param>
        /// <param name="providerSubscriberOptInLookup">for loading and reloading</param>
        /// <returns>true if successful</returns>
        public bool ProcessChange(IQueueItem queueItem, ref ProviderSubscriberOptInsLookup providerSubscriberOptInLookup)
        {
            var providerChange = XmlSerialization.XmlDeserializeFromString<PushProviderUpdate>(queueItem.Payload);
            var providerId = providerChange.BusinessId.ToGuid();
            var reloadOptinsBefore = false;
            var reloadOptinsAfter = false;
            ProviderChangeType providerChangeType;
            Enum.TryParse(providerChange.Action, out providerChangeType);

            ProviderChangeMessage providerChangeMessage = null;

            switch (providerChangeType)
            {
                case ProviderChangeType.ChannelOptIn:
                    reloadOptinsBefore = true;
                    //if the provider is opting into expedia then create a insert message
                    providerChangeMessage = ProviderChangeMessage.CreateProviderInsertMessage(providerId, providerChange.ChannelGuid);
                    break;
                case ProviderChangeType.ChannelOptOut:
                    reloadOptinsAfter = true;
                    //if the provider is opting out of expedia then create a remove message
                    providerChangeMessage = ProviderChangeMessage.CreateProviderRemoveMessage(providerId, providerChange.ChannelGuid);
                    break;
                case ProviderChangeType.StatusChange:
                    if (providerChange.IsOptinActive)
                    {
                        //if optin flag is true and the provider is actively opted into expedia then create a full update message otherwise an insert message
                        if (providerSubscriberOptInLookup.ContainsProvider(providerId))
                        {
                            providerChangeMessage = ProviderChangeMessage.CreateProviderFullUpdateMessage(providerId);
                        }
                        else
                        {
                            reloadOptinsBefore = true;
                            providerChangeMessage = ProviderChangeMessage.CreateProviderInsertMessage(providerId, providerChange.ChannelGuid);
                        }
                    }
                    else
                    {
                        //create a delete message if status has changed and optin flag is false
                        providerChangeMessage = ProviderChangeMessage.CreateProviderDeleteMessage(providerId);
                        reloadOptinsAfter = true;
                    }
                    break;
                case ProviderChangeType.AvailabilityReset:
                    {
                        if (providerChange.IsOptinActive)
                        {
                            providerChangeMessage = ProviderChangeMessage.CreateProviderAvailabilityResetUpdateMessage(providerId, providerChange.ChannelGuid);
                        }
                        break;
                    }
                case ProviderChangeType.ProviderReset:
                    {
                        if (providerChange.IsOptinActive)
                        {
                            providerChangeMessage = ProviderChangeMessage.CreateProviderResetUpdateMessage(providerId, providerChange.ChannelGuid);
                        }
                        break;
                    }
                case ProviderChangeType.AttributeChange:
                    {
                        providerChangeMessage = ProviderChangeMessage.CreateProviderAttributeUpdateMessage(providerId, Guid.Empty);
                        break;
                    }
                default:
                    return false;
            }

            //we need to do this before for new optins so the provider/subscriber is in the list otherwise the message wont be processed
            if (reloadOptinsBefore)
            {
                providerSubscriberOptInLookup = providerSubscriberOptInService.Load();
            }

            //send the provider change message to the queue

            if (providerChangeMessage == null)
            {
                return false;
            }

            bool isSuccess = true;

            foreach (var messagingIntegratorService in CreateServices(providerChangeMessage))
            {
                isSuccess &= messagingIntegratorService.ProcessAndQueueChangeUpdates(providerSubscriberOptInLookup, providerChangeMessage);
            }

            //we need to do this after so the provider/subscriber is only removed once the message has been sent
            if (reloadOptinsAfter)
            {
                providerSubscriberOptInLookup = providerSubscriberOptInService.Load();
            }

              return isSuccess;
        }