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); } }