Esempio n. 1
0
 public Task NotifyMailMergeCompletedAsync(
     string mergeTemplateId,
     string connectionId,
     RunMergeTemplateProgress progressUpdated,
     CancellationToken cancellationToken = default(CancellationToken))
 {
     // TODO: actually send notificaiton to MailmanHub like in the MergeTemplatesController
     _logger.Information("Mail merge of template {MergeTemplateId} complete: Success={NumberProcessed}, Skipped={NumberSkipped}, Errors={NumberOfErrors}, Total={TotalNumber}",
                         mergeTemplateId,
                         progressUpdated.Processed,
                         progressUpdated.Skipped,
                         progressUpdated.Errors,
                         progressUpdated.Total);
     return(Task.CompletedTask);
 }
        public async Task <RunMergeTemplateProgress> RunMailMergeAsync(RunMailMergeOptions options, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }
            if (string.IsNullOrWhiteSpace(options.MergeTemplateId))
            {
                throw new ArgumentNullException("options.MergeTemplateId", "MergeTempalteId cannot be null or empty");
            }

            RunMergeTemplateProgress returnValue = null;

            await WithWorker(RUN_MAIL_MERGE_SCOPE, async httpClient =>
            {
                try
                {
                    var response = await httpClient.PostAsJsonAsync(
                        "api/MailMerge/run",
                        new RunMailMergeOptions()
                    {
                        MergeTemplateId = options.MergeTemplateId,
                        ConnectionId    = options.ConnectionId
                    },
                        cancellationToken);
                    if (response.IsSuccessStatusCode)
                    {
                        string responseString = await response.Content.ReadAsStringAsync();
                        returnValue           = JsonConvert.DeserializeObject <RunMergeTemplateProgress>(responseString);
                    }
                    else
                    {
                        throw new InvalidOperationException($"Remote server did not return success ({response.StatusCode})");
                    }
                }
                catch (Exception err)
                {
                    _logger.Error(err, "Unable to communicate with worker process");
                    throw;
                }
            });

            return(returnValue);
        }
 public async Task NotifyMailMergeUpdatedAsync(string mergeTemplateId, string connectionId, RunMergeTemplateProgress progressUpdated, CancellationToken cancellationToken = default(CancellationToken))
 {
     await WithServer(NOTIFICATION_SCOPE, async httpClient =>
     {
         await httpClient.PostAsJsonAsync(
             "api/MergeTemplates/run/updated",
             new MailMergeProgress()
         {
             MergeTemplateId = mergeTemplateId,
             ConnectionId    = connectionId,
             Progress        = progressUpdated
         },
             cancellationToken);
     });
 }
Esempio n. 4
0
 public Task NotifyMailMergeUpdatedAsync(string mergeTemplateId, string connectionId, RunMergeTemplateProgress progressUpdated, CancellationToken cancellationToken = default(CancellationToken))
 {
     // TODO: actually send notificaiton to MailmanHub like in the MergeTemplatesController
     _logger.Information("Mail merge of template {MergeTemplateId}: {NumberCompleted}/{TotalNumber}",
                         mergeTemplateId,
                         progressUpdated.Completed,
                         progressUpdated.Total);
     return(Task.CompletedTask);
 }
        public async Task <RunMergeTemplateProgress> RunMergeTemplateAsync(
            MergeTemplate mergeTemplate,
            Action <RunMergeTemplateProgress> progressReporter = null,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            if (mergeTemplate == null)
            {
                throw new ArgumentNullException(nameof(mergeTemplate));
            }
            var emailMergeTemplate = mergeTemplate as EmailMergeTemplate;

            if (emailMergeTemplate == null)
            {
                throw new InvalidOperationException("Currently only mergeTemplates of type Email are supported.");
            }
            if (emailMergeTemplate.EmailTemplate == null)
            {
                throw new InvalidOperationException("MergeTemplate.EmailTemplate cannot ben null");
            }

            string range     = mergeTemplate.SheetName;
            var    dataRange = await _sheetsService.GetDataRangeAsync(
                mergeTemplate.SpreadSheetId, mergeTemplate.SheetName);

            if (mergeTemplate.HeaderRowNumber > 1)
            {
                // we'll define a custom range
                range = new A1Notation(mergeTemplate.SheetName,
                                       dataRange.StartColumn,
                                       mergeTemplate.HeaderRowNumber,
                                       dataRange.EndColumn,
                                       dataRange.EndRow).ToString();
            }

            if (!dataRange.EndRow.HasValue)
            {
                throw new InvalidOperationException($"Could not retrieve the number of rows in sheet {mergeTemplate.SheetName}");
            }

            var progress = new RunMergeTemplateProgress(
                dataRange.EndRow.Value - (dataRange.StartRow ?? 1));
            await _sheetsService.GetValuesAsDictionaryDataPump(mergeTemplate.SpreadSheetId,
                                                               range, async values =>
            {
                if (!ShouldProcess(mergeTemplate, values))
                {
                    progress.AddSkipped();
                    return;
                }

                try
                {
                    await ProcessMergeTemplateAsync(emailMergeTemplate.EmailTemplate, values);
                    progress.AddProcessed();
                }
                catch (Exception err)
                {
                    _logger.Error(err, "Error processing merge template");
                    progress.AddError();
                }
                finally
                {
                    progressReporter?.Invoke(progress);
                }
            });

            return(progress);
        }