diff --git a/packages/common/src/content/_internal/internalContentUtils.ts b/packages/common/src/content/_internal/internalContentUtils.ts index 5a1b9987934..6006578d5d6 100644 --- a/packages/common/src/content/_internal/internalContentUtils.ts +++ b/packages/common/src/content/_internal/internalContentUtils.ts @@ -971,10 +971,10 @@ const isPortalFromUrl = (portalUrl: string): boolean => { export function getSchedulerApiUrl( itemId: string, - requestOptions: IRequestOptions + requestOptions: IUserRequestOptions ): string { const hubApiUrlRoot = getHubApiUrlRoot(requestOptions); - return `${hubApiUrlRoot}/api/download/v1/items/${itemId}/schedule`; + return `${hubApiUrlRoot}/api/download/v1/items/${itemId}/schedule?token=${requestOptions.authentication.token}`; } export function getHubApiUrlRoot(requestOptions: IRequestOptions): string { diff --git a/packages/common/src/content/fetch.ts b/packages/common/src/content/fetch.ts index 617a2315b86..de273b02982 100644 --- a/packages/common/src/content/fetch.ts +++ b/packages/common/src/content/fetch.ts @@ -36,6 +36,7 @@ import { computeProps } from "./_internal/computeProps"; import { isHostedFeatureServiceItem } from "./hostedServiceUtils"; import { setProp } from "../objects"; import { getSchedule, isDownloadSchedulingAvailable } from "./manageSchedule"; +import { IUserRequestOptions } from "@esri/arcgis-rest-auth"; const hasFeatures = (contentType: string) => ["Feature Layer", "Table"].includes(contentType); @@ -284,8 +285,12 @@ export const fetchHubContent = async ( if (isDownloadSchedulingAvailable(requestOptions, access)) { // fetch schedule and add it to enrichments if it exists in schedule API - enrichments.schedule = (await getSchedule(item.id, requestOptions)) - .schedule || { mode: "automatic" }; + enrichments.schedule = ( + await getSchedule( + item.id, + requestOptions as unknown as IUserRequestOptions + ) + ).schedule || { mode: "automatic" }; } return modelToHubEditableContent(model, requestOptions, enrichments); diff --git a/packages/common/src/content/manageSchedule.ts b/packages/common/src/content/manageSchedule.ts index e7c68103a2a..306978a6c1a 100644 --- a/packages/common/src/content/manageSchedule.ts +++ b/packages/common/src/content/manageSchedule.ts @@ -4,6 +4,7 @@ import { cloneObject } from "../util"; import { deepEqual } from "../objects/deepEqual"; import { AccessLevel, IHubEditableContent } from "../core"; import { getSchedulerApiUrl } from "./_internal/internalContentUtils"; +import { IUserRequestOptions } from "@esri/arcgis-rest-auth"; // Any code referencing these functions must first pass isDownloadSchedulingAvailable @@ -15,7 +16,7 @@ import { getSchedulerApiUrl } from "./_internal/internalContentUtils"; */ export const getSchedule = async ( itemId: string, - requestOptions: IRequestOptions + requestOptions: IUserRequestOptions ): Promise => { const fetchResponse = await fetch(getSchedulerApiUrl(itemId, requestOptions)); const schedule = await fetchResponse.json(); @@ -65,7 +66,7 @@ export const getSchedule = async ( export const setSchedule = async ( itemId: string, schedule: IHubSchedule, - requestOptions: IRequestOptions + requestOptions: IUserRequestOptions ): Promise => { const body = cloneObject(schedule); if (body.mode !== "manual") { @@ -98,7 +99,7 @@ export const setSchedule = async ( */ export const deleteSchedule = async ( itemId: string, - requestOptions: IRequestOptions + requestOptions: IUserRequestOptions ): Promise => { const url = getSchedulerApiUrl(itemId, requestOptions); const options = { @@ -121,7 +122,7 @@ export const deleteSchedule = async ( */ export const maybeUpdateSchedule = async ( content: IHubEditableContent, - requestOptions: IRequestOptions + requestOptions: IUserRequestOptions ): Promise => { const scheduleResponse = await getSchedule(content.id, requestOptions); diff --git a/packages/common/test/content/manageSchedule.test.ts b/packages/common/test/content/manageSchedule.test.ts index 463c3970971..fe82c5346e0 100644 --- a/packages/common/test/content/manageSchedule.test.ts +++ b/packages/common/test/content/manageSchedule.test.ts @@ -12,15 +12,19 @@ import { MOCK_HUB_REQOPTS } from "../mocks/mock-auth"; import { IHubEditableContent } from "../../src/core/types/IHubEditableContent"; import * as fetchMock from "fetch-mock"; import { getSchedulerApiUrl } from "../../src/content/_internal/internalContentUtils"; +import { IUserRequestOptions } from "@esri/arcgis-rest-auth"; describe("manageSchedule", () => { afterEach(() => { fetchMock.restore(); }); it("getSchedulerApiUrl: returns the correct url when no version is attached on requestOptions", () => { - const url = getSchedulerApiUrl("123", MOCK_HUB_REQOPTS); + const url = getSchedulerApiUrl( + "123", + MOCK_HUB_REQOPTS as IUserRequestOptions + ); expect(url).toEqual( - "https://hubqa.arcgis.com/api/download/v1/items/123/schedule" + "https://hubqa.arcgis.com/api/download/v1/items/123/schedule?token=fake-token" ); }); it("getSchedulerApiUrl: returns the correct url when v3 is attached on requestOptions", () => { @@ -29,15 +33,18 @@ describe("manageSchedule", () => { hubApiUrl: "https://hubqa.arcgis.com/api/v3", }; - const url = getSchedulerApiUrl("123", requestOptions); + const url = getSchedulerApiUrl( + "123", + requestOptions as IUserRequestOptions + ); expect(url).toEqual( - "https://hubqa.arcgis.com/api/download/v1/items/123/schedule" + "https://hubqa.arcgis.com/api/download/v1/items/123/schedule?token=fake-token" ); }); it("getSchedule: returns an error if no schedule is set", async () => { const item = { id: "123" }; fetchMock.once( - `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule`, + `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule?token=fake-token`, { error: "Not Found", message: `Download schedule for the item ${item.id} is not found.`, @@ -46,7 +53,7 @@ describe("manageSchedule", () => { ); const response: IHubScheduleResponse = await getSchedule( item.id, - MOCK_HUB_REQOPTS + MOCK_HUB_REQOPTS as IUserRequestOptions ); expect(response.message).toEqual( `Download schedule not found for item ${item.id}` @@ -56,7 +63,7 @@ describe("manageSchedule", () => { it("getSchedule: returns schedule of mode 'scheduled' if set", async () => { const item = { id: "123" }; fetchMock.once( - `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule`, + `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule?token=fake-token`, { cadence: "daily", hour: 0, @@ -66,7 +73,7 @@ describe("manageSchedule", () => { ); const response: IHubScheduleResponse = await getSchedule( item.id, - MOCK_HUB_REQOPTS + MOCK_HUB_REQOPTS as IUserRequestOptions ); expect(response.schedule).toEqual({ mode: "scheduled", @@ -79,7 +86,7 @@ describe("manageSchedule", () => { it("getSchedule: returns schedule of mode 'manual' if set", async () => { const item = { id: "123" }; fetchMock.once( - `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule`, + `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule?token=fake-token`, { mode: "manual", itemId: "123", @@ -87,7 +94,7 @@ describe("manageSchedule", () => { ); const response: IHubScheduleResponse = await getSchedule( item.id, - MOCK_HUB_REQOPTS + MOCK_HUB_REQOPTS as IUserRequestOptions ); expect(response.schedule).toEqual({ mode: "manual", @@ -104,13 +111,17 @@ describe("manageSchedule", () => { } as IHubSchedule; fetchMock.post( - `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule`, + `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule?token=fake-token`, { message: "Download schedule set successfully.", } ); - const response = await setSchedule(item.id, schedule, MOCK_HUB_REQOPTS); + const response = await setSchedule( + item.id, + schedule, + MOCK_HUB_REQOPTS as IUserRequestOptions + ); expect(response.message).toEqual("Download schedule set successfully."); expect(fetchMock.calls().length).toBe(1); }); @@ -121,13 +132,17 @@ describe("manageSchedule", () => { } as IHubSchedule; fetchMock.post( - `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule`, + `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule?token=fake-token`, { message: "Download schedule set successfully.", } ); - const response = await setSchedule(item.id, schedule, MOCK_HUB_REQOPTS); + const response = await setSchedule( + item.id, + schedule, + MOCK_HUB_REQOPTS as IUserRequestOptions + ); expect(response.message).toEqual("Download schedule set successfully."); expect(fetchMock.calls().length).toBe(1); }); @@ -141,7 +156,7 @@ describe("manageSchedule", () => { } as IHubSchedule; fetchMock.post( - `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule`, + `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule?token=fake-token`, { title: "unit out of range", message: @@ -149,7 +164,11 @@ describe("manageSchedule", () => { } ); - const response = await setSchedule(item.id, schedule, MOCK_HUB_REQOPTS); + const response = await setSchedule( + item.id, + schedule, + MOCK_HUB_REQOPTS as IUserRequestOptions + ); expect(response.message).toEqual( "you specified 26 (of type number) as a hour, which is invalid" ); @@ -159,13 +178,16 @@ describe("manageSchedule", () => { const item = { id: "123" }; fetchMock.delete( - `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule`, + `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule?token=fake-token`, { message: "Download schedule deleted successfully.", } ); - const response = await deleteSchedule(item.id, MOCK_HUB_REQOPTS); + const response = await deleteSchedule( + item.id, + MOCK_HUB_REQOPTS as IUserRequestOptions + ); expect(response.message).toEqual("Download schedule deleted successfully."); expect(fetchMock.calls().length).toBe(1); }); @@ -177,7 +199,7 @@ describe("manageSchedule", () => { } as IHubEditableContent; fetchMock.get( - `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule`, + `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule?token=fake-token`, { error: "Not Found", message: `Download schedule for the item ${item.id} is not found.`, @@ -185,7 +207,10 @@ describe("manageSchedule", () => { } ); - const response = await maybeUpdateSchedule(content, MOCK_HUB_REQOPTS); + const response = await maybeUpdateSchedule( + content, + MOCK_HUB_REQOPTS as IUserRequestOptions + ); expect(response.message).toEqual( `No schedule set, and incoming schedule is automatic.` ); @@ -205,7 +230,7 @@ describe("manageSchedule", () => { fetchMock .get( - `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule`, + `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule?token=fake-token`, { error: "Not Found", message: `Download schedule for the item ${item.id} is not found.`, @@ -213,13 +238,16 @@ describe("manageSchedule", () => { } ) .post( - `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule`, + `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule?token=fake-token`, { message: "Download schedule set successfully.", } ); - const response = await maybeUpdateSchedule(content, MOCK_HUB_REQOPTS); + const response = await maybeUpdateSchedule( + content, + MOCK_HUB_REQOPTS as IUserRequestOptions + ); expect(response.message).toEqual("Download schedule set successfully."); expect(fetchMock.calls().length).toBe(2); }); @@ -232,7 +260,7 @@ describe("manageSchedule", () => { fetchMock .get( - `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule`, + `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule?token=fake-token`, { cadence: "daily", hour: 0, @@ -240,13 +268,16 @@ describe("manageSchedule", () => { } ) .delete( - `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule`, + `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule?token=fake-token`, { message: "Download schedule deleted successfully.", } ); - const response = await maybeUpdateSchedule(content, MOCK_HUB_REQOPTS); + const response = await maybeUpdateSchedule( + content, + MOCK_HUB_REQOPTS as IUserRequestOptions + ); expect(response.message).toEqual("Download schedule deleted successfully."); expect(fetchMock.calls().length).toBe(2); }); @@ -263,7 +294,7 @@ describe("manageSchedule", () => { } as IHubEditableContent; fetchMock.get( - `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule`, + `https://hubqa.arcgis.com/api/download/v1/items/${item.id}/schedule?token=fake-token`, { cadence: "daily", hour: 0, @@ -271,7 +302,10 @@ describe("manageSchedule", () => { } ); - const response = await maybeUpdateSchedule(content, MOCK_HUB_REQOPTS); + const response = await maybeUpdateSchedule( + content, + MOCK_HUB_REQOPTS as IUserRequestOptions + ); expect(response.message).toEqual( "No action needed as schedules deepEqual each other." );