From 258a6286e70cee53be5cb61a8c25608dc6c5e8a7 Mon Sep 17 00:00:00 2001 From: BChoudhury-ms Date: Tue, 6 Jan 2026 21:12:19 +0530 Subject: [PATCH] refactor(dataTransfers): replace fetch with armRequest for pagination (#2305) * refactor(dataTransfers): replace fetch with armRequest for pagination * added comment for next link url parsing --- src/Common/dataAccess/dataTransfers.ts | 32 ++++++++++++++++++-------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/Common/dataAccess/dataTransfers.ts b/src/Common/dataAccess/dataTransfers.ts index e639f9965..3e8829486 100644 --- a/src/Common/dataAccess/dataTransfers.ts +++ b/src/Common/dataAccess/dataTransfers.ts @@ -1,3 +1,4 @@ +import { configContext } from "ConfigContext"; import { ApiType, userContext } from "UserContext"; import * as NotificationConsoleUtils from "Utils/NotificationConsoleUtils"; import { @@ -14,9 +15,12 @@ import { DataTransferJobFeedResults, DataTransferJobGetResults, } from "Utils/arm/generatedClients/dataTransferService/types"; +import { armRequest } from "Utils/arm/request"; import { addToPolling, removeFromPolling, updateDataTransferJob, useDataTransferJobs } from "hooks/useDataTransferJobs"; import promiseRetry, { AbortError, FailedAttemptError } from "p-retry"; +export const DATA_TRANSFER_JOB_API_VERSION = "2025-05-01-preview"; + export interface DataTransferParams { jobName: string; apiType: ApiType; @@ -33,26 +37,34 @@ export const getDataTransferJobs = async ( subscriptionId: string, resourceGroup: string, accountName: string, + signal?: AbortSignal, ): Promise => { let dataTransferJobs: DataTransferJobGetResults[] = []; let dataTransferFeeds: DataTransferJobFeedResults = await listByDatabaseAccount( subscriptionId, resourceGroup, accountName, + signal, ); dataTransferJobs = [...dataTransferJobs, ...(dataTransferFeeds?.value || [])]; while (dataTransferFeeds?.nextLink) { - const nextResponse = await window.fetch(dataTransferFeeds.nextLink, { - headers: { - Authorization: userContext.authorizationToken, - }, + /** + * The `nextLink` URL returned by the Cosmos DB SQL API pointed to an incorrect endpoint, causing timeouts. + * (i.e: https://cdbmgmtprodby.documents.azure.com:450/subscriptions/{subId}/resourceGroups/{rg}/providers/Microsoft.DocumentDB/databaseAccounts/{account}/sql/dataTransferJobs?$top=100&$skiptoken=...) + * We manipulate the URL by parsing it to extract the path and query parameters, + * then construct the correct URL for the Azure Resource Manager (ARM) API. + * This ensures that the request is made to the correct base URL (`configContext.ARM_ENDPOINT`), + * which is required for ARM operations. + */ + const parsedUrl = new URL(dataTransferFeeds.nextLink); + const nextUrlPath = parsedUrl.pathname + parsedUrl.search; + dataTransferFeeds = await armRequest({ + host: configContext.ARM_ENDPOINT, + path: nextUrlPath, + method: "GET", + apiVersion: DATA_TRANSFER_JOB_API_VERSION, }); - if (nextResponse.ok) { - dataTransferFeeds = await nextResponse.json(); - dataTransferJobs = [...dataTransferJobs, ...(dataTransferFeeds?.value || [])]; - } else { - break; - } + dataTransferJobs.push(...(dataTransferFeeds?.value || [])); } return dataTransferJobs; };