/// <summary> /// Transforms a page from the configured data source to a modern SharePoint Online page /// </summary> /// <param name="task">The context of the transformation process</param> /// <param name="token">The cancellation token, if any</param> /// <returns>The URL of the transformed page</returns> public virtual async Task <Uri> TransformAsync(PageTransformationTask task, CancellationToken token = default) { if (task == null) { throw new ArgumentNullException(nameof(task)); } logger.LogInformation( TransformationResources.Info_RunningTransformationTask.CorrelateString(task.Id), task.Id, task.SourceItemId.Id); // Get the source item by id var sourceItem = await task.SourceProvider.GetItemAsync(task.SourceItemId, token).ConfigureAwait(false); // Resolve the target page uri var targetPageUri = await targetPageUriResolver.ResolveAsync(sourceItem, task.TargetContext, token).ConfigureAwait(false); // Call pre transformations handlers var preContext = new PagePreTransformationContext(task, sourceItem, targetPageUri); foreach (var pagePreTransformation in pagePreTransformations) { await pagePreTransformation.PreTransformAsync(preContext, token).ConfigureAwait(false); token.ThrowIfCancellationRequested(); } // Save start date and time for telemetry DateTime transformationStartDateTime = DateTime.Now; // Invoke the configured main mapping provider var context = new PageTransformationContext(task, sourceItem, targetPageUri); var input = new MappingProviderInput(context); MappingProviderOutput output = await mappingProvider.MapAsync(input, token).ConfigureAwait(false); token.ThrowIfCancellationRequested(); // Here we generate the actual SPO modern page in SharePoint Online var generatedPage = await pageGenerator.GenerateAsync(context, output, targetPageUri, token).ConfigureAwait(false); var generatedPageUri = generatedPage.GeneratedPageUrl; token.ThrowIfCancellationRequested(); // Save duration for telemetry TimeSpan duration = DateTime.Now.Subtract(transformationStartDateTime); // Save telemetry var telemetryProperties = output.TelemetryProperties.Merge(generatedPage.TelemetryProperties); // Add global telemetry properties telemetryProperties.Add(TelemetryService.CorrelationId, task.Id.ToString()); telemetryProperties.Add(TelemetryService.AADTenantId, context.Task.TargetContext.GlobalOptions.AADTenantId.ToString()); this.telemetry.LogTransformationCompleted(duration, telemetryProperties); // Call post transformations handlers var postContext = new PagePostTransformationContext(task, sourceItem, generatedPageUri); foreach (var pagePostTransformation in pagePostTransformations) { await pagePostTransformation.PostTransformAsync(postContext, token).ConfigureAwait(false); token.ThrowIfCancellationRequested(); } return(generatedPageUri); }