public async Task <ExchangeSetServiceResponse> CreateProductDataByProductIdentifiers(ProductIdentifierRequest productIdentifierRequest, AzureAdB2C azureAdB2C) { DateTime salesCatalogueServiceRequestStartedAt = DateTime.UtcNow; var salesCatalogueResponse = await salesCatalogueService.PostProductIdentifiersAsync(productIdentifierRequest.ProductIdentifier.ToList(), productIdentifierRequest.CorrelationId); long fileSize = 0; if (salesCatalogueResponse.ResponseCode == HttpStatusCode.OK) { fileSize = CommonHelper.GetFileSize(salesCatalogueResponse.ResponseBody); bool isAzureB2C = azureAdB2CHelper.IsAzureB2CUser(azureAdB2C, productIdentifierRequest.CorrelationId); if (isAzureB2C) { var checkFileResponse = CheckIfExchangeSetTooLarge(fileSize); if (checkFileResponse.HttpStatusCode != HttpStatusCode.OK) { return(checkFileResponse); } } } DateTime salesCatalogueServiceRequestCompletedAt = DateTime.UtcNow; monitorHelper.MonitorRequest("Sales Catalogue Service Product Identifier Request", salesCatalogueServiceRequestStartedAt, salesCatalogueServiceRequestCompletedAt, productIdentifierRequest.CorrelationId, null, null, fileSize, null); var response = SetExchangeSetResponse(salesCatalogueResponse, false); if (response.HttpStatusCode != HttpStatusCode.OK && response.HttpStatusCode != HttpStatusCode.NotModified) { return(response); } var exchangeSetServiceResponse = await SetExchangeSetResponseLinks(response, productIdentifierRequest.CorrelationId); if (exchangeSetServiceResponse.HttpStatusCode != HttpStatusCode.Created) { return(exchangeSetServiceResponse); } string expiryDate = exchangeSetServiceResponse.ExchangeSetResponse.ExchangeSetUrlExpiryDateTime.Value.ToString("yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture); if (!string.IsNullOrEmpty(exchangeSetServiceResponse.BatchId)) { await SaveSalesCatalogueStorageDetails(salesCatalogueResponse.ResponseBody, exchangeSetServiceResponse.BatchId, productIdentifierRequest.CallbackUri, productIdentifierRequest.CorrelationId, expiryDate); } return(response); }
public async Task <string> CreateExchangeSet(SalesCatalogueServiceResponseQueueMessage message, string currentUtcDate) { DateTime createExchangeSetTaskStartedAt = DateTime.UtcNow; string homeDirectoryPath = configuration["HOME"]; var exchangeSetPath = Path.Combine(homeDirectoryPath, currentUtcDate, message.BatchId, fileShareServiceConfig.Value.ExchangeSetFileFolder); var exchangeSetRootPath = Path.Combine(exchangeSetPath, fileShareServiceConfig.Value.EncRoot); var exchangeSetZipFilePath = Path.Combine(homeDirectoryPath, currentUtcDate, message.BatchId); var listFulfilmentData = new List <FulfilmentDataResponse>(); var response = await DownloadSalesCatalogueResponse(message); if (response.Products != null && response.Products.Any()) { DateTime queryAndDownloadEncFilesFromFileShareServiceTaskStartedAt = DateTime.UtcNow; int parallelSearchTaskCount = fileShareServiceConfig.Value.ParallelSearchTaskCount; int productGroupCount = response.Products.Count % parallelSearchTaskCount == 0 ? response.Products.Count / parallelSearchTaskCount : (response.Products.Count / parallelSearchTaskCount) + 1; var productsList = CommonHelper.SplitList((response.Products), productGroupCount); List <FulfilmentDataResponse> fulfilmentDataResponse = new List <FulfilmentDataResponse>(); object sync = new object(); int fileShareServiceSearchQueryCount = 0; var cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; var tasks = productsList.Select(async item => { fulfilmentDataResponse = await QueryFileShareServiceFiles(message, item, exchangeSetRootPath, cancellationTokenSource, cancellationToken); int queryCount = fulfilmentDataResponse.Count > 0 ? fulfilmentDataResponse.FirstOrDefault().FileShareServiceSearchQueryCount : 0; lock (sync) { fileShareServiceSearchQueryCount += queryCount; } if (cancellationToken.IsCancellationRequested) { cancellationTokenSource.Cancel(); logger.LogError(EventIds.CancellationTokenEvent.ToEventId(), "Operation is cancelled as IsCancellationRequested flag is true in QueryFileShareServiceFiles with {cancellationTokenSource.Token} and batchId:{message.BatchId} and CorrelationId:{message.CorrelationId}", JsonConvert.SerializeObject(cancellationTokenSource.Token), message.BatchId, message.CorrelationId); throw new OperationCanceledException(); } listFulfilmentData.AddRange(fulfilmentDataResponse); }); await Task.WhenAll(tasks); DateTime queryAndDownloadEncFilesFromFileShareServiceTaskCompletedAt = DateTime.UtcNow; int downloadedENCFileCount = 0; foreach (var item in listFulfilmentData) { downloadedENCFileCount += item.Files.Count(); } monitorHelper.MonitorRequest("Query and Download ENC Files Task", queryAndDownloadEncFilesFromFileShareServiceTaskStartedAt, queryAndDownloadEncFilesFromFileShareServiceTaskCompletedAt, message.CorrelationId, fileShareServiceSearchQueryCount, downloadedENCFileCount, null, message.BatchId); } await CreateAncillaryFiles(message.BatchId, exchangeSetPath, message.CorrelationId, listFulfilmentData, response); bool isZipFileUploaded = await PackageAndUploadExchangeSetZipFileToFileShareService(message.BatchId, exchangeSetPath, exchangeSetZipFilePath, message.CorrelationId); DateTime createExchangeSetTaskCompletedAt = DateTime.UtcNow; if (isZipFileUploaded) { logger.LogInformation(EventIds.ExchangeSetCreated.ToEventId(), "Exchange set is created for BatchId:{BatchId} and _X-Correlation-ID:{CorrelationId}", message.BatchId, message.CorrelationId); await fulfilmentCallBackService.SendCallBackResponse(response, message); monitorHelper.MonitorRequest("Create Exchange Set Task", createExchangeSetTaskStartedAt, createExchangeSetTaskCompletedAt, message.CorrelationId, null, null, null, message.BatchId); return("Exchange Set Created Successfully"); } monitorHelper.MonitorRequest("Create Exchange Set Task", createExchangeSetTaskStartedAt, createExchangeSetTaskCompletedAt, message.CorrelationId, null, null, null, message.BatchId); return("Exchange Set Is Not Created"); }