/// <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; }