Пример #1
0
        public async Task HttpSubmitItemPipelineElement_Validates_ItemSubmissionInputModel_With_BinariesSubmittedProp()
        {
            ItemSubmissionInputModel inputModelBuiltOnSubmit = null;

            _mockClient
            .Setup(x =>
                   x.ApiItemsPostWithHttpMessagesAsync(
                       It.IsAny <ItemSubmissionInputModel>(),
                       It.IsAny <string>(),
                       It.IsAny <Dictionary <string, List <string> > >(),
                       CancellationToken.None))
            .Callback <ItemSubmissionInputModel, string, Dictionary <string, List <string> >, CancellationToken>(
                (model, lan, headers, ct) => inputModelBuiltOnSubmit = model)
            .ReturnsAsync(() => new HttpOperationResponse <object> {
                Body = new { text = "test ok" }, Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.OK)
            });

            _mockClientFactory.Setup(x => x.CreateApiClient(It.IsAny <ApiClientFactorySettings>())).Returns(_mockClient.Object);

            _itemPipelineElement = new HttpSubmitItemPipelineElement(_mockSubmission.Object)
            {
                ApiClientFactory = _mockClientFactory.Object
            };

            var submitContext = new ItemSubmitContext
            {
                BinariesSubmitted = new List <DirectBinarySubmissionInputModel>
                {
                    new DirectBinarySubmissionInputModel
                    {
                        BinaryExternalId = "binary-external-id-1",
                        ItemExternalId   = "item-external-id-1"
                    },
                    new DirectBinarySubmissionInputModel
                    {
                        BinaryExternalId = "binary-external-id-2",
                        ItemExternalId   = "item-external-id-1"
                    },
                    new DirectBinarySubmissionInputModel
                    {
                        BinaryExternalId = "binary-external-id-3",
                        ItemExternalId   = "item-external-id-1"
                    },
                }
            };

            await _itemPipelineElement.Submit(submitContext);

            _mockSubmission.Verify(x => x.Submit(It.IsAny <SubmitContext>()));

            inputModelBuiltOnSubmit.BinariesSubmitted.Should().HaveCount(3);
            inputModelBuiltOnSubmit.BinariesSubmitted.Select(x => x.ItemExternalId).Distinct().Should().BeEquivalentTo("item-external-id-1");
        }
        /// <summary>
        /// Submits an item via the Records365 vNext Connector API.
        /// </summary>
        /// <param name="submitContext"></param>
        /// <returns></returns>
        public override async Task Submit(SubmitContext submitContext)
        {
            // Submit via HTTP API Client that is generated with AutoRest
            var apiClient = ApiClientFactory.CreateApiClient(submitContext.ApiClientFactorySettings);
            Func <string, DateTime> parseDateTime = (string value) =>
            {
                DateTime result;
                return(!string.IsNullOrEmpty(value) && DateTime.TryParse(value, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out result) ? result : DateTime.UtcNow);
            };

            var itemModel = new ItemSubmissionInputModel()
            {
                ExternalId                = submitContext.CoreMetaData?.FirstOrDefault(metadata => metadata.Name == Fields.ExternalId)?.Value ?? "",
                Title                     = submitContext.CoreMetaData?.FirstOrDefault(metadata => metadata.Name == Fields.Title)?.Value ?? "",
                Author                    = submitContext.CoreMetaData?.FirstOrDefault(metadata => metadata.Name == Fields.Author)?.Value ?? "",
                MimeType                  = submitContext.CoreMetaData?.FirstOrDefault(metadata => metadata.Name == Fields.MimeType)?.Value ?? "",
                SourceLastModifiedDate    = parseDateTime(submitContext.CoreMetaData?.FirstOrDefault(metadata => metadata.Name == Fields.SourceLastModifiedDate)?.Value),
                SourceLastModifiedBy      = submitContext.CoreMetaData?.FirstOrDefault(metadata => metadata.Name == Fields.SourceLastModifiedBy)?.Value ?? "",
                SourceCreatedDate         = parseDateTime(submitContext.CoreMetaData?.FirstOrDefault(metadata => metadata.Name == Fields.SourceCreatedDate)?.Value),
                SourceCreatedBy           = submitContext.CoreMetaData?.FirstOrDefault(metadata => metadata.Name == Fields.SourceCreatedBy)?.Value ?? "",
                ContentVersion            = submitContext.CoreMetaData?.FirstOrDefault(metadata => metadata.Name == Fields.ContentVersion)?.Value ?? "",
                Location                  = submitContext.CoreMetaData?.FirstOrDefault(metadata => metadata.Name == Fields.Location)?.Value ?? "",
                MediaType                 = submitContext.CoreMetaData?.FirstOrDefault(metadata => metadata.Name == Fields.MediaType)?.Value ?? "Electronic",
                ConnectorId               = submitContext.ConnectorConfigId.ToString(),
                ParentExternalId          = submitContext.CoreMetaData?.FirstOrDefault(metadata => metadata.Name == Fields.ParentExternalId)?.Value ?? "",
                BarcodeType               = submitContext.CoreMetaData?.FirstOrDefault(metadata => metadata.Name == Fields.BarcodeType)?.Value ?? "",
                BarcodeValue              = submitContext.CoreMetaData?.FirstOrDefault(metadata => metadata.Name == Fields.BarcodeValue)?.Value ?? "",
                SecurityProfileIdentifier = submitContext.CoreMetaData?.FirstOrDefault(metadata => metadata.Name == Fields.SecurityProfileIdentifier)?.Value ?? "",
                CorrelationId             = submitContext.CorrelationId.ToString(),
                SourceProperties          = new List <SubmissionMetaDataModel>(),
                Relationships             = new List <RelationshipDataModel>()
            };

            if (submitContext is ItemSubmitContext)
            {
                itemModel.BinariesSubmitted = ((ItemSubmitContext)submitContext).BinariesSubmitted;
            }

            if (submitContext.SourceMetaData != null)
            {
                itemModel.SourceProperties = submitContext.SourceMetaData;
            }

            if (submitContext.Relationships != null)
            {
                itemModel.Relationships = submitContext.Relationships;
            }

            var shouldContinue = true;

            try
            {
                var result = await GetRetryPolicy(submitContext).ExecuteAsync(
                    async(ct) =>
                {
                    var authHelper = ApiClientFactory.CreateAuthenticationHelper();
                    var headers    = await authHelper.GetHttpRequestHeaders(submitContext.AuthenticationHelperSettings).ConfigureAwait(false);
                    return(await apiClient.ApiItemsPostWithHttpMessagesAsync(
                               itemModel,
                               customHeaders: headers,
                               cancellationToken: ct
                               ).ConfigureAwait(false));
                },
                    submitContext.CancellationToken
                    ).ConfigureAwait(false);

                shouldContinue = await HandleSubmitResponse(submitContext, result, "Item").ConfigureAwait(false);

                if (result.Body is ItemAcceptanceModel resultBody)
                {
                    if (!string.IsNullOrEmpty(resultBody.AggregationStatus) &&
                        resultBody.AggregationStatus.ToLower() == "found")
                    {
                        submitContext.AggregationFoundDuringItemSubmission = true;
                    }
                    else
                    {
                        submitContext.AggregationFoundDuringItemSubmission = false;
                    }
                }
            }
            catch (HttpOperationException ex)
                when(ex.Response?.StatusCode == System.Net.HttpStatusCode.Conflict)
                {
                    // Submitted item already exists! Nothing to do but continue with the submission pipeline
                    LogVerbose(submitContext, nameof(Submit), $"Submission returned {ex.Response.StatusCode} : Item already submitted.");
                }

            if (shouldContinue)
            {
                await InvokeNext(submitContext).ConfigureAwait(false);
            }
        }