public string ExecuteMail(EmailMessageInfo objMailModel, List <CargoRatesModel> objCRList)
        {
            string result = "Error on Sending Mail!";

            try
            {
                var    htmlData         = getDataFromHtml(objCRList, objMailModel);
                string Key              = ConfigurationManager.AppSettings["SendGridApiKey"];
                var    apiKey           = Environment.GetEnvironmentVariable(Key);
                var    client           = new SendGridClient(Key);
                var    from             = new EmailAddress(objMailModel.FromEmailAddress, objMailModel.FromName);
                var    subject          = objMailModel.EmailSubject;
                var    to               = new EmailAddress(objMailModel.ToEmailAddress, objMailModel.ToName);
                var    plainTextContent = "";
                var    htmlContent      = htmlData;
                var    msg              = MailHelper.CreateSingleEmail(from, to, subject, plainTextContent, htmlContent);
                var    response         = client.SendEmailAsync(msg);

                InsertQuotationData(objMailModel, objCRList);

                result = "Mail Sent Successfully!";
            }
            catch (Exception ex)
            {
                ErrorHandlerClass.LogError(ex);
            }
            return(result);
        }
示例#2
0
        public async Task Parse(EmailMessageInfo messageInfo)
        {
            _log.Debug($"Processing {messageInfo.EmailMetadata.OriginalUri}.");
            Stopwatch             stopwatch   = Stopwatch.StartNew();
            List <AttachmentInfo> attachments = _mimeMessageFactory
                                                .Create(messageInfo.EmailStream)
                                                .BodyParts.OfType <MimePart>()
                                                .Select(_attachmentStreamNormaliser.Normalise)
                                                .Where(_ => !_.Equals(AttachmentInfo.EmptyAttachmentInfo))
                                                .ToList();

            if (attachments.Count == 0)
            {
                _log.Warn($"Didnt find any aggregate report attachments for {messageInfo.EmailMetadata.OriginalUri}.");
            }
            else
            {
                _log.Debug($"Found {attachments.Count} aggregate report attachment(s) for {messageInfo.EmailMetadata.OriginalUri}.");
            }
            _log.Debug($"Aggregate report attachment processing took {stopwatch.Elapsed}");
            stopwatch.Reset();

            stopwatch.Start();
            List <AggregateReportInfo> aggregateReports = attachments
                                                          .Select(_ => _aggregateReportDeserialiser.Deserialise(_, messageInfo.EmailMetadata))
                                                          .ToList();

            _log.Debug($"Deserialising aggregate reports took {stopwatch.Elapsed}");
            stopwatch.Stop();

            await Task.WhenAll(aggregateReports.Select(_ => _aggregateReportDao.Add(_aggregateReportToEntityConverter.ConvertToEntity(_))));

            attachments.ForEach(_ => _.Dispose());
        }
示例#3
0
        private async Task Process(FileInfo fileInfo)
        {
            _logger.LogDebug(
                $"Processing file {fileInfo.FullName}.");

            try
            {
                EmailMessageInfo emailMessageInfo = CreateEmailMessageInfo(fileInfo);

                _logger.LogDebug(
                    $"Successfully retrieved report in file {fileInfo.FullName}.");

                AggregateReportInfo aggregateReportInfo = _parser.Parse(emailMessageInfo);
                emailMessageInfo.EmailStream.Dispose();

                _logger.LogDebug(
                    $"Successfully parsed report in file {fileInfo.FullName}.");

                await _persistor.Persist(aggregateReportInfo);

                _logger.LogDebug(
                    $"Successfully persisted report in file {fileInfo.FullName}.");

                aggregateReportInfo.AttachmentInfo.AttachmentStream.Dispose();
            }
            catch (Exception e)
            {
                Console.WriteLine($"Failed to process {fileInfo.Name} with error: {e.Message}{Environment.NewLine}{e.StackTrace}");
            }
        }
        public async Task <Response> Send(EmailMessageInfo messageInfo)
        {
            // Prepare the SendGrid email message
            var sendgridMessage = new SendGridMessage
            {
                From        = new EmailAddress(messageInfo.FromEmailAddress),
                Subject     = messageInfo.EmailSubject,
                HtmlContent = messageInfo.EmailBody
            };

            // Add the "To" email address to the message
            sendgridMessage.AddTo(new EmailAddress(messageInfo.ToEmailAddress));

            // Check if any Cc email address was specified
            if (!string.IsNullOrWhiteSpace(messageInfo.CcEmailAddress))
            {
                // Add the email address for Cc to the message
                sendgridMessage.AddCc(new EmailAddress(messageInfo.CcEmailAddress));
            }

            // Check if any Bcc email address was specified
            if (!string.IsNullOrWhiteSpace(messageInfo.BccEmailAddress))
            {
                // Add the email address for Bcc to the message
                sendgridMessage.AddBcc(new EmailAddress(messageInfo.BccEmailAddress));
            }

            // Send the message to SendGrid, and save the API response
            var response = await _client.SendEmailAsync(sendgridMessage);

            // Return the SendGrid response
            return(response);
        }
        public async Task <Result <TDomain> > ProcessEmailMessage(EmailMessageInfo messageInfo)
        {
            Result <TDomain> result = await _processor.ProcessEmailMessage(messageInfo);

            try
            {
                if (result.Success)
                {
                    if (!result.Duplicate)
                    {
                        foreach (var publisher in _publishers)
                        {
                            await publisher.Publish(result.Report);
                        }
                    }
                    else
                    {
                        _log.Info($"Didnt publish aggregate aggregateReportInfo events for duplicate message, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId}");
                    }
                }
            }
            catch (Exception e)
            {
                _log.Error($"Failed to publish aggregate aggregateReportInfo events, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId} with error {e.Message}{Environment.NewLine}{e.StackTrace}");
                return(Result <TDomain> .FailedResult);
            }

            return(result);
        }
示例#6
0
        public async Task <Result <TDomain> > ProcessEmailMessage(EmailMessageInfo messageInfo)
        {
            Result <TDomain> result = await _processor.ProcessEmailMessage(messageInfo);

            try
            {
                if (result.Success)
                {
                    TEntity entity = _converter.Convert(result.Report);

                    _log.Info($"Persisting email message for message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId}");

                    bool added = await _dao.Add(entity);

                    if (added)
                    {
                        _log.Info($"Successfully persisted email message for message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId}");
                    }
                    else
                    {
                        _log.Info($"Did not persist email message for message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId} as it was a duplicate.");
                    }

                    return(new Result <TDomain>(result.Report, result.Success, !added));
                }

                return(result);
            }
            catch (Exception e)
            {
                _log.Error($"Failed to persist email message, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId} with error {e.Message}{System.Environment.NewLine}{e.StackTrace}");
                return(Result <TDomain> .FailedResult);
            }
        }
示例#7
0
        public AggregateReportInfo Parse(EmailMessageInfo messageInfo)
        {
            List <AttachmentInfo> attachments = _mimeMessageFactory
                                                .Create(messageInfo.EmailStream)
                                                .BodyParts.OfType <MimePart>()
                                                .Select(_attachmentStreamNormaliser.Normalise)
                                                .Where(_ => !_.Equals(AttachmentInfo.EmptyAttachmentInfo))
                                                .ToList();

            string logString = $"{messageInfo.EmailMetadata.OriginalUri}, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId}";

            if (attachments.Count == 0)
            {
                throw new ApplicationException(
                          $"Failed to parse: no attachment found where one was expected for {logString}.");
            }

            if (attachments.Count > 1)
            {
                var attachmentFilenames       = attachments.Select(attachment => attachment.AttachmentMetadata.Filename).ToArray();
                var attachmentFilenamesString = string.Join(", ", attachmentFilenames);

                throw new ApplicationException(
                          $"Failed to parse: multiple attachments found where only one was expected for {logString}. {Environment.NewLine} Attachment filenames: {attachmentFilenamesString}");
            }

            AttachmentInfo attachmentInfo = attachments[0];

            AggregateReportInfo aggregateReportInfo = _aggregateReportDeserialiser.Deserialise(attachmentInfo, messageInfo.EmailMetadata);

            _log.LogInformation(
                $"Successfully processed attachment for {logString}.");

            return(aggregateReportInfo);
        }
        private string InsertQuotationData(EmailMessageInfo objMailModel, List <CargoRatesModel> objCRList)
        {
            string result = "";
            ACRF_QuotationModel objQuotModel = new ACRF_QuotationModel();
            List <ACRF_QuotationDetailsModel> objQuotDetList = new List <ACRF_QuotationDetailsModel>();

            objQuotModel.ClientMail      = objMailModel.ToEmailAddress;
            objQuotModel.FromMail        = objMailModel.FromEmailAddress;
            objQuotModel.MailSubject     = objMailModel.EmailSubject;
            objQuotModel.QuotationStatus = QuotationType.InProgress;
            objQuotModel.VendorId        = objMailModel.VendorId;
            objQuotModel.CreatedBy       = objMailModel.FromEmailAddress;

            foreach (var data in objCRList)
            {
                if (data.IsSelect == true)
                {
                    ACRF_QuotationDetailsModel tempobj = new ACRF_QuotationDetailsModel();
                    tempobj.AirlineId        = data.AirlineId;
                    tempobj.AMS              = data.AMS;
                    tempobj.Ctc              = data.Ctc;
                    tempobj.DAirportName     = data.DAirportName;
                    tempobj.DCityCode        = data.DCityCode;
                    tempobj.DCountryCode     = data.DCountryCode;
                    tempobj.DisplayRateName1 = objMailModel.DisplayRateName1;
                    tempobj.DisplayRateName2 = objMailModel.DisplayRateName2;
                    tempobj.DisplayRateName3 = objMailModel.DisplayRateName3;
                    tempobj.Freight          = data.Freight;
                    tempobj.FSC              = data.FSC;
                    tempobj.Id           = data.Id;
                    tempobj.IsRate1      = objMailModel.IsRate1;
                    tempobj.IsRate2      = objMailModel.IsRate2;
                    tempobj.IsRate3      = objMailModel.IsRate3;
                    tempobj.Mcc          = data.Mcc;
                    tempobj.OAirportName = data.OAirportName;
                    tempobj.OCityCode    = data.OCityCode;
                    tempobj.OCountryCode = data.OCountryCode;
                    tempobj.Rate         = data.Rate;
                    tempobj.Rate1        = data.Rate1;
                    tempobj.Rate2        = data.Rate2;
                    tempobj.Rate3        = data.Rate3;
                    tempobj.Slab1        = data.Slab1;
                    tempobj.TariffModeId = data.TariffModeId;
                    tempobj.TotalCost    = data.TotalCost;
                    tempobj.WSC          = data.WSC;
                    tempobj.Xray         = data.Xray;

                    objQuotDetList.Add(tempobj);
                }
            }
            objQuotModel.ACRF_QuotationDetailsModelList = objQuotDetList;

            result = objQuotVM.CreateQuotation(objQuotModel);
            return(result);
        }
示例#9
0
 private T Parse(EmailMessageInfo emailMessageInfo)
 {
     try
     {
         return(_reportParser.Parse(emailMessageInfo));
     }
     catch (Exception e)
     {
         _log.Error($"Failed to process {emailMessageInfo.EmailMetadata.Filename} with error {e.Message} {System.Environment.NewLine} {e.StackTrace}");
         return(null);
     }
 }
示例#10
0
        protected async void sendButton_Click(object sender, EventArgs e)
        {
            // Prepare the email message info model
            var messageInfo = new EmailMessageInfo
            {
                FromEmailAddress = fromInput.Value,
                ToEmailAddress   = toInput.Value,
                CcEmailAddress   = ccInput.Value,
                BccEmailAddress  = bccInput.Value,
                EmailSubject     = subjectInput.Value,
                EmailBody        = bodyInput.Value
            };

            // Make an API call, and save the response
            var apiResponse = await _sendGridService.Send(messageInfo);

            await SetResponseInfoContainers(apiResponse);
        }
        public Task <Result <TDomain> > ProcessEmailMessage(EmailMessageInfo messageInfo)
        {
            try
            {
                _log.Info($"Parsing email message, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId}.");

                TDomain report = _parser.Parse(messageInfo);

                _log.Info($"Successfully parsed email message, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId}.");

                return(Task.FromResult(new Result <TDomain>(report, true, false)));
            }
            catch (Exception e)
            {
                _log.Error($"Failed to process email message, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId} with error {e.Message}{System.Environment.NewLine}{e.StackTrace}");
                return(Task.FromResult(Result <TDomain> .FailedResult));
            }
        }
示例#12
0
        public AggregateReportInfo Parse(EmailMessageInfo messageInfo)
        {
            Stopwatch stopwatch = Stopwatch.StartNew();

            _log.Debug($"Processing {messageInfo.EmailMetadata.OriginalUri}.");

            List <AttachmentInfo> attachments = _mimeMessageFactory
                                                .Create(messageInfo.EmailStream)
                                                .BodyParts.OfType <MimePart>()
                                                .Select(_attachmentStreamNormaliser.Normalise)
                                                .Where(_ => !_.Equals(AttachmentInfo.EmptyAttachmentInfo))
                                                .ToList();

            _log.Debug($"Aggregate report attachment processing took {stopwatch.Elapsed}");
            stopwatch.Reset();

            AttachmentInfo attachment = attachments.Single();

            stopwatch.Start();
            AggregateReportInfo aggregateReport = _aggregateReportDeserialiser.Deserialise(attachment, messageInfo.EmailMetadata);

            _log.Debug($"Deserialising aggregate report took {stopwatch.Elapsed}");
            stopwatch.Reset();

            _log.Debug($"Found {aggregateReport.AggregateReport.Records.Length} records in {aggregateReport.AttachmentMetadata.Filename}");

            if (_multiAttachmentPersistor.Active)
            {
                stopwatch.Start();
                _multiAttachmentPersistor.Persist(attachment);
                _log.Debug($"Persisting attachments took {stopwatch.Elapsed}");
                stopwatch.Reset();
            }

            attachment?.Dispose();

            return(aggregateReport);
        }
        public AggregateReportInfo Parse(EmailMessageInfo messageInfo)
        {
            _log.Info($"Processing attachments for {messageInfo.EmailMetadata.OriginalUri}, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId}.");
            List <AttachmentInfo> attachments = _mimeMessageFactory
                                                .Create(messageInfo.EmailStream)
                                                .BodyParts.OfType <MimePart>()
                                                .Select(_attachmentStreamNormaliser.Normalise)
                                                .Where(_ => !_.Equals(AttachmentInfo.EmptyAttachmentInfo))
                                                .ToList();

            _log.Info($"Successfully processed attachments for {messageInfo.EmailMetadata.OriginalUri}, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId}.");

            AttachmentInfo attachment = attachments.Single();

            _log.Debug($"Deserialising aggregate report {attachment.AttachmentMetadata.Filename} for {messageInfo.EmailMetadata.OriginalUri}, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId}.");
            AggregateReportInfo aggregateReportInfo = _aggregateReportDeserialiser.Deserialise(attachment, messageInfo.EmailMetadata);

            _log.Debug($"Successfully deserialised aggregate report with Id: {aggregateReportInfo.AggregateReport.ReportMetadata.ReportId} from file {attachment.AttachmentMetadata.Filename} from S3 bucket {messageInfo.EmailMetadata.OriginalUri}, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId}.");

            attachments.ForEach(_ => _.Dispose());

            return(aggregateReportInfo);
        }
        private string getDataFromHtml(List <CargoRatesModel> objCRList, EmailMessageInfo objMailModel)
        {
            string oCity       = "";
            string dCity       = "";
            string cargotariff = "";

            var    fileContents = System.IO.File.ReadAllText(HttpContext.Current.Server.MapPath(@"~/MailFormat/emailer.html"));
            string sirreplace   = "";

            if (objMailModel.ToName != "" || objMailModel.ToName != null)
            {
                sirreplace = objMailModel.ToName;
            }
            else
            {
                sirreplace = "Sir";
            }


            string tabledata = "<table width='100%'> "
                               + " <thead style='background-color: #ddd;'> "
                               + " <tr>"
                               + " <th style='padding: 10px 0px 10px 0px;'>Airline</th>"
                               + " <th style='padding: 10px 0px 10px 0px;'>Total</th>"
                               + " <th style='padding: 10px 0px 10px 0px;'>Slab1</th>"
                               + " <th style='padding: 10px 0px 10px 0px;'>Rate</th>"
                               + " <th style='padding: 10px 0px 10px 0px;'>Freight</th>"
                               + " <th style='padding: 10px 0px 10px 0px;'>FSC</th>"
                               + " <th style='padding: 10px 0px 10px 0px;'>WSC</th>"
                               + " <th style='padding: 10px 0px 10px 0px;'>X Ray</th>"
                               + " <th style='padding: 10px 0px 10px 0px;'>MCC</th>"
                               + " <th style='padding: 10px 0px 10px 0px;'>CTG</th>";

            if (objMailModel.IsRate1 == true)
            {
                tabledata = tabledata + " <th style='padding: 10px 0px 10px 0px;'>" + objMailModel.DisplayRateName1 + "</th>";
            }
            if (objMailModel.IsRate2 == true)
            {
                tabledata = tabledata + " <th style='padding: 10px 0px 10px 0px;'>" + objMailModel.DisplayRateName2 + "</th>";
            }
            if (objMailModel.IsRate3 == true)
            {
                tabledata = tabledata + " <th style='padding: 10px 0px 10px 0px;'>" + objMailModel.DisplayRateName3 + "</th>";
            }
            tabledata = tabledata + " "
                        + " </tr>"
                        + " </thead>"
                        + " <tbody  style='background-color: #ece9e6;'>";
            foreach (var data in objCRList)
            {
                if (data.IsSelect == true)
                {
                    oCity       = data.OCityCode;
                    dCity       = data.DCityCode;
                    cargotariff = data.TariffMode;


                    tabledata = tabledata + " <tr>";
                    tabledata = tabledata + " <td  style='padding: 10px 0px 10px 0px;text-align:  center;'>";
                    tabledata = tabledata + data.Airline;
                    tabledata = tabledata + " </td>";

                    tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align:  center;'>";
                    tabledata = tabledata + data.TotalCost;
                    tabledata = tabledata + " </td>";

                    tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align:  center;'>";
                    tabledata = tabledata + data.Slab1;
                    tabledata = tabledata + " </td>";

                    tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align:  center;'>";
                    tabledata = tabledata + data.Rate;
                    tabledata = tabledata + " </td>";

                    tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align:  center;'>";
                    tabledata = tabledata + data.Freight;
                    tabledata = tabledata + " </td>";

                    tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align:  center;'>";
                    tabledata = tabledata + data.FSC;
                    tabledata = tabledata + " </td>";

                    tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align:  center;'>";
                    tabledata = tabledata + data.WSC;
                    tabledata = tabledata + " </td>";

                    tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align:  center;'>";
                    tabledata = tabledata + data.Xray;
                    tabledata = tabledata + " </td>";

                    tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align:  center;'>";
                    tabledata = tabledata + data.Mcc;
                    tabledata = tabledata + " </td>";

                    tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align:  center;'>";
                    tabledata = tabledata + data.Ctc;
                    tabledata = tabledata + " </td>";

                    if (objMailModel.IsRate1 == true)
                    {
                        tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align:  center;'>" + data.Rate1 + "</td>";
                    }
                    if (objMailModel.IsRate2 == true)
                    {
                        tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align:  center;'>" + data.Rate2 + "</td>";
                    }
                    if (objMailModel.IsRate3 == true)
                    {
                        tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align:  center;'>" + data.Rate3 + "</td>";
                    }

                    tabledata = tabledata + " <tr>";
                }
            }

            tabledata = tabledata + " </tbody></table>";

            string cargodetails  = "Ex- " + oCity + " Airport to " + dCity + " Airport, for " + cargotariff + " cargo";
            string cargodetails2 = cargotariff + " Cargo Rates Ex- " + oCity + " Airport to " + dCity + " Airport Currency: INR";

            fileContents = fileContents.Replace("dynamic_tabledata", tabledata);

            fileContents = fileContents.Replace("{{Sir}}", sirreplace);

            fileContents = fileContents.Replace("{{CargoDetails}}", cargodetails);
            fileContents = fileContents.Replace("{{CargoDetails2}}", cargodetails2);


            var vendordata = objVendorVM.GetOneVendorDetails(objMailModel.VendorId);

            //fileContents = fileContents.Replace("{{VendorAddress}}", vendordata.Address);
            //fileContents = fileContents.Replace("{{VendorMobile}}", vendordata.Mobile);
            //fileContents = fileContents.Replace("{{VendorEmail}}", vendordata.Email);

            //fileContents = fileContents.Replace("{{VendorName}}", vendordata.VendorName);


            return(fileContents);
        }
示例#15
0
        public void Parse(EmailMessageInfo messageInfo)
        {
            try
            {
                Stopwatch             stopwatch   = new Stopwatch();
                List <AttachmentInfo> attachments = null;
                if (_multiAttachmentPersistor.Active ||
                    _multiDenormalisedRecordPersistor.Active ||
                    _multiAggregateReportPersistor.Active)
                {
                    _log.Debug($"Processing {messageInfo.EmailMetadata.OriginalUri}.");
                    stopwatch.Start();

                    attachments = _mimeMessageFactory
                                  .Create(messageInfo.EmailStream)
                                  .BodyParts.OfType <MimePart>()
                                  .Select(_attachmentStreamNormaliser.Normalise)
                                  .Where(_ => !_.Equals(AttachmentInfo.EmptyAttachmentInfo))
                                  .ToList();

                    if (attachments.Count == 0)
                    {
                        _log.Warn($"Didnt find any aggregate report attachments for {messageInfo.EmailMetadata.OriginalUri}.");
                    }
                    else
                    {
                        _log.Debug($"Found {attachments.Count} aggregate report attachment(s) for {messageInfo.EmailMetadata.OriginalUri}.");
                    }
                    _log.Debug($"Aggregate report attachment processing took {stopwatch.Elapsed}");
                    stopwatch.Reset();
                }
                else
                {
                    _log.Warn($"Not Processing {messageInfo.EmailMetadata.OriginalUri} as no persistors found.");
                }

                List <AggregateReportInfo> aggregateReports = null;
                if (_multiDenormalisedRecordPersistor.Active ||
                    _multiAggregateReportPersistor.Active)
                {
                    stopwatch.Start();
                    aggregateReports = attachments
                                       .Select(_ => _aggregateReportDeserialiser.Deserialise(_, messageInfo.EmailMetadata))
                                       .ToList();
                    _log.Debug($"Deserialising aggregate reports took {stopwatch.Elapsed}");
                    stopwatch.Reset();

                    aggregateReports.ForEach(_ => _log.Debug($"Found {_.AggregateReport.Records.Length} records in {_.AttachmentMetadata.Filename}"));
                }

                List <DenormalisedRecord> denormalisedRecords = null;
                if (_multiDenormalisedRecordPersistor.Active)
                {
                    stopwatch.Start();
                    denormalisedRecords = aggregateReports
                                          .Select(_ => _denormalisedRecordConverter.ToDenormalisedRecord(_.AggregateReport, messageInfo.EmailMetadata.OriginalUri))
                                          .SelectMany(_ => _)
                                          .ToList();
                    _log.Debug($"Denormalised record processing took {stopwatch.Elapsed}");
                    stopwatch.Reset();
                }

                if (_multiAttachmentPersistor.Active)
                {
                    stopwatch.Start();
                    _multiAttachmentPersistor.Persist(attachments);
                    _log.Debug($"Persisting attachments took {stopwatch.Elapsed}");
                    stopwatch.Reset();
                }

                if (_multiDenormalisedRecordPersistor.Active)
                {
                    stopwatch.Start();
                    _multiDenormalisedRecordPersistor.Persist(denormalisedRecords);
                    _log.Debug($"Persisting denormalised records took {stopwatch.Elapsed}");
                    stopwatch.Reset();
                }

                if (_multiAggregateReportPersistor.Active)
                {
                    stopwatch.Start();
                    _multiAggregateReportPersistor.Persist(aggregateReports);
                    _log.Debug($"Persisting denormalised records took {stopwatch.Elapsed}");
                    stopwatch.Reset();
                }

                attachments?.ForEach(_ => _.Dispose());
            }
            catch (Exception e)
            {
                _log.Error($"An error occurred processing {messageInfo.EmailMetadata.OriginalUri}{Environment.NewLine}{e.Message}{Environment.NewLine}{Environment.NewLine}{e.StackTrace}");
            }
        }
示例#16
0
        private async Task Process(S3SourceInfo s3SourceInfo)
        {
            using (_logger.BeginScope(new Dictionary <string, object> {
                ["MessageId"] = s3SourceInfo.MessageId,
                ["RequestId"] = s3SourceInfo.RequestId,
                ["S3ObjectPath"] = $"{ s3SourceInfo.BucketName }/{ s3SourceInfo.ObjectName }"
            }))
            {
                _logger.LogDebug(
                    $"Processing report in s3 object {s3SourceInfo.BucketName}/{s3SourceInfo.ObjectName}, " +
                    $"message Id: {s3SourceInfo.MessageId}, request Id: {s3SourceInfo.RequestId}.");

                try
                {
                    EmailMessageInfo emailMessageInfo = await _s3Client.GetEmailMessage(s3SourceInfo);

                    using (_logger.BeginScope(new Dictionary <string, object>
                    {
                        ["EmailAttachmentFileName"] = emailMessageInfo?.EmailMetadata?.Filename,
                    }))
                    {
                        _logger.LogDebug(
                            $"Successfully retrieved report in s3 object {s3SourceInfo.BucketName}/{s3SourceInfo.ObjectName}, " +
                            $"message Id: {s3SourceInfo.MessageId}, request Id: {s3SourceInfo.RequestId}.");

                        if (emailMessageInfo.EmailMetadata.FileSizeKb > _config.MaxS3ObjectSizeKilobytes)
                        {
                            _logger.LogWarning(
                                $"Didnt process report in s3 object {s3SourceInfo.BucketName}/{s3SourceInfo.ObjectName} " +
                                $" as MaxS3ObjectSizeKilobytes of {_config.MaxS3ObjectSizeKilobytes} Kb was exceeded, " +
                                $"message Id: {s3SourceInfo.MessageId}, request Id: {s3SourceInfo.RequestId}.");
                        }
                        else
                        {
                            AggregateReportInfo aggregateReportInfo = null;
                            try
                            {
                                aggregateReportInfo = _parser.Parse(emailMessageInfo);
                            }
                            finally
                            {
                                emailMessageInfo.EmailStream.Dispose();
                                aggregateReportInfo?.AttachmentInfo.AttachmentStream.Dispose();
                            }

                            _logger.LogDebug(
                                $"Successfully parsed report in s3 object {s3SourceInfo.BucketName}/{s3SourceInfo.ObjectName}, " +
                                $"message Id: {s3SourceInfo.MessageId}, request Id: {s3SourceInfo.RequestId}.");

                            using (_logger.BeginScope(new Dictionary <string, object>
                            {
                                ["AggregateReportInfoId"] = aggregateReportInfo?.Id,
                                ["AggregateReportId"] = aggregateReportInfo?.AggregateReport?.ReportMetadata?.ReportId,
                                ["AggregateReportOrgName"] = aggregateReportInfo?.AggregateReport?.ReportMetadata?.OrgName,
                                ["AggregateReportDomain"] = aggregateReportInfo?.AggregateReport?.PolicyPublished?.Domain,
                            }))
                                using (TransactionScope transactionScope = new TransactionScope(
                                           TransactionScopeOption.Required,
                                           new TransactionOptions
                                {
                                    IsolationLevel = IsolationLevel.ReadCommitted,
                                    Timeout = TimeSpan.FromSeconds(300)
                                },
                                           TransactionScopeAsyncFlowOption.Enabled))
                                {
                                    aggregateReportInfo = await _persistor.Persist(aggregateReportInfo);

                                    _logger.LogDebug(
                                        $"Successfully persisted report in s3 object {s3SourceInfo.BucketName}/{s3SourceInfo.ObjectName}, " +
                                        $"message Id: {s3SourceInfo.MessageId}, request Id: {s3SourceInfo.RequestId}.");

                                    await _publisher.Publish(aggregateReportInfo);

                                    _logger.LogDebug(
                                        $"Successfully published report/s in s3 object {s3SourceInfo.BucketName}/{s3SourceInfo.ObjectName}, " +
                                        $"message Id: {s3SourceInfo.MessageId}, request Id: {s3SourceInfo.RequestId}.");

                                    transactionScope.Complete();
                                }
                        }
                    }
                }
                catch (DuplicateAggregateReportException)
                {
                    _logger.LogInformation(
                        $"Duplicate report in s3 object {s3SourceInfo.BucketName}/{s3SourceInfo.ObjectName}, " +
                        $"message Id: {s3SourceInfo.MessageId}, request Id: {s3SourceInfo.RequestId} ignored.");
                }
                catch (Exception e)
                {
                    _logger.LogError(e,
                                     $"Failed to process s3 object {s3SourceInfo.BucketName}/{s3SourceInfo.ObjectName} message Id: {s3SourceInfo.MessageId}, request Id: {s3SourceInfo.RequestId}");
                    throw;
                }
            }
        }