From 2626a26e1dc25d4274404ebbf44f2958a70270ec Mon Sep 17 00:00:00 2001 From: Caleb Pomar Date: Fri, 23 Aug 2024 09:04:30 -0600 Subject: [PATCH] feat(hub-common): add composeHubContent() for creating an IHubEditableContent from pre-fetched parts (#1630) --- .../common/src/content/composeHubContent.ts | 34 ++++++++++ packages/common/src/content/index.ts | 2 +- .../test/content/composeHubContent.test.ts | 62 +++++++++++++++++++ 3 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 packages/common/src/content/composeHubContent.ts create mode 100644 packages/common/test/content/composeHubContent.test.ts diff --git a/packages/common/src/content/composeHubContent.ts b/packages/common/src/content/composeHubContent.ts new file mode 100644 index 00000000000..9d2dbe8a3d3 --- /dev/null +++ b/packages/common/src/content/composeHubContent.ts @@ -0,0 +1,34 @@ +import { IHubEditableContentEnrichments } from "../items/_enrichments"; +import { IHubEditableContent } from "../core/types/IHubEditableContent"; +import { normalizeItemType } from "./compose"; +import { setProp } from "../objects/set-prop"; +import { modelToHubEditableContent } from "./modelToHubEditableContent"; +import { cloneObject } from "../util"; +import { IItem } from "@esri/arcgis-rest-portal"; +import { IHubRequestOptions } from "../types"; + +/** + * composes a Hub content entity from an item and optional enrichments + * @param item item to compose content from + * @param requestOptions request options (needed to determine certain urls) + * @param enrichments enrichments to use during composition + * @returns content entity + */ +export const composeHubContent = ( + item: IItem, + requestOptions: IHubRequestOptions, + enrichments: IHubEditableContentEnrichments +): IHubEditableContent => { + // we must normalize the underlying item type to account + // for older items (e.g. sites that are type "Web Mapping + // Application") before we map the model to a Hub Entity + const normalizedItem = cloneObject(item); + const type = normalizeItemType(item); + setProp("type", type, normalizedItem); + + return modelToHubEditableContent( + { item: normalizedItem }, + requestOptions, + enrichments + ); +}; diff --git a/packages/common/src/content/index.ts b/packages/common/src/content/index.ts index 44a80caa309..19589fb2a1a 100644 --- a/packages/common/src/content/index.ts +++ b/packages/common/src/content/index.ts @@ -1,10 +1,10 @@ export * from "./compose"; export * from "./get-family"; -export * from "./compose"; export * from "./contentUtils"; export * from "./edit"; export * from "./fetchContent"; export * from "./fetchHubContent"; +export * from "./composeHubContent"; export * from "./modelToHubEditableContent"; export * from "./get-family"; export * from "./HubContent"; diff --git a/packages/common/test/content/composeHubContent.test.ts b/packages/common/test/content/composeHubContent.test.ts new file mode 100644 index 00000000000..29c2e7de64c --- /dev/null +++ b/packages/common/test/content/composeHubContent.test.ts @@ -0,0 +1,62 @@ +import { + HOSTED_FEATURE_SERVICE_DEFINITION, + HOSTED_FEATURE_SERVICE_GUID, + HOSTED_FEATURE_SERVICE_ITEM, + PDF_GUID, + PDF_ITEM, +} from "./fixtures"; +import { MOCK_AUTH } from "../mocks/mock-auth"; +import { + composeHubContent, + IHubRequestOptions, + IServiceExtendedProps, +} from "../../src"; +import { IHubEditableContentEnrichments } from "../../src/items/_enrichments"; +import { IItem } from "@esri/arcgis-rest-portal"; + +describe("composeHubContent", () => { + it("composes feature service content", () => { + const requestOptions = { + portal: MOCK_AUTH.portal, + authentication: MOCK_AUTH, + } as IHubRequestOptions; + + const enrichments: IHubEditableContentEnrichments = { + server: HOSTED_FEATURE_SERVICE_DEFINITION, + }; + + const chk = composeHubContent( + HOSTED_FEATURE_SERVICE_ITEM, + requestOptions, + enrichments + ); + const extendedProps = chk.extendedProps as IServiceExtendedProps; + expect(chk.id).toBe(HOSTED_FEATURE_SERVICE_GUID); + expect(chk.owner).toBe(HOSTED_FEATURE_SERVICE_ITEM.owner); + expect(extendedProps.serverExtractCapability).toBeTruthy(); + expect(extendedProps.serverQueryCapability).toBeTruthy(); + }); + + it("composes non-service content", () => { + const requestOptions = { authentication: MOCK_AUTH } as IHubRequestOptions; + const enrichments: IHubEditableContentEnrichments = { metadata: null }; + + const chk = composeHubContent(PDF_ITEM, requestOptions, enrichments); + expect(chk.id).toBe(PDF_GUID); + expect(chk.owner).toBe(PDF_ITEM.owner); + }); + + it("normalizes the item type", () => { + const item = { + id: "ae3", + type: "Web Mapping Application", + typeKeywords: ["hubSite"], + } as IItem; + const requestOptions = { authentication: MOCK_AUTH } as IHubRequestOptions; + const enrichments: IHubEditableContentEnrichments = { metadata: null }; + + const chk = composeHubContent(item, requestOptions, enrichments); + + expect(chk.type).toBe("Hub Site Application"); + }); +});