示例#1
0
        internal static async Task FlushLogs(List <MessagePayload> messagePayloads)
        {
            try
            {
                List <LogEvent> logEvents = new List <LogEvent>();
                messagePayloads.ForEach(x => logEvents.AddRange(x.LogEvents.Where(y => IsLogInsertible(y.LogMessage))));
                if (logEvents.Count > 0)
                {
                    await Resources.GetInstance().LogEventCollection.InsertManyAsync(logEvents);
                }

                var filterBuilder = Builders <LogEvent> .Filter;
                var updateBuilder = Builders <LogEvent> .Update;
                var writeBuilder  = new List <WriteModel <LogEvent> >();
                foreach (MessagePayload messagePayload in messagePayloads)
                {
                    if (messagePayload.InvitationLogEvents.Count > 0)
                    {
                        var filter = filterBuilder.Eq(x => x.Id, messagePayload.Invitation.Id);
                        var update = updateBuilder.PushEach(x => x.Events, messagePayload.InvitationLogEvents).Set(x => x.Updated, DateTime.UtcNow);
                        writeBuilder.Add(new UpdateOneModel <LogEvent>(filter, update));
                    }
                }
                if (writeBuilder.Count > 0)
                {
                    await Resources.GetInstance().LogEventCollection.BulkWriteAsync(writeBuilder);
                }
            }
            catch (Exception ex)
            {
                await FlushLogs(new List <LogEvent> {
                    CreateLogEvent(null, IRDLM.InternalException(ex))
                });
            }
        }
示例#2
0
 internal static async Task DeleteBulkMessagePayloads(List <DB_MessagePayload> dB_MessagePayloads)
 {
     try
     {
         List <string> docIds = dB_MessagePayloads.Select(x => x.Id).ToList();
         await Resources.GetInstance().BulkMessagePayloadCollection.DeleteManyAsync(x => docIds.Contains(x.Id));
     }
     catch (Exception ex)
     {
         await FlushLogs(new List <LogEvent> {
             CreateLogEvent(null, IRDLM.InternalException(ex))
         });
     }
 }
示例#3
0
 internal static async Task InsertBulkMessagePayload(MessagePayload messagePayload)
 {
     try
     {
         DB_MessagePayload dB_MessagePayload = new DB_MessagePayload(messagePayload);
         await Resources.GetInstance().BulkMessagePayloadCollection.InsertOneAsync(dB_MessagePayload);
     }
     catch (Exception ex)
     {
         await FlushLogs(new List <LogEvent> {
             CreateLogEvent(null, IRDLM.InternalException(ex))
         });
     }
 }
        internal void ConfigureVendor()
        {
            DispatchChannel dispatchChannel = Resources.GetInstance().AccountConfiguration.DispatchChannels?.Find(x => x.DispatchId == QueueData.DispatchId);

            if (dispatchChannel == default)
            {
                IsVendorConfigured = false;
                LogEvents.Add(Utils.CreateLogEvent(QueueData, IRDLM.DispatchChannelNotFound));
                InvitationLogEvents.Add(Utils.CreateInvitationLogEvent(EventAction.DispatchUnsuccessful,
                                                                       IsEmailDelivery.Value ? EventChannel.Email : EventChannel.SMS, QueueData, IRDLM.DispatchChannelNotFound));
            }
            else
            {
                string vendorName = null;
                if (IsEmailDelivery.Value)
                {
                    vendorName = dispatchChannel?.ChannelDetails?.Email?.IsValid ?? false ? dispatchChannel.ChannelDetails.Email.Vendorname : null;
                }
                else
                {
                    vendorName = dispatchChannel?.ChannelDetails?.Sms?.IsValid ?? false ? dispatchChannel.ChannelDetails.Sms.Vendorname : null;
                }
                if (vendorName == null)
                {
                    IsVendorConfigured = false;
                    LogEvents.Add(Utils.CreateLogEvent(QueueData, IRDLM.DispatchVendorNameMissing));
                    InvitationLogEvents.Add(Utils.CreateInvitationLogEvent(EventAction.DispatchUnsuccessful,
                                                                           IsEmailDelivery.Value ? EventChannel.Email : EventChannel.SMS, QueueData, IRDLM.DispatchVendorNameMissing));
                }
                else
                {
                    LogEvents.Add(Utils.CreateLogEvent(QueueData, IRDLM.DispatchVendorNamePresent(vendorName)));
                    Vendor = Resources.GetInstance().AccountConfiguration.Vendors?.Find(x => string.Equals(x.VendorName, vendorName, StringComparison.InvariantCultureIgnoreCase));
                    if (Vendor == null)
                    {
                        IsVendorConfigured = false;
                        LogEvents.Add(Utils.CreateLogEvent(QueueData, IRDLM.DispatchVendorConfigMissing));
                        InvitationLogEvents.Add(Utils.CreateInvitationLogEvent(EventAction.DispatchUnsuccessful,
                                                                               IsEmailDelivery.Value ? EventChannel.Email : EventChannel.SMS, QueueData, IRDLM.DispatchVendorConfigMissing));
                    }
                    else
                    {
                        IsVendorConfigured = true;
                        LogEvents.Add(Utils.CreateLogEvent(QueueData, IRDLM.DispatchVendorConfigPresent(Vendor)));
                    }
                }
            }
        }
        internal async Task ConfigureUserData()
        {
            Invitation = await Resources.GetInstance().LogEventCollection.Find(x => x.TokenId == QueueData.TokenId &&
                                                                               x.BatchId == QueueData.BatchId && x.DispatchId == QueueData.DispatchId).FirstOrDefaultAsync();

            if (Invitation == default)
            {
                IsUserDataLogEventConfigured = false;
                LogEvents.Add(Utils.CreateLogEvent(QueueData, IRDLM.UserDataNotFound));
            }
            else
            {
                IsUserDataLogEventConfigured = true;
                LogEvents.Add(Utils.CreateLogEvent(QueueData, IRDLM.UserDataFound(Invitation.Id)));
            }
        }
        internal void Validate()
        {
            bool isTokenIdPresent    = !string.IsNullOrWhiteSpace(QueueData.TokenId);
            bool isBatchIdPresent    = !string.IsNullOrWhiteSpace(QueueData.BatchId);
            bool isDispatchIdPresent = !string.IsNullOrWhiteSpace(QueueData.DispatchId);

            if (isTokenIdPresent && isBatchIdPresent && isDispatchIdPresent)
            {
                IsProcessable = true;
                LogEvents.Add(Utils.CreateLogEvent(QueueData, IRDLM.Validated(QueueData.AdditionalURLParameter)));
            }
            else
            {
                IsProcessable = false;
                LogEvents.Add(Utils.CreateLogEvent(QueueData, IRDLM.Invalidated));
            }
        }
示例#7
0
        internal static async Task UpdateBulkMessagePayloads(List <DB_MessagePayload> dB_MessagePayloads)
        {
            try
            {
                List <string> docIds = dB_MessagePayloads.Select(x => x.Id).ToList();
                var           filter = Builders <DB_MessagePayload> .Filter.In(x => x.Id, docIds);

                var update = Builders <DB_MessagePayload> .Update.Set(x => x.Status, "Processing");

                await Resources.GetInstance().BulkMessagePayloadCollection.UpdateManyAsync(filter, update);
            }
            catch (Exception ex)
            {
                await FlushLogs(new List <LogEvent> {
                    CreateLogEvent(null, IRDLM.InternalException(ex))
                });
            }
        }
示例#8
0
        internal static async Task <List <DB_MessagePayload> > ReadBulkMessagePayloads()
        {
            try
            {
                return(await Resources.GetInstance().BulkMessagePayloadCollection
                       .Find(x => x.BulkVendorName == Resources.GetInstance().BulkVendorName.ToLower() && x.Status == "Ready")
                       .Limit(Resources.GetInstance().BulkReadSize)
                       .ToListAsync());
            }
            catch (Exception ex)
            {
                await FlushLogs(new List <LogEvent> {
                    CreateLogEvent(null, IRDLM.InternalException(ex))
                });

                return(new List <DB_MessagePayload>());
            }
        }
示例#9
0
 public static Resources CreateSingleton(string mongoDbConnectionString,
                                         string databaseName,
                                         int logLevel = 5,
                                         Dictionary <string, Func <IDispatchVendor> > additionalDispatchCreatorStrategies = default,
                                         string bulkVendorName   = "sparkpost",
                                         int bulkReadSize        = 10000,
                                         string surveyBaseDomain = "nps.bz",
                                         string unsubscribeUrl   = "https://cx.getcloudcherry.com/l/unsub/?token=")
 {
     try
     {
         _instance = new Resources(mongoDbConnectionString, databaseName, logLevel, additionalDispatchCreatorStrategies,
                                   bulkVendorName, bulkReadSize, surveyBaseDomain, unsubscribeUrl);
     }
     catch (Exception ex)
     {
         Console.WriteLine(ex.ToString());
         Utils.FlushLogs(new List <LogEvent> {
             Utils.CreateLogEvent(null, IRDLM.InternalException(ex))
         }).GetAwaiter().GetResult();
         throw ex;
     }
     return(_instance);
 }
示例#10
0
        /// <summary>
        /// Performs Hash-Look-Ups for PII Data if the received
        /// QueueData-Object's Subject/Text-Body/Html-Body
        /// utilizes WXM Tag-Substitution.
        /// </summary>
        /// <param name="queueData"></param>
        public static void PerformLookUps(QueueData queueData)
        {
            try
            {
                string matchString = @"\$(\w+)\*\|(.*?)\|\*";

                //Subject
                if (!string.IsNullOrWhiteSpace(queueData.Subject))
                {
                    StringBuilder newSubject = new StringBuilder(queueData.Subject);
                    foreach (Match m in Regex.Matches(queueData.Subject, matchString, RegexOptions.Multiline))
                    {
                        string qid          = m.Groups[1].Value;
                        string defaultValue = m.Groups[2].Value;
                        if (queueData.MappedValue.ContainsKey(qid))
                        {
                            newSubject.Replace(m.Groups[0].Value, queueData.MappedValue[qid]);
                        }
                        else
                        {
                            newSubject.Replace(m.Groups[0].Value, defaultValue);
                        }
                    }
                    queueData.Subject = newSubject.ToString();
                }

                //HTML Body
                if (!string.IsNullOrWhiteSpace(queueData.HTMLBody))
                {
                    StringBuilder newHtmlBody = new StringBuilder(queueData.HTMLBody);
                    foreach (Match m in Regex.Matches(queueData.HTMLBody, matchString, RegexOptions.Multiline))
                    {
                        string qid          = m.Groups[1].Value;
                        string defaultValue = m.Groups[2].Value;
                        if (queueData.MappedValue.ContainsKey(qid))
                        {
                            newHtmlBody.Replace(m.Groups[0].Value, queueData.MappedValue[qid]);
                        }
                        else
                        {
                            newHtmlBody.Replace(m.Groups[0].Value, defaultValue);
                        }
                    }
                    queueData.HTMLBody = newHtmlBody.ToString();
                }

                //Text Body
                if (!string.IsNullOrWhiteSpace(queueData.TextBody))
                {
                    StringBuilder newTextBody = new StringBuilder(queueData.TextBody);
                    foreach (Match m in Regex.Matches(queueData.TextBody, matchString, RegexOptions.Multiline))
                    {
                        string qid          = m.Groups[1].Value;
                        string defaultValue = m.Groups[2].Value;
                        if (queueData.MappedValue.ContainsKey(qid))
                        {
                            newTextBody.Replace(m.Groups[0].Value, queueData.MappedValue[qid]);
                        }
                        else
                        {
                            newTextBody.Replace(m.Groups[0].Value, defaultValue);
                        }
                    }
                    queueData.TextBody = newTextBody.ToString();
                }
            }
            catch (Exception ex)
            {
                FlushLogs(new List <LogEvent> {
                    CreateLogEvent(null, IRDLM.InternalException(ex))
                }).GetAwaiter().GetResult();
            }
        }
示例#11
0
        public async Task ProcessSingleMessage(QueueData queueData)
        {
            MessagePayload messagePayload = new MessagePayload(queueData);

            try
            {
                messagePayload.Validate();
                if (!messagePayload.IsProcessable)
                {
                    return;
                }

                messagePayload.ConfigureChannel();
                if (messagePayload.IsEmailDelivery == null)
                {
                    return;
                }

                await messagePayload.ConfigureUserData();

                if (!messagePayload.IsUserDataLogEventConfigured)
                {
                    return;
                }

                try
                {
                    messagePayload.PrepareForHashLookUps();

                    messagePayload.ConfigureVendor();
                    if (!messagePayload.IsVendorConfigured)
                    {
                        return;
                    }

                    messagePayload.ConfigureVendorFlag();
                    if (messagePayload.Vendor.IsBulkVendor)
                    {
                        await Utils.InsertBulkMessagePayload(messagePayload);

                        return;
                    }

                    SingleDispatch singleDispatch = new SingleDispatch();
                    singleDispatch = new SingleDispatch {
                        MessagePayload = messagePayload
                    };
                    singleDispatch.ConfigureDispatchVendor();
                    if (!singleDispatch.IsDispatcConfigured)
                    {
                        return;
                    }
                    await singleDispatch.DispatchReadyVendor.RunAsync(singleDispatch.MessagePayload);
                }
                catch (Exception ex)
                {
                    messagePayload.LogEvents.Add(Utils.CreateLogEvent(messagePayload.QueueData, IRDLM.InternalException(ex)));
                    messagePayload.InvitationLogEvents.Add(Utils.CreateInvitationLogEvent(EventAction.DispatchUnsuccessful,
                                                                                          messagePayload.IsEmailDelivery.Value ? EventChannel.Email : EventChannel.SMS, messagePayload.QueueData, IRDLM.InternalException(ex)));
                }
            }
            catch (Exception ex)
            {
                messagePayload.LogEvents.Add(Utils.CreateLogEvent(queueData, IRDLM.InternalException(ex)));
            }
            finally
            {
                await Utils.FlushLogs(new List <MessagePayload> {
                    messagePayload
                });
            }
        }
示例#12
0
        public async Task ProcessMultipleMessage(bool isLate)
        {
            List <LogEvent> logEvents = new List <LogEvent>();

            logEvents.Add(Utils.CreateLogEvent(null, IRDLM.TimeTriggerStart));
            if (isLate)
            {
                logEvents.Add(Utils.CreateLogEvent(null, IRDLM.TimeTriggerRunningLate));
            }
            List <MessagePayload>    messagePayloads    = new List <MessagePayload>();
            List <DB_MessagePayload> dB_MessagePayloads = await Utils.ReadBulkMessagePayloads();

            if (dB_MessagePayloads.Count > 0)
            {
                try
                {
                    await Utils.UpdateBulkMessagePayloads(dB_MessagePayloads);

                    Dictionary <string, List <MessagePayload> > ListOfMessagePayloadsByTemplateId = new Dictionary <string, List <MessagePayload> >();
                    foreach (DB_MessagePayload dB_MessagePayload in dB_MessagePayloads)
                    {
                        MessagePayload messagePayload = JsonConvert.DeserializeObject <MessagePayload>(dB_MessagePayload.MessagePayload);
                        messagePayloads.Add(messagePayload);
                        messagePayload.LogEvents.Add(Utils.CreateLogEvent(messagePayload.QueueData, IRDLM.ReadFromDB));
                        if (!ListOfMessagePayloadsByTemplateId.ContainsKey(messagePayload.QueueData.TemplateId))
                        {
                            ListOfMessagePayloadsByTemplateId.Add(messagePayload.QueueData.TemplateId, new List <MessagePayload>());
                        }
                        ListOfMessagePayloadsByTemplateId[messagePayload.QueueData.TemplateId].Add(messagePayload);
                    }
                    foreach (KeyValuePair <string, List <MessagePayload> > messagePayloadsByTemplateId in ListOfMessagePayloadsByTemplateId)
                    {
                        BulkDispatch bulkDispatch = null;
                        try
                        {
                            bulkDispatch = new BulkDispatch {
                                MessagePayloads = messagePayloadsByTemplateId.Value
                            };
                            bulkDispatch.ConfigureDispatchVendor();
                            if (!bulkDispatch.IsDispatchConfigured)
                            {
                                continue;
                            }
                            await bulkDispatch.DispatchReadyVendor.RunAsync(bulkDispatch.MessagePayloads);
                        }
                        catch (Exception ex)
                        {
                            bulkDispatch.MessagePayloads.ForEach(x => x.LogEvents.Add(Utils.CreateLogEvent(x.QueueData, IRDLM.InternalException(ex))));
                            bulkDispatch.MessagePayloads.ForEach(x => x.InvitationLogEvents.Add(Utils.CreateInvitationLogEvent(EventAction.DispatchUnsuccessful,
                                                                                                                               x.IsEmailDelivery.Value ? EventChannel.Email : EventChannel.SMS, x.QueueData, IRDLM.InternalException(ex))));
                        }
                    }
                }
                catch (Exception ex)
                {
                    logEvents.Add(Utils.CreateLogEvent(null, IRDLM.InternalException(ex)));
                }
                finally
                {
                    await Utils.DeleteBulkMessagePayloads(dB_MessagePayloads);

                    await Utils.FlushLogs(messagePayloads);
                }
            }
            logEvents.Add(Utils.CreateLogEvent(null, IRDLM.TimeTriggerEnd(dB_MessagePayloads.Count)));
            await Utils.FlushLogs(logEvents);
        }
示例#13
0
        public void ConfigureDispatchVendor()
        {
            Vendor vendor = MessagePayloads.ElementAt(0).Vendor;
            bool   isDispatchVendorStrategyPresent = Resources.GetInstance().DispatchReadyVendor_CreationStrategies
                                                     .Any(x => vendor.VendorName.StartsWith(x.Key, StringComparison.InvariantCultureIgnoreCase));

            if (isDispatchVendorStrategyPresent == false)
            {
                IsDispatchConfigured = false;
                MessagePayloads.ForEach(x => x.LogEvents.Add(Utils.CreateLogEvent(x.QueueData, IRDLM.DispatchVendorImplementationMissing)));
                MessagePayloads.ForEach(x => x.InvitationLogEvents.Add(Utils.CreateInvitationLogEvent(EventAction.DispatchUnsuccessful,
                                                                                                      x.IsEmailDelivery.Value ? EventChannel.Email : EventChannel.SMS, x.QueueData, IRDLM.DispatchVendorImplementationMissing)));
            }
            else
            {
                DispatchReadyVendor = (IBulkDispatchVendor)Resources.GetInstance().DispatchReadyVendor_CreationStrategies
                                      .First(x => vendor.VendorName.StartsWith(x.Key, StringComparison.InvariantCultureIgnoreCase)).Value();
                vendor.VendorDetails = vendor.VendorDetails.ToDictionary(x => x.Key, x => x.Value, StringComparer.InvariantCultureIgnoreCase);
                DispatchReadyVendor.Setup(vendor);
                IsDispatchConfigured = true;
                MessagePayloads.ForEach(x => x.LogEvents.Add(Utils.CreateLogEvent(x.QueueData, IRDLM.DispatchVendorImplemenatationPresent(vendor))));
            }
        }