@basetime/bldr-sfmc-sdk
Advanced tools
Comparing version 1.0.7 to 1.0.8
@@ -112,3 +112,3 @@ import { SFMC_Client } from '../types/sfmc_client'; | ||
updateContentBuilderAssetContent: (asset: any, content: string) => any; | ||
setContentBuilderPackageAssets(packageOut: any, contextAssets: any[]): Promise<{ | ||
setContentBuilderPackageAssets: (packageOut: any, contextAssets: any[]) => Promise<{ | ||
id: any; | ||
@@ -115,0 +115,0 @@ bldrId: any; |
@@ -210,3 +210,3 @@ "use strict"; | ||
assetResponse.category.id; | ||
const folderResponse = yield this.sfmc.folder.getParentFoldersRecursive({ | ||
const folderResponse = yield this.sfmc.folder.getFoldersFromMiddle({ | ||
contentType: 'asset', | ||
@@ -261,2 +261,20 @@ categoryId, | ||
}; | ||
this.setContentBuilderPackageAssets = (packageOut, contextAssets) => __awaiter(this, void 0, void 0, function* () { | ||
packageOut['contentBuilder'] = {}; | ||
return packageOut['contentBuilder']['assets'] = contextAssets.map((asset) => { | ||
return { | ||
id: asset.id, | ||
bldrId: asset.bldrId, | ||
name: asset.name, | ||
assetType: asset.assetType, | ||
category: { | ||
folderPath: (asset.category && | ||
asset.category | ||
.folderPath) || | ||
asset.folderPath, | ||
}, | ||
content: (0, GetContentBuilderAssetContent_1.getContentBuilderAssetContent)(asset), | ||
}; | ||
}); | ||
}); | ||
/** | ||
@@ -313,185 +331,3 @@ * | ||
} | ||
// if (dependency) { | ||
// let dependencyContext = dependency.context; | ||
// dependencies[dependencyContext] = | ||
// dependencies[dependencyContext] || Array(); | ||
// content = content.replace( | ||
// dependency.matchedValue, | ||
// dependency.payload.bldrId | ||
// ); | ||
// dependencies[dependencyContext].push(dependency); | ||
// asset.dependencies = asset.dependencies || new Array(); | ||
// asset.dependencies.push({ | ||
// context: dependencyContext, | ||
// reference, | ||
// bldrId: dependency.payload.bldrId, | ||
// }); | ||
// // remove matched value from dependency object | ||
// delete dependency.matchedValue; | ||
// } else { | ||
// let refBldrId; | ||
// let assetRefObject; | ||
// let dependencyContext; | ||
// switch (reference) { | ||
// case 'Lookup': | ||
// case 'LookupOrderedRows': | ||
// case 'LookupOrderedRowsCS': | ||
// case 'LookupRows': | ||
// case 'LookupRowsCS': | ||
// case 'DataExtensionRowCount': | ||
// case 'DeleteData': | ||
// case 'DeleteDE': | ||
// case 'InsertDE': | ||
// case 'UpdateData': | ||
// case 'UpdateDE': | ||
// case 'UpsertData': | ||
// case 'UpsertDE': | ||
// case 'ClaimRow': | ||
// refBldrId = ''; | ||
// dependencyContext = 'emailStudio'; | ||
// break; | ||
// case 'ContentBlockById': | ||
// case 'ContentBlockByID': | ||
// assetRefObject = packageOut['contentBuilder']['assets'].find((packageAsset: any) => | ||
// Number(packageAsset.id) === Number(matchedValue) | ||
// ); | ||
// refBldrId = assetRefObject?.bldrId; | ||
// dependencyContext = 'contentBuilder'; | ||
// break; | ||
// case 'ContentBlockByName': | ||
// assetRefObject = packageOut['contentBuilder']['assets'].find((packageAsset: any) => { | ||
// return ( | ||
// `${packageAsset.category.folderPath.replaceAll( | ||
// '/', | ||
// '\\' | ||
// )}\\${packageAsset.name}` === | ||
// matchedValue | ||
// ); | ||
// }); | ||
// if (!assetRefObject) { | ||
// assetRefObject = packageOut['contentBuilder']['assets'].find( | ||
// (packageAsset: any) => { | ||
// return ( | ||
// `${packageAsset.category.folderPath.replaceAll( | ||
// '/', | ||
// '\\\\' | ||
// )}\\\\${packageAsset.name}` === | ||
// matchedValue | ||
// ); | ||
// } | ||
// ); | ||
// } | ||
// refBldrId = assetRefObject.bldrId; | ||
// dependencyContext = 'contentBuilder'; | ||
// break; | ||
// } | ||
// content = content.replace(matchedValue, refBldrId); | ||
// asset.dependencies = | ||
// asset.dependencies || new Array(); | ||
// asset.dependencies.push({ | ||
// context: dependencyContext, | ||
// reference, | ||
// bldrId: refBldrId, | ||
// }); | ||
// } | ||
// } | ||
} | ||
// delete asset.id; | ||
// delete asset.customerKey; | ||
// delete asset.category.id; | ||
// delete asset.category.name; | ||
// delete asset.category.parentId; | ||
// asset = await this.updateContentBuilderAssetContent(asset, content); | ||
// if (dependency) { | ||
// let dependencyContext = dependency.context; | ||
// dependencies[dependencyContext] = | ||
// dependencies[dependencyContext] || Array(); | ||
// content = content.replace( | ||
// dependency.matchedValue, | ||
// dependency.payload.bldrId | ||
// ); | ||
// // remove matched value from dependency object | ||
// delete dependency.matchedValue; | ||
// dependencies[dependencyContext].push(dependency); | ||
// asset.dependencies = | ||
// asset.dependencies || new Array(); | ||
// asset.dependencies.push({ | ||
// context: dependencyContext, | ||
// ref: ref, | ||
// bldrId: dependency.payload.bldrId, | ||
// }); | ||
// } else { | ||
// let refBldrId; | ||
// let assetRefObject; | ||
// let dependencyContext; | ||
// switch (reference) { | ||
// case 'Lookup': | ||
// case 'LookupOrderedRows': | ||
// case 'LookupOrderedRowsCS': | ||
// case 'LookupRows': | ||
// case 'LookupRowsCS': | ||
// case 'DataExtensionRowCount': | ||
// case 'DeleteData': | ||
// case 'DeleteDE': | ||
// case 'InsertDE': | ||
// case 'UpdateData': | ||
// case 'UpdateDE': | ||
// case 'UpsertData': | ||
// case 'UpsertDE': | ||
// case 'ClaimRow': | ||
// refBldrId = ''; | ||
// dependencyContext = 'dataExtension'; | ||
// break; | ||
// case 'ContentBlockById': | ||
// case 'ContentBlockByID': | ||
// assetRefObject = packageOut['contentBuilder']['assets'].find((packageAsset: any) => | ||
// packageAsset.id === Number(matchedValue) | ||
// ); | ||
// refBldrId = assetRefObject?.bldrId; | ||
// dependencyContext = 'contentBuilder'; | ||
// break; | ||
// case 'ContentBlockByName': | ||
// assetRefObject = assets.find((depAsset) => { | ||
// return ( | ||
// `${depAsset.category.folderPath.replaceAll( | ||
// '/', | ||
// '\\' | ||
// )}\\${depAsset.name}` === | ||
// matchedValue | ||
// ); | ||
// }); | ||
// if (!assetRefObject) { | ||
// assetRefObject = assets.find( | ||
// (depAsset) => { | ||
// return ( | ||
// `${depAsset.category.folderPath.replaceAll( | ||
// '/', | ||
// '\\\\' | ||
// )}\\\\${depAsset.name}` === | ||
// matchedValue | ||
// ); | ||
// } | ||
// ); | ||
// } | ||
// refBldrId = assetRefObject.bldrId; | ||
// dependencyContext = 'contentBuilder'; | ||
// break; | ||
// } | ||
// content = content.replace(matchedValue, refBldrId); | ||
// asset.dependencies = | ||
// asset.dependencies || new Array(); | ||
// asset.dependencies.push({ | ||
// context: dependencyContext, | ||
// ref: ref, | ||
// bldrId: refBldrId, | ||
// }); | ||
// } | ||
// } | ||
// } | ||
// delete asset.id; | ||
// delete asset.customerKey; | ||
// delete asset.category.id; | ||
// delete asset.category.name; | ||
// delete asset.category.parentId; | ||
// asset = await utils.updateAssetContent(asset, content); | ||
} | ||
@@ -504,3 +340,3 @@ return { | ||
catch (err) { | ||
console.log(err); | ||
console.log('Some dependencies in package do not exist'); | ||
} | ||
@@ -510,23 +346,3 @@ }); | ||
} | ||
setContentBuilderPackageAssets(packageOut, contextAssets) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
packageOut['contentBuilder'] = {}; | ||
return packageOut['contentBuilder']['assets'] = contextAssets.map((asset) => { | ||
return { | ||
id: asset.id, | ||
bldrId: asset.bldrId, | ||
name: asset.name, | ||
assetType: asset.assetType, | ||
category: { | ||
folderPath: (asset.category && | ||
asset.category | ||
.folderPath) || | ||
asset.folderPath, | ||
}, | ||
content: (0, GetContentBuilderAssetContent_1.getContentBuilderAssetContent)(asset), | ||
}; | ||
}); | ||
}); | ||
} | ||
} | ||
exports.ContentBuilder = ContentBuilder; |
@@ -162,3 +162,2 @@ "use strict"; | ||
}); | ||
console.log('formatted', formattedFolders); | ||
return { | ||
@@ -165,0 +164,0 @@ folders: formattedFolders, |
@@ -18,3 +18,4 @@ "use strict"; | ||
let folders = yield (0, _1.uniqueArrayByKey)(simplifiedFolders, 'ID'); | ||
const foldersOut = []; //object[] | ||
folders = folders.sort((a, b) => a.ID - b.ID); | ||
const foldersOut = []; | ||
const compiledFolderPaths = []; | ||
@@ -43,3 +44,3 @@ let path = ''; | ||
const folder = folders[f]; | ||
const parentFolder = folder.ParentFolder.Name; | ||
const parentFolder = folder.ParentFolder.Name || parentFolderObject.Name; | ||
let parentIsRootFolder = parentFolder === rootFolder ? true : false; | ||
@@ -76,3 +77,3 @@ if (parentIsRootFolder) { | ||
// Remove processed Object from Original Array | ||
folders.splice(folders.findIndex((orgFolder) => orgFolder.ID === folder.ID), 1); | ||
folders.splice(folders.findIndex((orgFolder) => Number(orgFolder.ID) === Number(folder.ID)), 1); | ||
// Reset Path String | ||
@@ -79,0 +80,0 @@ path = ''; |
@@ -392,3 +392,2 @@ "use strict"; | ||
catch (err) { | ||
console.log(err); | ||
return err; | ||
@@ -395,0 +394,0 @@ } |
@@ -61,3 +61,6 @@ import { Client } from '../types/sfmc_client'; | ||
categoryId: number; | ||
}): Promise<any[]>; | ||
}): Promise<{ | ||
results: any[]; | ||
stop: Boolean; | ||
}>; | ||
/** | ||
@@ -64,0 +67,0 @@ * Method to gather and format all SFMC Folders recursively from top level starting point |
@@ -155,3 +155,10 @@ "use strict"; | ||
results = [...rootFolderRequest.Results]; | ||
stopFolderId = rootFolderRequest.Results[0].ID; | ||
stopFolderId = rootFolderRequest.Results[0].ParentFolder.ID; | ||
if (rootFolderRequest.Results[0].ID === request.categoryId) { | ||
console.log('return matched root'); | ||
return { | ||
results, | ||
stop: true | ||
}; | ||
} | ||
} | ||
@@ -192,8 +199,10 @@ } | ||
parentResult.ParentFolder && | ||
parentResult.ParentFolder.ID) || | ||
null; | ||
parentResult.ParentFolder.ID); | ||
} | ||
} while (!stopFolderId || parentId === stopFolderId); | ||
} while (parentId !== 0); | ||
} | ||
return results; | ||
return { | ||
results, | ||
stop: false | ||
}; | ||
}); | ||
@@ -260,7 +269,6 @@ } | ||
return __awaiter(this, void 0, void 0, function* () { | ||
let results = []; | ||
let up = (yield this.getParentFoldersRecursive(request)) || []; | ||
let down = (yield this.getSubfoldersRecursive(request)) || []; | ||
let down = !up.stop && (yield this.getSubfoldersRecursive(request)) || []; | ||
return [ | ||
...new Map([...up, ...down].map((item) => [item['Name'], item])).values(), | ||
...new Map([...up.results, ...down].map((item) => [item['Name'], item])).values(), | ||
]; | ||
@@ -267,0 +275,0 @@ }); |
@@ -183,3 +183,2 @@ import { SFMC_Client } from '../types/sfmc_client'; | ||
const buildFolderPaths = await buildFolderPathsSoap(folderResponse); | ||
@@ -263,2 +262,3 @@ const isolateFolderIds = | ||
if ( | ||
@@ -278,4 +278,5 @@ assetResponse && | ||
const folderResponse = | ||
await this.sfmc.folder.getParentFoldersRecursive({ | ||
await this.sfmc.folder.getFoldersFromMiddle({ | ||
contentType: 'asset', | ||
@@ -286,2 +287,4 @@ categoryId, | ||
const buildFolderPaths = await buildFolderPathsSoap(folderResponse); | ||
const formattedAssetResponse = | ||
@@ -295,2 +298,3 @@ assetResponse && | ||
const formattedFolders = buildFolderPaths.folders.map((folder) => { | ||
@@ -305,2 +309,3 @@ return { | ||
return { | ||
@@ -344,6 +349,6 @@ folders: formattedFolders, | ||
async setContentBuilderPackageAssets( | ||
setContentBuilderPackageAssets = async ( | ||
packageOut: any, | ||
contextAssets: any[] | ||
) { | ||
) => { | ||
packageOut['contentBuilder'] = {}; | ||
@@ -438,221 +443,5 @@ return packageOut['contentBuilder']['assets'] = contextAssets.map( | ||
} | ||
// if (dependency) { | ||
// let dependencyContext = dependency.context; | ||
// dependencies[dependencyContext] = | ||
// dependencies[dependencyContext] || Array(); | ||
// content = content.replace( | ||
// dependency.matchedValue, | ||
// dependency.payload.bldrId | ||
// ); | ||
// dependencies[dependencyContext].push(dependency); | ||
// asset.dependencies = asset.dependencies || new Array(); | ||
// asset.dependencies.push({ | ||
// context: dependencyContext, | ||
// reference, | ||
// bldrId: dependency.payload.bldrId, | ||
// }); | ||
// // remove matched value from dependency object | ||
// delete dependency.matchedValue; | ||
// } else { | ||
// let refBldrId; | ||
// let assetRefObject; | ||
// let dependencyContext; | ||
// switch (reference) { | ||
// case 'Lookup': | ||
// case 'LookupOrderedRows': | ||
// case 'LookupOrderedRowsCS': | ||
// case 'LookupRows': | ||
// case 'LookupRowsCS': | ||
// case 'DataExtensionRowCount': | ||
// case 'DeleteData': | ||
// case 'DeleteDE': | ||
// case 'InsertDE': | ||
// case 'UpdateData': | ||
// case 'UpdateDE': | ||
// case 'UpsertData': | ||
// case 'UpsertDE': | ||
// case 'ClaimRow': | ||
// refBldrId = ''; | ||
// dependencyContext = 'emailStudio'; | ||
// break; | ||
// case 'ContentBlockById': | ||
// case 'ContentBlockByID': | ||
// assetRefObject = packageOut['contentBuilder']['assets'].find((packageAsset: any) => | ||
// Number(packageAsset.id) === Number(matchedValue) | ||
// ); | ||
// refBldrId = assetRefObject?.bldrId; | ||
// dependencyContext = 'contentBuilder'; | ||
// break; | ||
// case 'ContentBlockByName': | ||
// assetRefObject = packageOut['contentBuilder']['assets'].find((packageAsset: any) => { | ||
// return ( | ||
// `${packageAsset.category.folderPath.replaceAll( | ||
// '/', | ||
// '\\' | ||
// )}\\${packageAsset.name}` === | ||
// matchedValue | ||
// ); | ||
// }); | ||
// if (!assetRefObject) { | ||
// assetRefObject = packageOut['contentBuilder']['assets'].find( | ||
// (packageAsset: any) => { | ||
// return ( | ||
// `${packageAsset.category.folderPath.replaceAll( | ||
// '/', | ||
// '\\\\' | ||
// )}\\\\${packageAsset.name}` === | ||
// matchedValue | ||
// ); | ||
// } | ||
// ); | ||
// } | ||
// refBldrId = assetRefObject.bldrId; | ||
// dependencyContext = 'contentBuilder'; | ||
// break; | ||
// } | ||
// content = content.replace(matchedValue, refBldrId); | ||
// asset.dependencies = | ||
// asset.dependencies || new Array(); | ||
// asset.dependencies.push({ | ||
// context: dependencyContext, | ||
// reference, | ||
// bldrId: refBldrId, | ||
// }); | ||
// } | ||
// } | ||
} | ||
} | ||
// delete asset.id; | ||
// delete asset.customerKey; | ||
// delete asset.category.id; | ||
// delete asset.category.name; | ||
// delete asset.category.parentId; | ||
// asset = await this.updateContentBuilderAssetContent(asset, content); | ||
// if (dependency) { | ||
// let dependencyContext = dependency.context; | ||
// dependencies[dependencyContext] = | ||
// dependencies[dependencyContext] || Array(); | ||
// content = content.replace( | ||
// dependency.matchedValue, | ||
// dependency.payload.bldrId | ||
// ); | ||
// // remove matched value from dependency object | ||
// delete dependency.matchedValue; | ||
// dependencies[dependencyContext].push(dependency); | ||
// asset.dependencies = | ||
// asset.dependencies || new Array(); | ||
// asset.dependencies.push({ | ||
// context: dependencyContext, | ||
// ref: ref, | ||
// bldrId: dependency.payload.bldrId, | ||
// }); | ||
// } else { | ||
// let refBldrId; | ||
// let assetRefObject; | ||
// let dependencyContext; | ||
// switch (reference) { | ||
// case 'Lookup': | ||
// case 'LookupOrderedRows': | ||
// case 'LookupOrderedRowsCS': | ||
// case 'LookupRows': | ||
// case 'LookupRowsCS': | ||
// case 'DataExtensionRowCount': | ||
// case 'DeleteData': | ||
// case 'DeleteDE': | ||
// case 'InsertDE': | ||
// case 'UpdateData': | ||
// case 'UpdateDE': | ||
// case 'UpsertData': | ||
// case 'UpsertDE': | ||
// case 'ClaimRow': | ||
// refBldrId = ''; | ||
// dependencyContext = 'dataExtension'; | ||
// break; | ||
// case 'ContentBlockById': | ||
// case 'ContentBlockByID': | ||
// assetRefObject = packageOut['contentBuilder']['assets'].find((packageAsset: any) => | ||
// packageAsset.id === Number(matchedValue) | ||
// ); | ||
// refBldrId = assetRefObject?.bldrId; | ||
// dependencyContext = 'contentBuilder'; | ||
// break; | ||
// case 'ContentBlockByName': | ||
// assetRefObject = assets.find((depAsset) => { | ||
// return ( | ||
// `${depAsset.category.folderPath.replaceAll( | ||
// '/', | ||
// '\\' | ||
// )}\\${depAsset.name}` === | ||
// matchedValue | ||
// ); | ||
// }); | ||
// if (!assetRefObject) { | ||
// assetRefObject = assets.find( | ||
// (depAsset) => { | ||
// return ( | ||
// `${depAsset.category.folderPath.replaceAll( | ||
// '/', | ||
// '\\\\' | ||
// )}\\\\${depAsset.name}` === | ||
// matchedValue | ||
// ); | ||
// } | ||
// ); | ||
// } | ||
// refBldrId = assetRefObject.bldrId; | ||
// dependencyContext = 'contentBuilder'; | ||
// break; | ||
// } | ||
// content = content.replace(matchedValue, refBldrId); | ||
// asset.dependencies = | ||
// asset.dependencies || new Array(); | ||
// asset.dependencies.push({ | ||
// context: dependencyContext, | ||
// ref: ref, | ||
// bldrId: refBldrId, | ||
// }); | ||
// } | ||
// } | ||
// } | ||
// delete asset.id; | ||
// delete asset.customerKey; | ||
// delete asset.category.id; | ||
// delete asset.category.name; | ||
// delete asset.category.parentId; | ||
// asset = await utils.updateAssetContent(asset, content); | ||
} | ||
return { | ||
@@ -662,4 +451,4 @@ newDependencies, | ||
} | ||
} catch (err) { | ||
console.log(err) | ||
} catch (err: any) { | ||
console.log('Some dependencies in package do not exist') | ||
} | ||
@@ -666,0 +455,0 @@ |
@@ -8,3 +8,5 @@ import { SFMC_SOAP_Folder } from '../../sfmc/types/objects/sfmc_soap_folders'; | ||
let folders = await uniqueArrayByKey(simplifiedFolders, 'ID'); | ||
const foldersOut = []; //object[] | ||
folders = folders.sort((a,b) => a.ID - b.ID) | ||
const foldersOut = []; | ||
const compiledFolderPaths = []; | ||
@@ -42,3 +44,3 @@ let path = ''; | ||
const folder = folders[f]; | ||
const parentFolder = folder.ParentFolder.Name; | ||
const parentFolder = folder.ParentFolder.Name || parentFolderObject.Name; | ||
let parentIsRootFolder = parentFolder === rootFolder ? true : false; | ||
@@ -51,2 +53,3 @@ | ||
folder.FolderPath = path; | ||
// Add Folder Object to Output Array | ||
@@ -56,2 +59,3 @@ foldersOut.push(folder); | ||
compiledFolderPaths.push(path); | ||
// Remove processed Object from Original Array | ||
@@ -64,2 +68,3 @@ folders.splice( | ||
); | ||
// Reset Path String | ||
@@ -69,2 +74,3 @@ path = ''; | ||
let parentId = folder.ParentFolder.ID; | ||
let compiledParentFolder = foldersOut.find( | ||
@@ -86,9 +92,11 @@ (compiledFolder) => compiledFolder.ID === parentId | ||
compiledFolderPaths.push(path); | ||
// Remove processed Object from Original Array | ||
folders.splice( | ||
folders.findIndex( | ||
(orgFolder) => orgFolder.ID === folder.ID | ||
(orgFolder) => Number(orgFolder.ID) === Number(folder.ID) | ||
), | ||
1 | ||
); | ||
// Reset Path String | ||
@@ -95,0 +103,0 @@ path = ''; |
@@ -604,3 +604,2 @@ import { Client } from '../types/sfmc_client'; | ||
} catch (err) { | ||
console.log(err) | ||
return err | ||
@@ -607,0 +606,0 @@ } |
@@ -10,395 +10,404 @@ import { Client } from '../types/sfmc_client'; | ||
export class Folder { | ||
client; | ||
sfmc_context; | ||
constructor(client: Client, sfmc_context_mapping: SFMCContextMapping[]) { | ||
this.client = client; | ||
this.sfmc_context = sfmc_context_mapping; | ||
client; | ||
sfmc_context; | ||
constructor(client: Client, sfmc_context_mapping: SFMCContextMapping[]) { | ||
this.client = client; | ||
this.sfmc_context = sfmc_context_mapping; | ||
} | ||
/** | ||
* Search SFMC Folders using SOAP DataFolder Object | ||
* | ||
* @param {string} request.contentType | ||
* @param {string} request.searchKey | ||
* @param {string} request.searchTerm | ||
* @returns | ||
*/ | ||
async search(request: { | ||
contentType: string; | ||
searchKey: string; | ||
searchTerm: string; | ||
}): Promise<{ | ||
OverallStatus: string; | ||
Results: any[]; | ||
}> { | ||
try { | ||
const resp = await this.client.soap.retrieve( | ||
'DataFolder', | ||
DataFolder, | ||
{ | ||
filter: { | ||
leftOperand: { | ||
leftOperand: 'ContentType', | ||
operator: 'equals', | ||
rightOperand: request.contentType, | ||
}, | ||
operator: 'AND', | ||
rightOperand: { | ||
leftOperand: request.searchKey, | ||
operator: 'like', | ||
rightOperand: request.searchTerm, | ||
}, | ||
}, | ||
} | ||
); | ||
if (resp.OverallStatus !== 'OK') { | ||
return resp.OverallStatus; | ||
} | ||
return resp; | ||
} catch (err: any) { | ||
return handleError(err); | ||
} | ||
/** | ||
* Search SFMC Folders using SOAP DataFolder Object | ||
* | ||
* @param {string} request.contentType | ||
* @param {string} request.searchKey | ||
* @param {string} request.searchTerm | ||
* @returns | ||
*/ | ||
async search(request: { | ||
contentType: string; | ||
searchKey: string; | ||
searchTerm: string; | ||
}): Promise<{ | ||
OverallStatus: string; | ||
Results: any[]; | ||
}> { | ||
try { | ||
const resp = await this.client.soap.retrieve( | ||
'DataFolder', | ||
DataFolder, | ||
{ | ||
filter: { | ||
leftOperand: { | ||
leftOperand: 'ContentType', | ||
operator: 'equals', | ||
rightOperand: request.contentType, | ||
}, | ||
operator: 'AND', | ||
rightOperand: { | ||
leftOperand: request.searchKey, | ||
operator: 'like', | ||
rightOperand: request.searchTerm, | ||
}, | ||
}, | ||
} | ||
); | ||
} | ||
/** | ||
* Get a single SFMC Folder Object via SOAP API | ||
* If subfolders === false id refers to the folder you are retrieving | ||
* If subfolders === true id refers to the parent folder | ||
* | ||
* @param {string} request.contentType | ||
* @param {number} request.categoryId | ||
* @returns | ||
*/ | ||
async getFolder(request: { | ||
contentType: string; | ||
categoryId: number; | ||
}): Promise<{ | ||
OverallStatus: string; | ||
Results: SFMC_SOAP_Folder[]; | ||
}> { | ||
try { | ||
const resp = await this.client.soap.retrieve( | ||
'DataFolder', | ||
DataFolder, | ||
{ | ||
filter: { | ||
leftOperand: { | ||
leftOperand: 'ContentType', | ||
operator: 'equals', | ||
rightOperand: request.contentType, | ||
}, | ||
operator: 'AND', | ||
rightOperand: { | ||
leftOperand: 'ID', | ||
operator: 'equals', | ||
rightOperand: request.categoryId, | ||
}, | ||
}, | ||
} | ||
); | ||
if (resp.OverallStatus !== 'OK') { | ||
return resp.OverallStatus; | ||
} | ||
if (resp.OverallStatus !== 'OK') { | ||
throw new Error('Unable to Retrieve Folders'); | ||
} | ||
return resp; | ||
} catch (err: any) { | ||
return handleError(err); | ||
} | ||
return resp; | ||
} catch (err: any) { | ||
return handleError(err); | ||
} | ||
/** | ||
* Get a single SFMC Folder Object via SOAP API | ||
* If subfolders === false id refers to the folder you are retrieving | ||
* If subfolders === true id refers to the parent folder | ||
* | ||
* @param {string} request.contentType | ||
* @param {number} request.categoryId | ||
* @returns | ||
*/ | ||
async getFolder(request: { | ||
contentType: string; | ||
categoryId: number; | ||
}): Promise<{ | ||
} | ||
/** | ||
* Get SFMC Subfolders based on parentId Object via SOAP API | ||
* | ||
* @param {string} request.contentType | ||
* @param {number} request.parentId | ||
* @returns | ||
*/ | ||
async getSubfolders(request: { | ||
contentType: string; | ||
parentId: number; | ||
}): Promise<SFMC_SOAP_Folder[]> { | ||
try { | ||
type folders = SFMC_SOAP_Folder; | ||
const results: folders[] = []; | ||
const response: { | ||
OverallStatus: string; | ||
Results: SFMC_SOAP_Folder[]; | ||
}> { | ||
try { | ||
const resp = await this.client.soap.retrieve( | ||
'DataFolder', | ||
DataFolder, | ||
{ | ||
filter: { | ||
leftOperand: { | ||
leftOperand: 'ContentType', | ||
operator: 'equals', | ||
rightOperand: request.contentType, | ||
}, | ||
operator: 'AND', | ||
rightOperand: { | ||
leftOperand: 'ID', | ||
operator: 'equals', | ||
rightOperand: request.categoryId, | ||
}, | ||
}, | ||
} | ||
); | ||
} = await this.client.soap.retrieve('DataFolder', DataFolder, { | ||
filter: { | ||
leftOperand: { | ||
leftOperand: 'ContentType', | ||
operator: 'equals', | ||
rightOperand: request.contentType, | ||
}, | ||
operator: 'AND', | ||
rightOperand: { | ||
leftOperand: 'ParentFolder.ID', | ||
operator: 'equals', | ||
rightOperand: request.parentId, | ||
}, | ||
}, | ||
}); | ||
if (resp.OverallStatus !== 'OK') { | ||
throw new Error('Unable to Retrieve Folders'); | ||
} | ||
if (response && response.OverallStatus !== 'OK') { | ||
throw new Error('Unable to Retrieve Folders'); | ||
} | ||
return resp; | ||
} catch (err: any) { | ||
return handleError(err); | ||
} | ||
const responseResults = response.Results; | ||
results.push(...responseResults); | ||
return results; | ||
} catch (err: any) { | ||
return handleError(err); | ||
} | ||
/** | ||
* Get SFMC Subfolders based on parentId Object via SOAP API | ||
* | ||
* @param {string} request.contentType | ||
* @param {number} request.parentId | ||
* @returns | ||
*/ | ||
async getSubfolders(request: { | ||
contentType: string; | ||
parentId: number; | ||
}): Promise<SFMC_SOAP_Folder[]> { | ||
try { | ||
type folders = SFMC_SOAP_Folder; | ||
const results: folders[] = []; | ||
} | ||
/** | ||
* Method to compile folder path for for Asset Clone | ||
* | ||
* @param {string} request.contentType | ||
* @param {number} request.categoryId | ||
* @returns {Promise<Object[]>} | ||
*/ | ||
async getParentFoldersRecursive(request: { | ||
contentType: string; | ||
categoryId: number; | ||
}): Promise<{results: any[], stop: Boolean}> { | ||
let parentId; | ||
let stopFolderId; | ||
let results: object[] = []; | ||
const response: { | ||
OverallStatus: string; | ||
Results: SFMC_SOAP_Folder[]; | ||
} = await this.client.soap.retrieve('DataFolder', DataFolder, { | ||
filter: { | ||
leftOperand: { | ||
leftOperand: 'ContentType', | ||
operator: 'equals', | ||
rightOperand: request.contentType, | ||
}, | ||
operator: 'AND', | ||
rightOperand: { | ||
leftOperand: 'ParentFolder.ID', | ||
operator: 'equals', | ||
rightOperand: request.parentId, | ||
}, | ||
}, | ||
}); | ||
const rootFolderContext = this.sfmc_context.find( | ||
(ctx) => ctx.contentType === request.contentType | ||
); | ||
if (response && response.OverallStatus !== 'OK') { | ||
throw new Error('Unable to Retrieve Folders'); | ||
if (rootFolderContext) { | ||
const rootFolderRequest = await this.search({ | ||
contentType: request.contentType, | ||
searchKey: 'Name', | ||
searchTerm: rootFolderContext.rootName, | ||
}); | ||
if ( | ||
rootFolderRequest && | ||
rootFolderRequest.Results && | ||
rootFolderRequest.Results.length | ||
) { | ||
results = [...rootFolderRequest.Results]; | ||
stopFolderId = rootFolderRequest.Results[0].ParentFolder.ID; | ||
if(rootFolderRequest.Results[0].ID === request.categoryId){ | ||
console.log('return matched root') | ||
return { | ||
results, | ||
stop: true | ||
} | ||
const responseResults = response.Results; | ||
results.push(...responseResults); | ||
return results; | ||
} catch (err: any) { | ||
return handleError(err); | ||
} | ||
} | ||
} | ||
/** | ||
* Method to compile folder path for for Asset Clone | ||
* | ||
* @param {string} request.contentType | ||
* @param {number} request.categoryId | ||
* @returns {Promise<Object[]>} | ||
*/ | ||
async getParentFoldersRecursive(request: { | ||
contentType: string; | ||
categoryId: number; | ||
}): Promise<any[]> { | ||
let parentId; | ||
let stopFolderId; | ||
let results: object[] = []; | ||
const rootFolderContext = this.sfmc_context.find( | ||
(ctx) => ctx.contentType === request.contentType | ||
); | ||
const initialCategory = await this.getFolder(request); | ||
if (rootFolderContext) { | ||
const rootFolderRequest = await this.search({ | ||
contentType: request.contentType, | ||
searchKey: 'Name', | ||
searchTerm: rootFolderContext.rootName, | ||
}); | ||
if (initialCategory.OverallStatus !== 'OK') { | ||
console.log(initialCategory); | ||
} | ||
if ( | ||
rootFolderRequest && | ||
rootFolderRequest.Results && | ||
rootFolderRequest.Results.length | ||
) { | ||
results = [...rootFolderRequest.Results]; | ||
stopFolderId = rootFolderRequest.Results[0].ID; | ||
} | ||
} | ||
if ( | ||
initialCategory && | ||
initialCategory.Results && | ||
initialCategory.Results.length | ||
) { | ||
const initResult = initialCategory.Results[0]; | ||
results = [...results, ...initialCategory.Results]; | ||
parentId = | ||
(initResult && | ||
initResult.ParentFolder && | ||
initResult.ParentFolder.ID) || | ||
null; | ||
} | ||
const initialCategory = await this.getFolder(request); | ||
if (parentId) { | ||
do { | ||
const parentRequest = | ||
parentId && | ||
(await this.getFolder({ | ||
contentType: request.contentType, | ||
categoryId: parentId, | ||
})); | ||
if (initialCategory.OverallStatus !== 'OK') { | ||
console.log(initialCategory); | ||
if (parentRequest && parentRequest.OverallStatus !== 'OK') { | ||
console.log(parentRequest); | ||
} | ||
if ( | ||
initialCategory && | ||
initialCategory.Results && | ||
initialCategory.Results.length | ||
parentRequest && | ||
parentRequest.Results && | ||
parentRequest.Results.length | ||
) { | ||
const initResult = initialCategory.Results[0]; | ||
results = [...results, ...initialCategory.Results]; | ||
parentId = | ||
(initResult && | ||
initResult.ParentFolder && | ||
initResult.ParentFolder.ID) || | ||
null; | ||
} | ||
const parentResult: { | ||
ParentFolder: { | ||
ID: number; | ||
}; | ||
} = parentRequest.Results[0]; | ||
if (parentId) { | ||
do { | ||
const parentRequest = | ||
parentId && | ||
(await this.getFolder({ | ||
contentType: request.contentType, | ||
categoryId: parentId, | ||
})); | ||
if (parentRequest && parentRequest.OverallStatus !== 'OK') { | ||
console.log(parentRequest); | ||
} | ||
if ( | ||
parentRequest && | ||
parentRequest.Results && | ||
parentRequest.Results.length | ||
) { | ||
const parentResult: { | ||
ParentFolder: { | ||
ID: number; | ||
}; | ||
} = parentRequest.Results[0]; | ||
results.push(...parentRequest.Results); | ||
parentId = | ||
(parentResult && | ||
parentResult.ParentFolder && | ||
parentResult.ParentFolder.ID) || | ||
null; | ||
} | ||
} while (!stopFolderId || parentId === stopFolderId); | ||
results.push(...parentRequest.Results); | ||
parentId = | ||
(parentResult && | ||
parentResult.ParentFolder && | ||
parentResult.ParentFolder.ID) | ||
} | ||
return results; | ||
} while (parentId !== 0); | ||
} | ||
/** | ||
* Method to gather and format all SFMC Folders recursively from top level starting point | ||
* | ||
* @param {string} request.contentType | ||
* @param {integer} request.categoryId | ||
* @returns | ||
*/ | ||
async getSubfoldersRecursive(request: { | ||
contentType: string; | ||
categoryId: number; | ||
}) { | ||
try { | ||
let folders: number[] = []; | ||
let results: any[] = []; | ||
return { | ||
results, | ||
stop: false | ||
}; | ||
} | ||
/** | ||
* Method to gather and format all SFMC Folders recursively from top level starting point | ||
* | ||
* @param {string} request.contentType | ||
* @param {integer} request.categoryId | ||
* @returns | ||
*/ | ||
async getSubfoldersRecursive(request: { | ||
contentType: string; | ||
categoryId: number; | ||
}) { | ||
try { | ||
let folders: number[] = []; | ||
let results: any[] = []; | ||
// Get target folder from SFMC | ||
let rootRequest = await this.getFolder(request); | ||
// Get target folder from SFMC | ||
let rootRequest = await this.getFolder(request); | ||
// Ensure response has results | ||
if (!Object.prototype.hasOwnProperty.call(rootRequest, 'Results')) { | ||
throw new Error(`Unable to find folder`); | ||
} | ||
// Ensure response has results | ||
if (!Object.prototype.hasOwnProperty.call(rootRequest, 'Results')) { | ||
throw new Error(`Unable to find folder`); | ||
} | ||
if ( | ||
rootRequest && | ||
rootRequest.Results && | ||
rootRequest.Results.length | ||
) { | ||
const rootIdArray = rootRequest.Results.map( | ||
(folder) => folder.ID | ||
); | ||
folders.push(...rootIdArray); | ||
results = [...results, ...rootRequest.Results]; | ||
} | ||
if ( | ||
rootRequest && | ||
rootRequest.Results && | ||
rootRequest.Results.length | ||
) { | ||
const rootIdArray = rootRequest.Results.map( | ||
(folder) => folder.ID | ||
); | ||
folders.push(...rootIdArray); | ||
results = [...results, ...rootRequest.Results]; | ||
} | ||
// Recursively get folders from SFMC | ||
do { | ||
let categoryId = folders[0]; | ||
// SFMC Folder response checking for subfolders | ||
let subfolderRequest = await this.getSubfolders({ | ||
contentType: request.contentType, | ||
parentId: categoryId, | ||
}); | ||
// Recursively get folders from SFMC | ||
do { | ||
let categoryId = folders[0]; | ||
// SFMC Folder response checking for subfolders | ||
let subfolderRequest = await this.getSubfolders({ | ||
contentType: request.contentType, | ||
parentId: categoryId, | ||
}); | ||
if ( | ||
subfolderRequest && | ||
Array.isArray(subfolderRequest) && | ||
subfolderRequest.length > 0 | ||
) { | ||
let subfolderIdArray = subfolderRequest.map( | ||
(folder: { ID: number }) => folder.ID | ||
); | ||
folders.push(...subfolderIdArray); | ||
results = [...results, ...subfolderRequest]; | ||
} | ||
if ( | ||
subfolderRequest && | ||
Array.isArray(subfolderRequest) && | ||
subfolderRequest.length > 0 | ||
) { | ||
let subfolderIdArray = subfolderRequest.map( | ||
(folder: { ID: number }) => folder.ID | ||
); | ||
folders.push(...subfolderIdArray); | ||
results = [...results, ...subfolderRequest]; | ||
} | ||
folders.shift(); | ||
} while (folders.length !== 0); | ||
folders.shift(); | ||
} while (folders.length !== 0); | ||
return results || []; | ||
} catch (err) { | ||
console.log(err); | ||
return handleError(err); | ||
} | ||
return results || []; | ||
} catch (err) { | ||
console.log(err); | ||
return handleError(err); | ||
} | ||
/** | ||
* Retrieve all folders top and bottom from a specific categoryId | ||
* | ||
* @param {string} request.contentType | ||
* @param {integer} request.categoryId | ||
* @returns | ||
*/ | ||
async getFoldersFromMiddle(request: { | ||
contentType: string; | ||
categoryId: number; | ||
}) { | ||
let results: any[] = []; | ||
let up = await this.getParentFoldersRecursive(request) || []; | ||
let down = await this.getSubfoldersRecursive(request) || []; | ||
} | ||
/** | ||
* Retrieve all folders top and bottom from a specific categoryId | ||
* | ||
* @param {string} request.contentType | ||
* @param {integer} request.categoryId | ||
* @returns | ||
*/ | ||
async getFoldersFromMiddle(request: { | ||
contentType: string; | ||
categoryId: number; | ||
}) { | ||
let up = await this.getParentFoldersRecursive(request) || []; | ||
let down = !up.stop && await this.getSubfoldersRecursive(request) || []; | ||
return [ | ||
...new Map( | ||
[...up, ...down].map((item) => [item['Name'], item]) | ||
).values(), | ||
]; | ||
} | ||
/** | ||
* Create a folder in SFMC via SOAP Data Folder Object | ||
* | ||
* @param request.contentType | ||
* @param request.name | ||
* @param request.parentId | ||
* @returns {Promise<void>} | ||
*/ | ||
async createFolder(request: { | ||
contentType: string; | ||
name: string; | ||
parentId: number; | ||
}): Promise<void> { | ||
try { | ||
const resp = await this.client.soap.create( | ||
'DataFolder', | ||
{ | ||
ContentType: request.contentType, | ||
Name: request.name, | ||
Description: request.name, | ||
IsActive: true, | ||
IsEditable: true, | ||
AllowChildren: true, | ||
ParentFolder: { | ||
ID: request.parentId, | ||
}, | ||
}, | ||
{} | ||
); | ||
return [ | ||
...new Map( | ||
[...up.results, ...down].map((item) => [item['Name'], item]) | ||
).values(), | ||
]; | ||
} | ||
/** | ||
* Create a folder in SFMC via SOAP Data Folder Object | ||
* | ||
* @param request.contentType | ||
* @param request.name | ||
* @param request.parentId | ||
* @returns {Promise<void>} | ||
*/ | ||
async createFolder(request: { | ||
contentType: string; | ||
name: string; | ||
parentId: number; | ||
}): Promise<void> { | ||
try { | ||
const resp = await this.client.soap.create( | ||
'DataFolder', | ||
{ | ||
ContentType: request.contentType, | ||
Name: request.name, | ||
Description: request.name, | ||
IsActive: true, | ||
IsEditable: true, | ||
AllowChildren: true, | ||
ParentFolder: { | ||
ID: request.parentId, | ||
}, | ||
}, | ||
{} | ||
); | ||
return resp; | ||
} catch (err: any) { | ||
if (err.response.data.includes('cannot contain child folders')) { | ||
await this._updateAllowChildren({ | ||
contentType: request.contentType, | ||
categoryId: request.parentId, | ||
}); | ||
const errCreate = await this.createFolder(request); | ||
return errCreate; | ||
} | ||
return resp; | ||
} catch (err: any) { | ||
if (err.response.data.includes('cannot contain child folders')) { | ||
await this._updateAllowChildren({ | ||
contentType: request.contentType, | ||
categoryId: request.parentId, | ||
}); | ||
const errCreate = await this.createFolder(request); | ||
return errCreate; | ||
} | ||
return handleError(err); | ||
} | ||
return handleError(err); | ||
} | ||
/** | ||
* When a folder exists in SFMC and is created in the UI, it by default does not allow children folders. This function updates that permission on the folder. | ||
* | ||
* @param request.contentType | ||
* @param request.categoryId | ||
* @returns | ||
*/ | ||
async _updateAllowChildren(request: { | ||
contentType: string; | ||
categoryId: number; | ||
}) { | ||
try { | ||
const resp = await this.client.soap.update( | ||
'DataFolder', | ||
{ | ||
ID: request.categoryId, | ||
ContentType: request.contentType, | ||
IsActive: true, | ||
IsEditable: true, | ||
AllowChildren: true, | ||
}, | ||
{} | ||
); | ||
} | ||
/** | ||
* When a folder exists in SFMC and is created in the UI, it by default does not allow children folders. This function updates that permission on the folder. | ||
* | ||
* @param request.contentType | ||
* @param request.categoryId | ||
* @returns | ||
*/ | ||
async _updateAllowChildren(request: { | ||
contentType: string; | ||
categoryId: number; | ||
}) { | ||
try { | ||
const resp = await this.client.soap.update( | ||
'DataFolder', | ||
{ | ||
ID: request.categoryId, | ||
ContentType: request.contentType, | ||
IsActive: true, | ||
IsEditable: true, | ||
AllowChildren: true, | ||
}, | ||
{} | ||
); | ||
return resp; | ||
} catch (err) { | ||
return handleError(err); | ||
} | ||
return resp; | ||
} catch (err) { | ||
return handleError(err); | ||
} | ||
} | ||
} |
{ | ||
"name": "@basetime/bldr-sfmc-sdk", | ||
"version": "1.0.7", | ||
"version": "1.0.8", | ||
"description": "SDK for BLDR SFMC Core Functionality", | ||
@@ -5,0 +5,0 @@ "main": "dist/index.js", |
311764
8721