/// <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);
        }
Esempio n. 2
0
 Task <MappingProviderOutput> IMappingProvider.MapAsync(MappingProviderInput input, CancellationToken token)
 {
     throw new NotImplementedException();
 }