From bd8f7c26d97eb0b33e633f252162d6e85f68cd12 Mon Sep 17 00:00:00 2001 From: ramukaritik Date: Mon, 30 Oct 2023 17:31:03 +0530 Subject: [PATCH 1/6] rootpageid added in v2 data model --- src/web/client/WebExtensionContext.ts | 6 +++-- src/web/client/common/errorHandler.ts | 1 + src/web/client/context/entityData.ts | 8 +++++- src/web/client/context/entityDataMap.ts | 6 +++-- src/web/client/dal/remoteFetchProvider.ts | 32 +++++++++++++++++++---- src/web/client/schema/constants.ts | 1 + src/web/client/schema/portalSchema.ts | 11 ++++++++ 7 files changed, 55 insertions(+), 10 deletions(-) diff --git a/src/web/client/WebExtensionContext.ts b/src/web/client/WebExtensionContext.ts index ec8f8ae6..d77f0bf2 100644 --- a/src/web/client/WebExtensionContext.ts +++ b/src/web/client/WebExtensionContext.ts @@ -367,7 +367,8 @@ class WebExtensionContext implements IWebExtensionContext { attributePath: IAttributePath, attributeContent: string, mappingEntityId?: string, - fileUri?: string + fileUri?: string, + rootpageid?: string, ) { this.entityDataMap.setEntity( entityId, @@ -376,7 +377,8 @@ class WebExtensionContext implements IWebExtensionContext { attributePath, attributeContent, mappingEntityId, - fileUri); + fileUri, + rootpageid); } public async updateSingleFileUrisInContext(uri: vscode.Uri) { diff --git a/src/web/client/common/errorHandler.ts b/src/web/client/common/errorHandler.ts index 34bb100b..48082eca 100644 --- a/src/web/client/common/errorHandler.ts +++ b/src/web/client/common/errorHandler.ts @@ -57,6 +57,7 @@ export const ERRORS = { LANGUAGE_CODE_ID_VALUE_NULL: "Language code ID is empty", LANGUAGE_CODE_EMPTY: "Language code is empty", BULKHEAD_LIMITS_EXCEEDED: "Bulkhead queue limits exceeded", + CONTENT_EMPTY: "Content is empty", }; export function showErrorDialog(errorString: string, detailMessage?: string) { diff --git a/src/web/client/context/entityData.ts b/src/web/client/context/entityData.ts index de1894d5..729e1bdf 100644 --- a/src/web/client/context/entityData.ts +++ b/src/web/client/context/entityData.ts @@ -19,6 +19,7 @@ export class EntityData implements IEntityData { private _entityColumn!: Map; private _mappingEntityId?: string; private _filePath?: Set; + private _rootpageid?: string; public get entityName(): string { return this._entityName; @@ -38,6 +39,9 @@ export class EntityData implements IEntityData { public get filePath(): Set | undefined { return this._filePath; } + public get rootpageid(): string | undefined { + return this._rootpageid; + } // Setters public set setEntityEtag(value: string) { @@ -50,7 +54,8 @@ export class EntityData implements IEntityData { entityEtag: string, entityColumn: Map, mappingEntityId?: string, - filePath?: Set + filePath?: Set, + rootpageid?: string ) { this._entityId = entityId; this._entityName = entityName; @@ -58,5 +63,6 @@ export class EntityData implements IEntityData { this._entityColumn = entityColumn; this._mappingEntityId = mappingEntityId; this._filePath = filePath; + this._rootpageid = rootpageid; } } diff --git a/src/web/client/context/entityDataMap.ts b/src/web/client/context/entityDataMap.ts index ea570b4b..9193d873 100644 --- a/src/web/client/context/entityDataMap.ts +++ b/src/web/client/context/entityDataMap.ts @@ -35,7 +35,8 @@ export class EntityDataMap { attributePath: IAttributePath, attributeContent: string, mappingEntityId?: string, - fileUri?: string + fileUri?: string, + rootpageid?: string ) { let entityColumnMap = new Map(); const existingEntity = this.entityMap.get(entityId); @@ -56,7 +57,8 @@ export class EntityDataMap { odataEtag, entityColumnMap, mappingEntityId, - filePath + filePath, + rootpageid ); this.entityMap.set(entityId, entityData); } diff --git a/src/web/client/dal/remoteFetchProvider.ts b/src/web/client/dal/remoteFetchProvider.ts index e4e2948a..44e8a587 100644 --- a/src/web/client/dal/remoteFetchProvider.ts +++ b/src/web/client/dal/remoteFetchProvider.ts @@ -271,6 +271,16 @@ async function createContentFiles( } const attributeArray = attributes.split(","); + + // Get rootpage id + const content = entityDetails?.get(schemaEntityKey.CONTENT); + + const contentValue = content ? result[content] : null; + if (contentValue === null) { + throw new Error(ERRORS.CONTENT_EMPTY); + } + const rootpageid = getRootPageId(contentValue); + await processDataAndCreateFile(attributeArray, attributeExtension, entityName, @@ -282,7 +292,8 @@ async function createContentFiles( languageCode, filePathInPortalFS, portalsFS, - defaultFileInfo) + defaultFileInfo, + rootpageid) } catch (error) { const errorMsg = (error as Error)?.message; @@ -298,6 +309,11 @@ async function createContentFiles( } } +function getRootPageId(contentValue: string) : string { + const contentValueJson = JSON.parse(contentValue); + return contentValueJson.rootwebpageid; +} + async function processDataAndCreateFile( attributeArray: string[], attributeExtension: string, @@ -312,6 +328,7 @@ async function processDataAndCreateFile( filePathInPortalFS: string, portalsFS: PortalsFS, defaultFileInfo?: IFileInfo, + rootpageid?: string ) { const attributeExtensionMap = attributeExtension as unknown as Map< string, @@ -363,7 +380,8 @@ async function processDataAndCreateFile( mappingEntityFetchQuery, entityId, dataverseOrgUrl, - portalsFS + portalsFS, + rootpageid, ); } } @@ -409,7 +427,8 @@ async function createFile( mappingEntityFetchQuery: string | undefined, entityId: string, dataverseOrgUrl: string, - portalsFS: PortalsFS + portalsFS: PortalsFS, + rootpageid?: string ) { const base64Encoded: boolean = isBase64Encoded( entityName, @@ -458,7 +477,8 @@ async function createFile( mimeType ?? result[Constants.MIMETYPE], isPreloadedContent, mappingEntityId, - getLogicalEntityName(result, logicalEntityName) + getLogicalEntityName(result, logicalEntityName), + rootpageid, ); } @@ -608,7 +628,8 @@ async function createVirtualFile( mimeType?: string, isPreloadedContent?: boolean, mappingEntityId?: string, - logicalEntityName?: string + logicalEntityName?: string, + rootpageid?: string, ) { // Maintain file information in context await WebExtensionContext.updateFileDetailsInContext( @@ -642,5 +663,6 @@ async function createVirtualFile( originalAttributeContent, mappingEntityId, fileUri, + rootpageid, ); } diff --git a/src/web/client/schema/constants.ts b/src/web/client/schema/constants.ts index 8bcdfb58..9559dbe2 100644 --- a/src/web/client/schema/constants.ts +++ b/src/web/client/schema/constants.ts @@ -30,6 +30,7 @@ export enum schemaEntityKey { MAPPING_ENTITY_FETCH_QUERY = "_mappingEntityFetchQuery", EXPORT_TYPE = "_exporttype", ATTRIBUTES = "_attributes", + CONTENT = "_content", } export enum schemaEntityName { diff --git a/src/web/client/schema/portalSchema.ts b/src/web/client/schema/portalSchema.ts index 0eadce30..add145e9 100644 --- a/src/web/client/schema/portalSchema.ts +++ b/src/web/client/schema/portalSchema.ts @@ -253,6 +253,7 @@ export const portal_schema_V2 = { _exporttype: "SingleFolder", _fetchQueryParameters: "?$select=name,powerpagesiteid,content", _multiFileFetchQueryParameters: "?$select=name,powerpagesiteid,content", + _content: "content", }, { relationships: "", @@ -268,6 +269,7 @@ export const portal_schema_V2 = { "?$select=powerpagesitelanguageid,languagecode,lcid", _multiFileFetchQueryParameters: "?$select=powerpagesitelanguageid,languagecode,lcid", + _content: "content", }, { relationships: "", @@ -283,6 +285,7 @@ export const portal_schema_V2 = { "?$select=powerpagesitelanguageid,languagecode,lcid", _multiFileFetchQueryParameters: "?$select=powerpagesitelanguageid,languagecode,lcid", + _content: "content", }, { relationships: "", @@ -307,6 +310,7 @@ export const portal_schema_V2 = { ["content.customjavascript", "customjs.js"], ["content.copy", "webpage.copy.html"], ]), + _content: "content", }, { relationships: "", @@ -328,6 +332,7 @@ export const portal_schema_V2 = { _mappingEntityFetchQuery: new Map([ ["filecontent", "({entityId})/filecontent"], ]), + _content: "content", }, { relationships: "", @@ -346,6 +351,7 @@ export const portal_schema_V2 = { "?$filter=_powerpagesiteid_value eq {websiteId} and powerpagecomponenttype eq 7 and _powerpagesitelanguageid_value ne null &$select=name,content,_powerpagesitelanguageid_value&$count=true", _attributes: "content.value", _attributesExtension: new Map([["content.value", "html"]]), + _content: "content", }, { relationships: "", @@ -364,6 +370,7 @@ export const portal_schema_V2 = { "?$filter=_powerpagesiteid_value eq {websiteId} and powerpagecomponenttype eq 8 &$select=name,content,_powerpagesitelanguageid_value&$count=true", _attributes: "content.source", _attributesExtension: new Map([["content.source", "html"]]), + _content: "content", }, { relationships: "", @@ -383,6 +390,7 @@ export const portal_schema_V2 = { "?$filter=_powerpagesiteid_value eq {websiteId} and powerpagecomponenttype eq 17 &$select=name,content&$count=true", _attributes: "content.registerstartupscript", _attributesExtension: new Map([["content.registerstartupscript", "list.customjs.js"]]), + _content: "content", }, { relationships: "", @@ -402,6 +410,7 @@ export const portal_schema_V2 = { "?$filter=_powerpagesiteid_value eq {websiteId} and powerpagecomponenttype eq 15 &$select=name,content&$count=true", _attributes: "content.registerstartupscript", _attributesExtension: new Map([["content.registerstartupscript", "basicform.customjs.js"]]), + _content: "content", }, { relationships: "", @@ -420,6 +429,7 @@ export const portal_schema_V2 = { "?$filter=_powerpagesiteid_value eq {websiteId} and powerpagecomponenttype eq 19 &$select=name,content &$count=true", _attributes: "content.webFormSteps", _attributesExtension: new Map([]), + _content: "content", }, { relationships: "", @@ -438,6 +448,7 @@ export const portal_schema_V2 = { _multiFileFetchQueryParameters: "?$filter=_powerpagesiteid_value eq {websiteId} and powerpagecomponenttype eq 20 &$select=name,content &$count=true", _attributes: "content.registerstartupscript", _attributesExtension: new Map([["content.registerstartupscript", "advancedformstep.customjs.js"]]), + _content: "content", }, ], }, From 3b4633c20470ed2aba9f23386e71ce1fcbf06117 Mon Sep 17 00:00:00 2001 From: ramukaritik Date: Thu, 2 Nov 2023 15:30:02 +0530 Subject: [PATCH 2/6] added rootwebpageid in v1 and enhanced some edge cases in v2 data model --- src/web/client/WebExtensionContext.ts | 4 +-- src/web/client/common/errorHandler.ts | 1 + src/web/client/context/entityData.ts | 10 +++--- src/web/client/context/entityDataMap.ts | 4 +-- src/web/client/dal/remoteFetchProvider.ts | 39 ++++++++++++++++------- src/web/client/schema/constants.ts | 1 + src/web/client/schema/portalSchema.ts | 13 ++------ 7 files changed, 40 insertions(+), 32 deletions(-) diff --git a/src/web/client/WebExtensionContext.ts b/src/web/client/WebExtensionContext.ts index d77f0bf2..e355ca5b 100644 --- a/src/web/client/WebExtensionContext.ts +++ b/src/web/client/WebExtensionContext.ts @@ -368,7 +368,7 @@ class WebExtensionContext implements IWebExtensionContext { attributeContent: string, mappingEntityId?: string, fileUri?: string, - rootpageid?: string, + rootWebPageId?: string, ) { this.entityDataMap.setEntity( entityId, @@ -378,7 +378,7 @@ class WebExtensionContext implements IWebExtensionContext { attributeContent, mappingEntityId, fileUri, - rootpageid); + rootWebPageId); } public async updateSingleFileUrisInContext(uri: vscode.Uri) { diff --git a/src/web/client/common/errorHandler.ts b/src/web/client/common/errorHandler.ts index 48082eca..8422cfc0 100644 --- a/src/web/client/common/errorHandler.ts +++ b/src/web/client/common/errorHandler.ts @@ -58,6 +58,7 @@ export const ERRORS = { LANGUAGE_CODE_EMPTY: "Language code is empty", BULKHEAD_LIMITS_EXCEEDED: "Bulkhead queue limits exceeded", CONTENT_EMPTY: "Content is empty", + ROOT_WEB_PAGE_ID_EMPTY: "Root web page ID is empty", }; export function showErrorDialog(errorString: string, detailMessage?: string) { diff --git a/src/web/client/context/entityData.ts b/src/web/client/context/entityData.ts index 729e1bdf..e32be9d5 100644 --- a/src/web/client/context/entityData.ts +++ b/src/web/client/context/entityData.ts @@ -19,7 +19,7 @@ export class EntityData implements IEntityData { private _entityColumn!: Map; private _mappingEntityId?: string; private _filePath?: Set; - private _rootpageid?: string; + private _rootWebPageId?: string; public get entityName(): string { return this._entityName; @@ -39,8 +39,8 @@ export class EntityData implements IEntityData { public get filePath(): Set | undefined { return this._filePath; } - public get rootpageid(): string | undefined { - return this._rootpageid; + public get rootWebPageId(): string | undefined { + return this._rootWebPageId; } // Setters @@ -55,7 +55,7 @@ export class EntityData implements IEntityData { entityColumn: Map, mappingEntityId?: string, filePath?: Set, - rootpageid?: string + rootWebPageId?: string ) { this._entityId = entityId; this._entityName = entityName; @@ -63,6 +63,6 @@ export class EntityData implements IEntityData { this._entityColumn = entityColumn; this._mappingEntityId = mappingEntityId; this._filePath = filePath; - this._rootpageid = rootpageid; + this._rootWebPageId = rootWebPageId; } } diff --git a/src/web/client/context/entityDataMap.ts b/src/web/client/context/entityDataMap.ts index 9193d873..b856e8fc 100644 --- a/src/web/client/context/entityDataMap.ts +++ b/src/web/client/context/entityDataMap.ts @@ -36,7 +36,7 @@ export class EntityDataMap { attributeContent: string, mappingEntityId?: string, fileUri?: string, - rootpageid?: string + rootWebPageId?: string ) { let entityColumnMap = new Map(); const existingEntity = this.entityMap.get(entityId); @@ -58,7 +58,7 @@ export class EntityDataMap { entityColumnMap, mappingEntityId, filePath, - rootpageid + rootWebPageId ); this.entityMap.set(entityId, entityData); } diff --git a/src/web/client/dal/remoteFetchProvider.ts b/src/web/client/dal/remoteFetchProvider.ts index 44e8a587..3c4e65cd 100644 --- a/src/web/client/dal/remoteFetchProvider.ts +++ b/src/web/client/dal/remoteFetchProvider.ts @@ -273,13 +273,28 @@ async function createContentFiles( const attributeArray = attributes.split(","); // Get rootpage id - const content = entityDetails?.get(schemaEntityKey.CONTENT); + let rootWebPageId = undefined; - const contentValue = content ? result[content] : null; - if (contentValue === null) { - throw new Error(ERRORS.CONTENT_EMPTY); + if (isPortalVersionV2()) { + const content = entityDetails?.get(schemaEntityKey.CONTENT); + + if (content) { + const contentValue = content ? result[content] : null; + if (contentValue === null) { + throw new Error(ERRORS.CONTENT_EMPTY); + } + rootWebPageId = getRootPageId(contentValue); + } + } else if (isPortalVersionV1()) { + const rootpageidAttribute = entityDetails?.get(schemaEntityKey.ROOT_WEB_PAGE_ID); + + if (rootpageidAttribute) { + rootWebPageId = rootpageidAttribute ? result[rootpageidAttribute] : null; + if (rootWebPageId === null) { + throw new Error(ERRORS.ROOT_WEB_PAGE_ID_EMPTY); + } + } } - const rootpageid = getRootPageId(contentValue); await processDataAndCreateFile(attributeArray, attributeExtension, @@ -293,7 +308,7 @@ async function createContentFiles( filePathInPortalFS, portalsFS, defaultFileInfo, - rootpageid) + rootWebPageId) } catch (error) { const errorMsg = (error as Error)?.message; @@ -328,7 +343,7 @@ async function processDataAndCreateFile( filePathInPortalFS: string, portalsFS: PortalsFS, defaultFileInfo?: IFileInfo, - rootpageid?: string + rootWebPageId?: string ) { const attributeExtensionMap = attributeExtension as unknown as Map< string, @@ -381,7 +396,7 @@ async function processDataAndCreateFile( entityId, dataverseOrgUrl, portalsFS, - rootpageid, + rootWebPageId, ); } } @@ -428,7 +443,7 @@ async function createFile( entityId: string, dataverseOrgUrl: string, portalsFS: PortalsFS, - rootpageid?: string + rootWebPageId?: string ) { const base64Encoded: boolean = isBase64Encoded( entityName, @@ -478,7 +493,7 @@ async function createFile( isPreloadedContent, mappingEntityId, getLogicalEntityName(result, logicalEntityName), - rootpageid, + rootWebPageId, ); } @@ -629,7 +644,7 @@ async function createVirtualFile( isPreloadedContent?: boolean, mappingEntityId?: string, logicalEntityName?: string, - rootpageid?: string, + rootWebPageId?: string, ) { // Maintain file information in context await WebExtensionContext.updateFileDetailsInContext( @@ -663,6 +678,6 @@ async function createVirtualFile( originalAttributeContent, mappingEntityId, fileUri, - rootpageid, + rootWebPageId, ); } diff --git a/src/web/client/schema/constants.ts b/src/web/client/schema/constants.ts index 9559dbe2..05f34937 100644 --- a/src/web/client/schema/constants.ts +++ b/src/web/client/schema/constants.ts @@ -31,6 +31,7 @@ export enum schemaEntityKey { EXPORT_TYPE = "_exporttype", ATTRIBUTES = "_attributes", CONTENT = "_content", + ROOT_WEB_PAGE_ID = "_rootwebpageid", } export enum schemaEntityName { diff --git a/src/web/client/schema/portalSchema.ts b/src/web/client/schema/portalSchema.ts index add145e9..7c9a0b74 100644 --- a/src/web/client/schema/portalSchema.ts +++ b/src/web/client/schema/portalSchema.ts @@ -80,13 +80,14 @@ export const portal_schema_V1 = { _fetchQueryParameters: "?$filter=adx_webpageid eq {entityId} &$select=adx_name,adx_copy,adx_customcss,adx_customjavascript,adx_partialurl,_adx_webpagelanguageid_value&$count=true", _multiFileFetchQueryParameters: - "?$filter=_adx_websiteid_value eq {websiteId} and _adx_webpagelanguageid_value ne null &$select=adx_webpageid,_adx_webpagelanguageid_value,adx_name,adx_copy,adx_customcss,adx_customjavascript,adx_partialurl&$count=true", + "?$filter=_adx_websiteid_value eq {websiteId} and _adx_webpagelanguageid_value ne null &$select=adx_webpageid,_adx_webpagelanguageid_value,adx_name,adx_copy,adx_customcss,adx_customjavascript,adx_partialurl,_adx_rootwebpageid_value&$count=true", _attributes: "adx_customcss,adx_customjavascript,adx_copy", _attributesExtension: new Map([ ["adx_customcss", "customcss.css"], ["adx_customjavascript", "customjs.js"], ["adx_copy", "webpage.copy.html"], ]), + _rootwebpageid: "_adx_rootwebpageid_value", }, { relationships: "", @@ -253,7 +254,6 @@ export const portal_schema_V2 = { _exporttype: "SingleFolder", _fetchQueryParameters: "?$select=name,powerpagesiteid,content", _multiFileFetchQueryParameters: "?$select=name,powerpagesiteid,content", - _content: "content", }, { relationships: "", @@ -269,7 +269,6 @@ export const portal_schema_V2 = { "?$select=powerpagesitelanguageid,languagecode,lcid", _multiFileFetchQueryParameters: "?$select=powerpagesitelanguageid,languagecode,lcid", - _content: "content", }, { relationships: "", @@ -285,7 +284,6 @@ export const portal_schema_V2 = { "?$select=powerpagesitelanguageid,languagecode,lcid", _multiFileFetchQueryParameters: "?$select=powerpagesitelanguageid,languagecode,lcid", - _content: "content", }, { relationships: "", @@ -332,7 +330,6 @@ export const portal_schema_V2 = { _mappingEntityFetchQuery: new Map([ ["filecontent", "({entityId})/filecontent"], ]), - _content: "content", }, { relationships: "", @@ -351,7 +348,6 @@ export const portal_schema_V2 = { "?$filter=_powerpagesiteid_value eq {websiteId} and powerpagecomponenttype eq 7 and _powerpagesitelanguageid_value ne null &$select=name,content,_powerpagesitelanguageid_value&$count=true", _attributes: "content.value", _attributesExtension: new Map([["content.value", "html"]]), - _content: "content", }, { relationships: "", @@ -370,7 +366,6 @@ export const portal_schema_V2 = { "?$filter=_powerpagesiteid_value eq {websiteId} and powerpagecomponenttype eq 8 &$select=name,content,_powerpagesitelanguageid_value&$count=true", _attributes: "content.source", _attributesExtension: new Map([["content.source", "html"]]), - _content: "content", }, { relationships: "", @@ -390,7 +385,6 @@ export const portal_schema_V2 = { "?$filter=_powerpagesiteid_value eq {websiteId} and powerpagecomponenttype eq 17 &$select=name,content&$count=true", _attributes: "content.registerstartupscript", _attributesExtension: new Map([["content.registerstartupscript", "list.customjs.js"]]), - _content: "content", }, { relationships: "", @@ -410,7 +404,6 @@ export const portal_schema_V2 = { "?$filter=_powerpagesiteid_value eq {websiteId} and powerpagecomponenttype eq 15 &$select=name,content&$count=true", _attributes: "content.registerstartupscript", _attributesExtension: new Map([["content.registerstartupscript", "basicform.customjs.js"]]), - _content: "content", }, { relationships: "", @@ -429,7 +422,6 @@ export const portal_schema_V2 = { "?$filter=_powerpagesiteid_value eq {websiteId} and powerpagecomponenttype eq 19 &$select=name,content &$count=true", _attributes: "content.webFormSteps", _attributesExtension: new Map([]), - _content: "content", }, { relationships: "", @@ -448,7 +440,6 @@ export const portal_schema_V2 = { _multiFileFetchQueryParameters: "?$filter=_powerpagesiteid_value eq {websiteId} and powerpagecomponenttype eq 20 &$select=name,content &$count=true", _attributes: "content.registerstartupscript", _attributesExtension: new Map([["content.registerstartupscript", "advancedformstep.customjs.js"]]), - _content: "content", }, ], }, From d707fde5a3da6d505878a5129f287213408cda76 Mon Sep 17 00:00:00 2001 From: ramukaritik Date: Mon, 6 Nov 2023 09:33:37 +0530 Subject: [PATCH 3/6] getting rootwebpageid for v1 and v2 data model --- src/web/client/dal/remoteFetchProvider.ts | 43 +++++++---------------- src/web/client/schema/portalSchema.ts | 4 +-- src/web/client/telemetry/constants.ts | 3 +- src/web/client/utilities/commonUtil.ts | 19 ++++++++++ 4 files changed, 36 insertions(+), 33 deletions(-) diff --git a/src/web/client/dal/remoteFetchProvider.ts b/src/web/client/dal/remoteFetchProvider.ts index 3c4e65cd..6e2e9dcd 100644 --- a/src/web/client/dal/remoteFetchProvider.ts +++ b/src/web/client/dal/remoteFetchProvider.ts @@ -8,6 +8,7 @@ import { convertContentToUint8Array, GetFileContent, GetFileNameWithExtension, + getRootWebPageId, getSanitizedFileName, isPortalVersionV1, isPortalVersionV2, @@ -272,29 +273,8 @@ async function createContentFiles( const attributeArray = attributes.split(","); - // Get rootpage id - let rootWebPageId = undefined; - - if (isPortalVersionV2()) { - const content = entityDetails?.get(schemaEntityKey.CONTENT); - - if (content) { - const contentValue = content ? result[content] : null; - if (contentValue === null) { - throw new Error(ERRORS.CONTENT_EMPTY); - } - rootWebPageId = getRootPageId(contentValue); - } - } else if (isPortalVersionV1()) { - const rootpageidAttribute = entityDetails?.get(schemaEntityKey.ROOT_WEB_PAGE_ID); - - if (rootpageidAttribute) { - rootWebPageId = rootpageidAttribute ? result[rootpageidAttribute] : null; - if (rootWebPageId === null) { - throw new Error(ERRORS.ROOT_WEB_PAGE_ID_EMPTY); - } - } - } + // Get rootpage id Attribute + const rootWebPageIdAttribute = entityDetails?.get(schemaEntityKey.ROOT_WEB_PAGE_ID); await processDataAndCreateFile(attributeArray, attributeExtension, @@ -308,7 +288,7 @@ async function createContentFiles( filePathInPortalFS, portalsFS, defaultFileInfo, - rootWebPageId) + rootWebPageIdAttribute) } catch (error) { const errorMsg = (error as Error)?.message; @@ -324,11 +304,6 @@ async function createContentFiles( } } -function getRootPageId(contentValue: string) : string { - const contentValueJson = JSON.parse(contentValue); - return contentValueJson.rootwebpageid; -} - async function processDataAndCreateFile( attributeArray: string[], attributeExtension: string, @@ -343,7 +318,7 @@ async function processDataAndCreateFile( filePathInPortalFS: string, portalsFS: PortalsFS, defaultFileInfo?: IFileInfo, - rootWebPageId?: string + rootWebPageIdAttribute?: string ) { const attributeExtensionMap = attributeExtension as unknown as Map< string, @@ -383,6 +358,14 @@ async function processDataAndCreateFile( fileNameWithExtension = defaultFileInfo?.fileName; } + // Get rootpage id + let rootWebPageId = undefined; + + if (rootWebPageIdAttribute) { + const rootWebPageIdPath : IAttributePath = getAttributePath(rootWebPageIdAttribute); + rootWebPageId = getRootWebPageId(result, rootWebPageIdPath, entityName, entityId); + } + if (fileCreationValid) { fileUri = filePathInPortalFS + fileNameWithExtension; await createFile( diff --git a/src/web/client/schema/portalSchema.ts b/src/web/client/schema/portalSchema.ts index 7c9a0b74..55249016 100644 --- a/src/web/client/schema/portalSchema.ts +++ b/src/web/client/schema/portalSchema.ts @@ -78,7 +78,7 @@ export const portal_schema_V1 = { _languagefield: "_adx_webpagelanguageid_value", _languagegroupby: "adx_rootwebpageid", _fetchQueryParameters: - "?$filter=adx_webpageid eq {entityId} &$select=adx_name,adx_copy,adx_customcss,adx_customjavascript,adx_partialurl,_adx_webpagelanguageid_value&$count=true", + "?$filter=adx_webpageid eq {entityId} &$select=adx_name,adx_copy,adx_customcss,adx_customjavascript,adx_partialurl,_adx_webpagelanguageid_value,_adx_rootwebpageid_value&$count=true", _multiFileFetchQueryParameters: "?$filter=_adx_websiteid_value eq {websiteId} and _adx_webpagelanguageid_value ne null &$select=adx_webpageid,_adx_webpagelanguageid_value,adx_name,adx_copy,adx_customcss,adx_customjavascript,adx_partialurl,_adx_rootwebpageid_value&$count=true", _attributes: "adx_customcss,adx_customjavascript,adx_copy", @@ -308,7 +308,7 @@ export const portal_schema_V2 = { ["content.customjavascript", "customjs.js"], ["content.copy", "webpage.copy.html"], ]), - _content: "content", + _rootwebpageid: "content.rootwebpageid" }, { relationships: "", diff --git a/src/web/client/telemetry/constants.ts b/src/web/client/telemetry/constants.ts index 34dcfe78..81d00ca0 100644 --- a/src/web/client/telemetry/constants.ts +++ b/src/web/client/telemetry/constants.ts @@ -98,5 +98,6 @@ export enum telemetryEventNames { WEB_EXTENSION_BACK_TO_STUDIO_TRIGGERED = 'webExtensionBackToStudioTriggered', WEB_EXTENSION_PREVIEW_SITE_TRIGGERED = 'webExtensionPreviewSiteTriggered', WEB_EXTENSION_IMAGE_EDIT_SUPPORTED_FILE_EXTENSION = 'webExtensionImageEditSupportedFileExtension', - WEB_EXTENSION_SAVE_IMAGE_FILE_TRIGGERED = 'webExtensionSaveImageFileTriggered' + WEB_EXTENSION_SAVE_IMAGE_FILE_TRIGGERED = 'webExtensionSaveImageFileTriggered', + WEB_EXTENSION_GET_ROOT_PAGE_ID_ERROR = 'webExtensionGetRootPageIdError', } diff --git a/src/web/client/utilities/commonUtil.ts b/src/web/client/utilities/commonUtil.ts index a6aff10f..9dc522d7 100644 --- a/src/web/client/utilities/commonUtil.ts +++ b/src/web/client/utilities/commonUtil.ts @@ -264,3 +264,22 @@ export function getImageFileContent(fileFsPath: string, fileContent: Uint8Array) return webFileV2 ? fileContent : Buffer.from(fileContent).toString(BASE_64); } + +export function getRootWebPageId(result: any, attributePath: IAttributePath, entityName: string, entityId: string) { + let rootWebPageId = result[attributePath.source] ?? NO_CONTENT; + + try { + if (result[attributePath.source] && attributePath.relativePath.length) { + rootWebPageId = + JSON.parse(result[attributePath.source])[attributePath.relativePath] ?? NO_CONTENT; + } + } + catch (error) { + const errorMsg = (error as Error)?.message; + WebExtensionContext.telemetry.sendErrorTelemetry(telemetryEventNames.WEB_EXTENSION_GET_ROOT_PAGE_ID_ERROR, + getRootWebPageId.name, + `For ${entityName} with entityId ${entityId} and attributePath ${JSON.stringify(attributePath)} error: ${errorMsg}`); + } + + return rootWebPageId; +} From b5884c4b902d4e29edbc1f828a597cd1462b3e33 Mon Sep 17 00:00:00 2001 From: ramukaritik Date: Mon, 6 Nov 2023 09:38:46 +0530 Subject: [PATCH 4/6] removing unused logs --- src/web/client/common/errorHandler.ts | 2 -- src/web/client/schema/constants.ts | 1 - 2 files changed, 3 deletions(-) diff --git a/src/web/client/common/errorHandler.ts b/src/web/client/common/errorHandler.ts index 8422cfc0..34bb100b 100644 --- a/src/web/client/common/errorHandler.ts +++ b/src/web/client/common/errorHandler.ts @@ -57,8 +57,6 @@ export const ERRORS = { LANGUAGE_CODE_ID_VALUE_NULL: "Language code ID is empty", LANGUAGE_CODE_EMPTY: "Language code is empty", BULKHEAD_LIMITS_EXCEEDED: "Bulkhead queue limits exceeded", - CONTENT_EMPTY: "Content is empty", - ROOT_WEB_PAGE_ID_EMPTY: "Root web page ID is empty", }; export function showErrorDialog(errorString: string, detailMessage?: string) { diff --git a/src/web/client/schema/constants.ts b/src/web/client/schema/constants.ts index 05f34937..d32a17f5 100644 --- a/src/web/client/schema/constants.ts +++ b/src/web/client/schema/constants.ts @@ -30,7 +30,6 @@ export enum schemaEntityKey { MAPPING_ENTITY_FETCH_QUERY = "_mappingEntityFetchQuery", EXPORT_TYPE = "_exporttype", ATTRIBUTES = "_attributes", - CONTENT = "_content", ROOT_WEB_PAGE_ID = "_rootwebpageid", } From 53cb3fea33dd60a1fed65da745e916058a95baad Mon Sep 17 00:00:00 2001 From: ramukaritik Date: Tue, 7 Nov 2023 14:12:32 +0530 Subject: [PATCH 5/6] created a common fuction to destructure attribute value --- src/web/client/dal/remoteFetchProvider.ts | 13 +++++----- src/web/client/telemetry/constants.ts | 3 +-- src/web/client/utilities/commonUtil.ts | 31 +++++------------------ 3 files changed, 13 insertions(+), 34 deletions(-) diff --git a/src/web/client/dal/remoteFetchProvider.ts b/src/web/client/dal/remoteFetchProvider.ts index 6e2e9dcd..6c6b9727 100644 --- a/src/web/client/dal/remoteFetchProvider.ts +++ b/src/web/client/dal/remoteFetchProvider.ts @@ -6,9 +6,8 @@ import * as vscode from "vscode"; import { convertContentToUint8Array, - GetFileContent, GetFileNameWithExtension, - getRootWebPageId, + getAttributeContent, getSanitizedFileName, isPortalVersionV1, isPortalVersionV2, @@ -337,7 +336,7 @@ async function processDataAndCreateFile( ); if (fileExtension === undefined) { - const expandedContent = GetFileContent(result, attributePath, entityName, entityId); + const expandedContent = getAttributeContent(result, attributePath, entityName, entityId); if (expandedContent !== Constants.NO_CONTENT) { await processExpandedData( @@ -360,10 +359,10 @@ async function processDataAndCreateFile( // Get rootpage id let rootWebPageId = undefined; - + if (rootWebPageIdAttribute) { const rootWebPageIdPath : IAttributePath = getAttributePath(rootWebPageIdAttribute); - rootWebPageId = getRootWebPageId(result, rootWebPageIdPath, entityName, entityId); + rootWebPageId = getAttributeContent(result, rootWebPageIdPath, entityName, entityId); } if (fileCreationValid) { @@ -457,7 +456,7 @@ async function createFile( mimeType = getMimeType(mappingContent); fileContent = getMappingEntityContent(entityName, mappingContent, attribute); } else { - fileContent = GetFileContent(result, attributePath, entityName, entityId); + fileContent = getAttributeContent(result, attributePath, entityName, entityId); } await createVirtualFile( @@ -580,7 +579,7 @@ export async function preprocessData( // eslint-disable-next-line @typescript-eslint/no-explicit-any data?.forEach((dataItem: any) => { - const webFormSteps = GetFileContent(dataItem, attributePath, entityType, fetchedFileId as string) as []; + const webFormSteps = getAttributeContent(dataItem, attributePath, entityType, fetchedFileId as string) as []; // eslint-disable-next-line @typescript-eslint/no-explicit-any const steps: any[] = []; diff --git a/src/web/client/telemetry/constants.ts b/src/web/client/telemetry/constants.ts index 81d00ca0..538adfe4 100644 --- a/src/web/client/telemetry/constants.ts +++ b/src/web/client/telemetry/constants.ts @@ -49,7 +49,7 @@ export enum telemetryEventNames { WEB_EXTENSION_CREATE_ENTITY_FOLDER_FAILED = "webExtensionCreateEntityFolderFailed", WEB_EXTENSION_PREPROCESS_DATA_FAILED = "webExtensionPreprocessDataFailed", WEB_EXTENSION_PREPROCESS_DATA_SUCCESS = "webExtensionPreprocessDataSuccess", - WEB_EXTENSION_GET_FILE_CONTENT_ERROR = "webExtensionGetFileContentError", + WEB_EXTENSION_ATTRIBUTE_CONTENT_ERROR = "webExtensionAttributeContentError", WEB_EXTENSION_SET_FILE_CONTENT_ERROR = "webExtensionSetFileContentError", WEB_EXTENSION_FAILED_TO_PREPARE_WORKSPACE = "webExtensionFailedToPrepareWorkspace", WEB_EXTENSION_BULKHEAD_QUEUE_FULL = "webExtensionBulkheadQueueFull", @@ -99,5 +99,4 @@ export enum telemetryEventNames { WEB_EXTENSION_PREVIEW_SITE_TRIGGERED = 'webExtensionPreviewSiteTriggered', WEB_EXTENSION_IMAGE_EDIT_SUPPORTED_FILE_EXTENSION = 'webExtensionImageEditSupportedFileExtension', WEB_EXTENSION_SAVE_IMAGE_FILE_TRIGGERED = 'webExtensionSaveImageFileTriggered', - WEB_EXTENSION_GET_ROOT_PAGE_ID_ERROR = 'webExtensionGetRootPageIdError', } diff --git a/src/web/client/utilities/commonUtil.ts b/src/web/client/utilities/commonUtil.ts index 9dc522d7..4296bf5a 100644 --- a/src/web/client/utilities/commonUtil.ts +++ b/src/web/client/utilities/commonUtil.ts @@ -62,23 +62,23 @@ export function isExtensionNeededInFileName(entity: string) { } // eslint-disable-next-line @typescript-eslint/no-explicit-any -export function GetFileContent(result: any, attributePath: IAttributePath, entityName: string, entityId: string) { - let fileContent = result[attributePath.source] ?? NO_CONTENT; +export function getAttributeContent(result: any, attributePath: IAttributePath, entityName: string, entityId: string) { + let value = result[attributePath.source] ?? NO_CONTENT; try { if (result[attributePath.source] && attributePath.relativePath.length) { - fileContent = + value = JSON.parse(result[attributePath.source])[attributePath.relativePath] ?? NO_CONTENT; } } catch (error) { const errorMsg = (error as Error)?.message; - WebExtensionContext.telemetry.sendErrorTelemetry(telemetryEventNames.WEB_EXTENSION_GET_FILE_CONTENT_ERROR, - GetFileContent.name, + WebExtensionContext.telemetry.sendErrorTelemetry(telemetryEventNames.WEB_EXTENSION_ATTRIBUTE_CONTENT_ERROR, + getAttributeContent.name, `For ${entityName} with entityId ${entityId} and attributePath ${JSON.stringify(attributePath)} error: ${errorMsg}`); } - return fileContent; + return value; } // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -264,22 +264,3 @@ export function getImageFileContent(fileFsPath: string, fileContent: Uint8Array) return webFileV2 ? fileContent : Buffer.from(fileContent).toString(BASE_64); } - -export function getRootWebPageId(result: any, attributePath: IAttributePath, entityName: string, entityId: string) { - let rootWebPageId = result[attributePath.source] ?? NO_CONTENT; - - try { - if (result[attributePath.source] && attributePath.relativePath.length) { - rootWebPageId = - JSON.parse(result[attributePath.source])[attributePath.relativePath] ?? NO_CONTENT; - } - } - catch (error) { - const errorMsg = (error as Error)?.message; - WebExtensionContext.telemetry.sendErrorTelemetry(telemetryEventNames.WEB_EXTENSION_GET_ROOT_PAGE_ID_ERROR, - getRootWebPageId.name, - `For ${entityName} with entityId ${entityId} and attributePath ${JSON.stringify(attributePath)} error: ${errorMsg}`); - } - - return rootWebPageId; -} From 4f9094b966bf9344d375f445355e3bd1f445a9b9 Mon Sep 17 00:00:00 2001 From: ramukaritik Date: Tue, 7 Nov 2023 14:16:58 +0530 Subject: [PATCH 6/6] updated with new attribute destructuring function --- src/web/client/services/etagHandlerService.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/web/client/services/etagHandlerService.ts b/src/web/client/services/etagHandlerService.ts index 976b827a..e43ff182 100644 --- a/src/web/client/services/etagHandlerService.ts +++ b/src/web/client/services/etagHandlerService.ts @@ -10,7 +10,7 @@ import { httpMethod, ODATA_ETAG, queryParameters } from "../common/constants"; import { IAttributePath } from "../common/interfaces"; import { PortalsFS } from "../dal/fileSystemProvider"; import { telemetryEventNames } from "../telemetry/constants"; -import { GetFileContent } from "../utilities/commonUtil"; +import { getAttributeContent } from "../utilities/commonUtil"; import { getFileEntityEtag, getFileEntityId, @@ -85,7 +85,7 @@ export class EtagHandlerService { const currentContent = new TextDecoder().decode( await portalFs.readFile(vscode.Uri.parse(fileFsPath)) ); - const latestContent = GetFileContent(result, attributePath, entityName, entityId); + const latestContent = getAttributeContent(result, attributePath, entityName, entityId); updateEntityEtag(entityId, result[ODATA_ETAG]); if (currentContent !== latestContent) {