mcdev 5.1.0 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +4 -4
- package/.fork/custom-commands.json +12 -0
- package/.github/ISSUE_TEMPLATE/bug.yml +2 -0
- package/.github/PULL_REQUEST_TEMPLATE/pr_template_release.md +19 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +2 -2
- package/.github/workflows/coverage-develop-branch.yml +0 -2
- package/.github/workflows/coverage-main-branch.yml +0 -2
- package/.github/workflows/coverage.yml +0 -2
- package/.husky/post-checkout +1 -0
- package/.husky/post-merge +1 -0
- package/.vscode/extensions.json +4 -0
- package/docs/dist/documentation.md +1034 -296
- package/lib/Deployer.js +25 -25
- package/lib/MetadataTypeDefinitions.js +2 -1
- package/lib/MetadataTypeInfo.js +2 -1
- package/lib/Retriever.js +1 -1
- package/lib/cli.js +165 -10
- package/lib/index.js +398 -95
- package/lib/metadataTypes/Asset.js +10 -11
- package/lib/metadataTypes/AttributeGroup.js +76 -2
- package/lib/metadataTypes/AttributeSet.js +367 -0
- package/lib/metadataTypes/Automation.js +483 -137
- package/lib/metadataTypes/DataExtension.js +465 -68
- package/lib/metadataTypes/DataExtensionField.js +31 -14
- package/lib/metadataTypes/Event.js +2 -3
- package/lib/metadataTypes/Folder.js +1 -1
- package/lib/metadataTypes/Journey.js +13 -7
- package/lib/metadataTypes/MetadataType.js +212 -54
- package/lib/metadataTypes/MobileKeyword.js +9 -9
- package/lib/metadataTypes/MobileMessage.js +5 -5
- package/lib/metadataTypes/Query.js +26 -10
- package/lib/metadataTypes/Script.js +3 -3
- package/lib/metadataTypes/TransactionalEmail.js +94 -17
- package/lib/metadataTypes/TransactionalMessage.js +3 -2
- package/lib/metadataTypes/TransactionalSMS.js +5 -5
- package/lib/metadataTypes/TriggeredSend.js +25 -50
- package/lib/metadataTypes/User.js +7 -4
- package/lib/metadataTypes/Verification.js +230 -0
- package/lib/metadataTypes/definitions/AttributeGroup.definition.js +119 -108
- package/lib/metadataTypes/definitions/{SetDefinition.definition.js → AttributeSet.definition.js} +123 -43
- package/lib/metadataTypes/definitions/Automation.definition.js +23 -15
- package/lib/metadataTypes/definitions/ImportFile.definition.js +36 -6
- package/lib/metadataTypes/definitions/TransactionalEmail.definition.js +19 -1
- package/lib/metadataTypes/definitions/TriggeredSend.definition.js +1 -0
- package/lib/metadataTypes/definitions/Verification.definition.js +88 -0
- package/lib/util/cache.js +9 -4
- package/lib/util/cli.js +40 -0
- package/lib/util/file.js +2 -2
- package/lib/util/init.js +84 -0
- package/lib/util/util.js +121 -13
- package/package.json +13 -13
- package/test/mockRoot/.mcdevrc.json +1 -1
- package/test/mockRoot/deploy/testInstance/_ParentBU_/dataExtension/testExisting_dataExtensionShared.dataExtension-meta.json +59 -0
- package/test/mockRoot/deploy/testInstance/_ParentBU_/dataExtension/testNew_dataExtensionShared.dataExtension-meta.json +23 -0
- package/test/mockRoot/deploy/testInstance/testBU/automation/testExisting_automation.automation-meta.json +1 -2
- package/test/mockRoot/deploy/testInstance/testBU/automation/testNew_automation.automation-meta.json +9 -6
- package/test/mockRoot/deploy/testInstance/testBU/dataExtension/testExisting_dataExtension.dataExtension-meta.json +1 -0
- package/test/mockRoot/deploy/testInstance/testBU/dataExtract/testExisting_dataExtract.dataExtract-meta.json +35 -0
- package/test/mockRoot/deploy/testInstance/testBU/dataExtract/testNew_dataExtract.dataExtract-meta.json +35 -0
- package/test/mockRoot/deploy/testInstance/testBU/fileTransfer/testExisting_fileTransfer.fileTransfer-meta.json +17 -0
- package/test/mockRoot/deploy/testInstance/testBU/fileTransfer/testNew_fileTransfer.fileTransfer-meta.json +17 -0
- package/test/mockRoot/deploy/testInstance/testBU/importFile/testExisting_importFile.importFile-meta.json +29 -0
- package/test/mockRoot/deploy/testInstance/testBU/importFile/testNew_importFile.importFile-meta.json +29 -0
- package/test/mockRoot/deploy/testInstance/testBU/query/testExisting_query_fixKeys.query-meta.json +11 -0
- package/test/mockRoot/deploy/testInstance/testBU/query/testExisting_query_fixKeys.query-meta.sql +6 -0
- package/test/mockRoot/deploy/testInstance/testBU/script/testExisting_script.script-meta.json +6 -0
- package/test/mockRoot/deploy/testInstance/testBU/script/testExisting_script.script-meta.ssjs +1 -0
- package/test/mockRoot/deploy/testInstance/testBU/script/testNew_script.script-meta.json +6 -0
- package/test/mockRoot/deploy/testInstance/testBU/script/testNew_script.script-meta.ssjs +1 -0
- package/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testExisting_temail.transactionalEmail-meta.json +3 -4
- package/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testNew_temail.transactionalEmail-meta.json +1 -6
- package/test/mockRoot/deploy/testInstance/testBU/triggeredSend/testExisting_triggeredSend.triggeredSend-meta.json +29 -0
- package/test/mockRoot/deploy/testInstance/testBU/triggeredSend/testNew_triggeredSend.triggeredSend-meta.json +29 -0
- package/test/mockRoot/deploy/testInstance/testBU/verification/testExisting_39f6a488-20eb-4ba0-b0b9.verification-meta.json +11 -0
- package/test/mockRoot/deploy/testInstance/testBU/verification/testNew_39f6a488-20eb-4ba0-b0b9.verification-meta.json +11 -0
- package/test/resourceFactory.js +77 -12
- package/test/resources/1111111/accountUser/retrieve-ActiveFlag=falseANDCustomerKey=testExisting_userANDEmaillike@-response.xml +27 -0
- package/test/resources/1111111/accountUser/retrieve-ActiveFlag=falseANDEmaillike@-response.xml +156 -0
- package/test/resources/1111111/accountUser/retrieve-ActiveFlag=trueANDEmailisNullORNamelikeapp userANDMustChangePassword=false-response.xml +87 -0
- package/test/resources/1111111/accountUser/retrieve-ActiveFlag=trueANDEmaillike@-response.xml +156 -0
- package/test/resources/1111111/accountUser/retrieve-CustomerKey=testExisting_userANDActiveFlag=trueANDEmailisNullORNamelikeapp userANDMustChangePassword=false-response.xml +27 -0
- package/test/resources/1111111/accountUserAccount/retrieve-AccountUser.AccountUserID=700301950-response.xml +60 -0
- package/test/resources/1111111/data/v1/customobjectdata/key/testExisting_dataExtensionShared/rowset/get-response.json +13 -0
- package/test/resources/1111111/dataExtension/create-expected.json +23 -0
- package/test/resources/1111111/dataExtension/create-response.xml +59 -0
- package/test/resources/1111111/dataExtension/retrieve-expected.json +55 -0
- package/test/resources/1111111/dataExtension/retrieve-expected.md +18 -0
- package/test/resources/1111111/dataExtension/retrieve-response.xml +27 -1
- package/test/resources/1111111/dataExtension/update-expected.json +55 -0
- package/test/resources/1111111/dataExtension/update-response.xml +57 -0
- package/test/resources/1111111/dataExtensionField/retrieve-CustomerKey=[testExisting_dataExtensionShared].[TriggerUpdate_randomNumber_]-response.xml +45 -0
- package/test/resources/1111111/dataExtensionField/retrieve-DataExtension.CustomerKey=testExisting_dataExtensionShared-response.xml +98 -0
- package/test/resources/1111111/dataExtensionField/retrieve-DataExtension.CustomerKey=testNew_dataExtensionSharedORDataExtension.CustomerKey=testExisting_dataExtensionShared-response.xml +98 -0
- package/test/resources/1111111/dataExtensionField/retrieve-response.xml +98 -0
- package/test/resources/1111111/dataExtensionTemplate/retrieve-response.xml +303 -0
- package/test/resources/1111111/dataFolder/retrieve-ContentType=synchronizeddataextensionORContentType=shared_salesforcedataextensionORContentType=shared_dataextensionORContentType=shared_dataORContentType=salesforcedataextensionORContentType=dataextensionORContentType=hidden-response.xml +387 -0
- package/test/resources/1111111/dataFolder/retrieve-response.xml +353 -9
- package/test/resources/1111111/user/retrieve-expected.md +4 -2
- package/test/resources/9999999/attributeGroup/retrieve-expected.json +25 -0
- package/test/resources/9999999/attributeSet/retrieve-expected.json +143 -0
- package/test/resources/9999999/automation/build-expected.json +5 -2
- package/test/resources/9999999/automation/create-expected.json +11 -8
- package/test/resources/9999999/automation/create-testNew_automation-expected.md +5 -4
- package/test/resources/9999999/automation/patch_fixKeys-pause-expected.json +44 -0
- package/test/resources/9999999/automation/patch_fixKeys-schedule-expected.json +44 -0
- package/test/resources/9999999/automation/perform-08afb0e2-b00a-4c88-ad2e-1f7f8788c560-response.xml +42 -0
- package/test/resources/9999999/automation/perform-08afb0e2-b00a-4c88-fixKey_pause-response.xml +42 -0
- package/test/resources/9999999/automation/perform-08afb0e2-b00a-4c88-fixKey_schedule-response.xml +42 -0
- package/test/resources/9999999/automation/perform-a8afb0e2-b00a-4c88-ad2e-1f7f8788c560-response.xml +42 -0
- package/test/resources/9999999/automation/retrieve-expected.json +5 -2
- package/test/resources/9999999/automation/retrieve-testExisting_automation-expected.md +3 -2
- package/test/resources/9999999/automation/schedule-08afb0e2-b00a-4c88-ad2e-1f7f8788c560-response.xml +52 -0
- package/test/resources/9999999/automation/schedule-08afb0e2-b00a-4c88-ad2e-pause-response.xml +38 -0
- package/test/resources/9999999/automation/schedule-08afb0e2-b00a-4c88-fixKey_pause-response.xml +52 -0
- package/test/resources/9999999/automation/schedule-08afb0e2-b00a-4c88-fixKey_schedule-response.xml +52 -0
- package/test/resources/9999999/automation/schedule-a8afb0e2-b00a-4c88-ad2e-1f7f8788c560-response.xml +52 -0
- package/test/resources/9999999/automation/template-expected.json +5 -2
- package/test/resources/9999999/automation/update-expected.json +1 -2
- package/test/resources/9999999/automation/update-testExisting_automation-expected.md +2 -2
- package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-ad2e-1f7f8788c560/get-response.json +7 -0
- package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-ad2e-pause/get-response.json +85 -0
- package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-ad2e-pause/patch-response.json +85 -0
- package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-fixKey_pause/get-response.json +85 -0
- package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-fixKey_pause/patch-response.json +85 -0
- package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-fixKey_schedule/get-response.json +85 -0
- package/test/resources/9999999/automation/v1/automations/08afb0e2-b00a-4c88-fixKey_schedule/patch-response.json +85 -0
- package/test/resources/9999999/automation/v1/automations/a8afb0e2-b00a-4c88-ad2e-1f7f8788c560/get-response.json +1 -1
- package/test/resources/9999999/automation/v1/automations/post-response.json +27 -19
- package/test/resources/9999999/automation/v1/dataextracts/56c5370a-f988-4f36-b0ee-0f876573f6d7/patch-response.json +38 -0
- package/test/resources/9999999/automation/v1/dataextracts/post-response.json +38 -0
- package/test/resources/9999999/automation/v1/dataextracttypes/get-response.json +50 -0
- package/test/resources/9999999/automation/v1/dataverifications/post-response.json +12 -0
- package/test/resources/9999999/automation/v1/dataverifications/testExisting_39f6a488-20eb-4ba0-b0b9/delete-response.json +0 -0
- package/test/resources/9999999/automation/v1/dataverifications/testExisting_39f6a488-20eb-4ba0-b0b9/get-response.json +12 -0
- package/test/resources/9999999/automation/v1/dataverifications/testExisting_39f6a488-20eb-4ba0-b0b9/patch-response.json +12 -0
- package/test/resources/9999999/automation/v1/filetransfers/72c328ac-f5b0-4e37-91d3-a775666f15a6/patch-response.json +18 -0
- package/test/resources/9999999/automation/v1/filetransfers/post-response.json +18 -0
- package/test/resources/9999999/automation/v1/ftplocations/get-response.json +18 -0
- package/test/resources/9999999/automation/v1/imports/9d16f42c-2260-ed11-b849-48df37d1de8b/patch-response.json +31 -0
- package/test/resources/9999999/automation/v1/imports/get-response.json +1 -1
- package/test/resources/9999999/automation/v1/imports/post-response.json +30 -0
- package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dae/actions/start/post-response.txt +1 -0
- package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat_fixKeys/get-response.json +17 -0
- package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat_fixKeys/patch-response.json +18 -0
- package/test/resources/9999999/automation/v1/queries/get-response.json +18 -1
- package/test/resources/9999999/automation/v1/scripts/39f6a488-20eb-4ba0-b0b9-023725b574e4/patch-response.json +10 -0
- package/test/resources/9999999/automation/v1/scripts/get-response.json +12 -2
- package/test/resources/9999999/automation/v1/scripts/post-response.json +10 -0
- package/test/resources/9999999/dataExtension/build-expected.json +16 -0
- package/test/resources/9999999/dataExtension/delete-response.xml +42 -0
- package/test/resources/9999999/dataExtension/retrieve-Name=testExisting_dataExtension-response.xml +52 -0
- package/test/resources/9999999/dataExtension/retrieve-expected.json +16 -0
- package/test/resources/9999999/dataExtension/retrieve-expected.md +3 -1
- package/test/resources/9999999/dataExtension/template-expected.json +16 -0
- package/test/resources/9999999/dataExtension/update-expected.json +17 -1
- package/test/resources/9999999/dataExtensionField/retrieve-CustomerKey=[testExisting_dataExtension].[LastName]-response.xml +44 -0
- package/test/resources/9999999/dataExtensionField/retrieve-DataExtension.CustomerKey=testExisting_dataExtension-response.xml +133 -0
- package/test/resources/9999999/dataExtensionField/retrieve-DataExtension.CustomerKey=testNew_dataExtensionORDataExtension.CustomerKey=testExisting_dataExtension-response.xml +99 -0
- package/test/resources/9999999/dataExtensionField/retrieve-response.xml +36 -1
- package/test/resources/9999999/dataExtract/build-expected.json +35 -0
- package/test/resources/9999999/dataExtract/get-expected.json +39 -0
- package/test/resources/9999999/dataExtract/patch-expected.json +37 -0
- package/test/resources/9999999/dataExtract/post-expected.json +37 -0
- package/test/resources/9999999/dataExtract/template-expected.json +35 -0
- package/test/resources/9999999/dataFolder/retrieve-ContentType=contextual_suppression_listORContentType=publicationORContentType=suppression_listORContentType=mysubsORContentType=list-response.xml +136 -0
- package/test/resources/9999999/dataFolder/retrieve-ContentType=ssjsactivity-response.xml +48 -0
- package/test/resources/9999999/dataFolder/retrieve-ContentType=synchronizeddataextensionORContentType=shared_salesforcedataextensionORContentType=shared_dataextensionORContentType=shared_dataORContentType=salesforcedataextensionORContentType=dataextensionORContentType=hidden-response.xml +117 -0
- package/test/resources/9999999/dataFolder/retrieve-ContentType=triggered_send_journeybuilderORContentType=triggered_sendORContentType=hidden-response.xml +276 -0
- package/test/resources/9999999/dataFolder/retrieve-response.xml +23 -0
- package/test/resources/9999999/email/retrieve-response.xml +203 -0
- package/test/resources/9999999/fileTransfer/build-expected.json +15 -0
- package/test/resources/9999999/fileTransfer/get-expected.json +17 -0
- package/test/resources/9999999/fileTransfer/patch-expected.json +17 -0
- package/test/resources/9999999/fileTransfer/post-expected.json +17 -0
- package/test/resources/9999999/fileTransfer/template-expected.json +15 -0
- package/test/resources/9999999/hub/v1/contacts/schema/attributeGroups/get-response.json +628 -0
- package/test/resources/9999999/hub/v1/contacts/schema/setDefinitions/get-response.json +20194 -0
- package/test/resources/9999999/importFile/build-expected.json +27 -0
- package/test/resources/9999999/importFile/get-expected.json +29 -0
- package/test/resources/9999999/importFile/patch-expected.json +29 -0
- package/test/resources/9999999/importFile/post-expected.json +29 -0
- package/test/resources/9999999/importFile/template-expected.json +27 -0
- package/test/resources/9999999/interaction/v1/interactions/233d4413-922c-4568-85a5-e5cc77efc3be/delete-response.json +1 -0
- package/test/resources/9999999/legacy/v1/beta/bulk/automations/automation/definition/get-response.json +1 -1
- package/test/resources/9999999/messaging/v1/email/definitions/post-response.json +1 -1
- package/test/resources/9999999/messaging/v1/email/definitions/testExisting_temail/delete-response.json +6 -0
- package/test/resources/9999999/program/retrieve-CustomerKey=testExisting_automation_fixKey_pause-response.xml +32 -0
- package/test/resources/9999999/program/retrieve-CustomerKey=testExisting_automation_fixKey_schedule-response.xml +32 -0
- package/test/resources/9999999/program/retrieve-CustomerKey=testExisting_automation_fixedKey_paused-response.xml +32 -0
- package/test/resources/9999999/program/retrieve-CustomerKey=testExisting_automation_fixedKey_scheduled-response.xml +32 -0
- package/test/resources/9999999/program/retrieve-CustomerKey=testExisting_automation_pause-response.xml +30 -0
- package/test/resources/9999999/program/retrieve-response.xml +21 -3
- package/test/resources/9999999/query/patch_fixKeys-expected.json +11 -0
- package/test/resources/9999999/query/patch_fixKeys-expected.sql +6 -0
- package/test/resources/9999999/queryDefinition/retrieve-CustomerKey=testExisting_query_fixKeysANDStatus=Active-response.xml +30 -0
- package/test/resources/9999999/queryDefinition/retrieve-CustomerKey=testExisting_query_fixedKeysANDStatus=Active-response.xml +30 -0
- package/test/resources/9999999/queryDefinition/retrieve-CustomerKey=testNew_queryANDStatus=Active-response.xml +30 -0
- package/test/resources/9999999/script/build-expected.json +6 -0
- package/test/resources/9999999/script/build-expected.ssjs +1 -0
- package/test/resources/9999999/script/get-expected.json +8 -0
- package/test/resources/9999999/script/get-expected.ssjs +1 -0
- package/test/resources/9999999/script/get_noScriptTag-expected.html +1 -0
- package/test/resources/9999999/script/get_noScriptTag-expected.json +8 -0
- package/test/resources/9999999/script/patch-expected.json +8 -0
- package/test/resources/9999999/script/patch-expected.ssjs +1 -0
- package/test/resources/9999999/script/post-expected.json +8 -0
- package/test/resources/9999999/script/post-expected.ssjs +1 -0
- package/test/resources/9999999/script/template-expected.json +6 -0
- package/test/resources/9999999/script/template-expected.ssjs +1 -0
- package/test/resources/9999999/transactionalEmail/build-expected.json +3 -7
- package/test/resources/9999999/transactionalEmail/get-expected.json +3 -7
- package/test/resources/9999999/transactionalEmail/patch-expected.json +3 -7
- package/test/resources/9999999/transactionalEmail/post-expected.json +3 -7
- package/test/resources/9999999/transactionalEmail/template-expected.json +3 -7
- package/test/resources/9999999/triggeredSend/build-expected.json +29 -0
- package/test/resources/9999999/triggeredSend/get-expected.json +29 -0
- package/test/resources/9999999/triggeredSend/patch-expected.json +29 -0
- package/test/resources/9999999/triggeredSend/post-expected.json +29 -0
- package/test/resources/9999999/triggeredSend/template-expected.json +29 -0
- package/test/resources/9999999/triggeredSendDefinition/create-response.xml +75 -0
- package/test/resources/9999999/triggeredSendDefinition/delete-response.xml +36 -0
- package/test/resources/9999999/triggeredSendDefinition/{retrieve-response.xml → retrieve-TriggeredSendStatusINNew,Active,Inactive,Moved,Canceled-response.xml} +4 -4
- package/test/resources/9999999/triggeredSendDefinition/update-response.xml +74 -0
- package/test/resources/9999999/verification/build-expected.json +11 -0
- package/test/resources/9999999/verification/get-expected.json +11 -0
- package/test/resources/9999999/verification/patch-expected.json +11 -0
- package/test/resources/9999999/verification/post-expected.json +11 -0
- package/test/resources/9999999/verification/template-expected.json +11 -0
- package/test/type.attributeGroup.test.js +55 -0
- package/test/type.attributeSet.test.js +55 -0
- package/test/type.automation.test.js +650 -17
- package/test/type.dataExtension.test.js +205 -46
- package/test/type.dataExtract.test.js +194 -0
- package/test/type.fileTransfer.test.js +192 -0
- package/test/type.importFile.test.js +193 -0
- package/test/type.journey.test.js +38 -11
- package/test/type.mobileKeyword.test.js +6 -5
- package/test/type.mobileMessage.test.js +6 -4
- package/test/type.query.test.js +470 -17
- package/test/type.script.test.js +372 -0
- package/test/type.transactionalEmail.test.js +12 -11
- package/test/type.transactionalPush.test.js +2 -4
- package/test/type.transactionalSMS.test.js +2 -4
- package/test/type.triggeredSend.test.js +154 -0
- package/test/type.user.test.js +22 -10
- package/test/type.verification.test.js +173 -0
- package/test/utils.js +11 -2
- package/types/mcdev.d.js +14 -0
- package/lib/metadataTypes/SetDefinition.js +0 -37
- /package/test/resources/1111111/accountUser/{retrieve-response.xml → retrieve-ActiveFlag=trueANDCustomerKey=testExisting_userANDEmaillike@-response.xml} +0 -0
- /package/test/resources/1111111/accountUserAccount/{retrieve-response.xml → retrieve-AccountUser.AccountUserIDIN700301950,700301951,7471228-response.xml} +0 -0
- /package/test/resources/1111111/businessUnit/{retrieve-response.xml → retrieve-ID=1111111-response.xml} +0 -0
- /package/test/resources/1111111/list/{retrieve-response.xml → retrieve-CustomerKey=All SubscribersORListName=All Subscribers-response.xml} +0 -0
- /package/test/resources/1111111/role/{retrieve-response.xml → retrieve-IsPrivate=false-response.xml} +0 -0
- /package/test/resources/9999999/emailSendDefinition/{retrieve-response.xml → retrieve-IsPlatformObject=falseANDDescriptionnotEqualsSFSendDefinition-response.xml} +0 -0
- /package/test/resources/9999999/queryDefinition/{retrieve-response.xml → retrieve-CustomerKey=testExisting_queryANDStatus=Active-response.xml} +0 -0
|
@@ -5,11 +5,13 @@ const TYPE = require('../../types/mcdev.d');
|
|
|
5
5
|
const MetadataType = require('./MetadataType');
|
|
6
6
|
const DataExtensionField = require('./DataExtensionField');
|
|
7
7
|
const Folder = require('./Folder');
|
|
8
|
+
const AttributeSet = require('./AttributeSet');
|
|
8
9
|
const Util = require('../util/util');
|
|
9
10
|
const File = require('../util/file');
|
|
10
11
|
const auth = require('../util/auth');
|
|
11
12
|
const cache = require('../util/cache');
|
|
12
13
|
const pLimit = require('p-limit');
|
|
14
|
+
const inquirer = require('inquirer');
|
|
13
15
|
|
|
14
16
|
/**
|
|
15
17
|
* DataExtension MetadataType
|
|
@@ -45,7 +47,7 @@ class DataExtension extends MetadataType {
|
|
|
45
47
|
};
|
|
46
48
|
}
|
|
47
49
|
Util.logger.info(` - Caching dependent Metadata: dataExtensionField`);
|
|
48
|
-
await this
|
|
50
|
+
await this.#attachFields(metadataMap, fieldOptions);
|
|
49
51
|
|
|
50
52
|
/** @type {object[]} */
|
|
51
53
|
const metadataToCreate = [];
|
|
@@ -203,7 +205,7 @@ class DataExtension extends MetadataType {
|
|
|
203
205
|
}
|
|
204
206
|
}
|
|
205
207
|
/**
|
|
206
|
-
* helper for {@link upsert}
|
|
208
|
+
* helper for {@link DataExtension.upsert}
|
|
207
209
|
*
|
|
208
210
|
* @private
|
|
209
211
|
* @param {object} res -
|
|
@@ -283,7 +285,7 @@ class DataExtension extends MetadataType {
|
|
|
283
285
|
* @param {{created: number, updated: number}} createdUpdated counter representing successful creates/updates
|
|
284
286
|
* @returns {void}
|
|
285
287
|
*/
|
|
286
|
-
static postDeployTasks(upsertedMetadata, originalMetadata, createdUpdated) {
|
|
288
|
+
static async postDeployTasks(upsertedMetadata, originalMetadata, createdUpdated) {
|
|
287
289
|
for (const key in upsertedMetadata) {
|
|
288
290
|
const item = upsertedMetadata[key];
|
|
289
291
|
|
|
@@ -354,6 +356,376 @@ class DataExtension extends MetadataType {
|
|
|
354
356
|
DataExtensionField.postRetrieveTasks(field, true);
|
|
355
357
|
}
|
|
356
358
|
}
|
|
359
|
+
await this.#fixShared(upsertedMetadata, originalMetadata, createdUpdated);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* takes care of updating attribute groups on child BUs after an update to Shared DataExtensions
|
|
364
|
+
* helper for {@link DataExtension.postDeployTasks}
|
|
365
|
+
* fixes an issue where shared data extensions are not visible in data designer on child BU; SF known issue: https://issues.salesforce.com/#q=W-11031095
|
|
366
|
+
*
|
|
367
|
+
* @param {TYPE.DataExtensionMap} upsertedMetadata metadata mapped by their keyField
|
|
368
|
+
* @param {TYPE.DataExtensionMap} originalMetadata metadata to be updated (contains additioanl fields)
|
|
369
|
+
* @param {{created: number, updated: number}} createdUpdated counter representing successful creates/updates
|
|
370
|
+
* @returns {void}
|
|
371
|
+
*/
|
|
372
|
+
static async #fixShared(upsertedMetadata, originalMetadata, createdUpdated) {
|
|
373
|
+
if (this.buObject.eid !== this.buObject.mid) {
|
|
374
|
+
// only if we were executing a deploy on parent bu could we be deploying shared data extensions
|
|
375
|
+
Util.logger.debug(`Skipping fixShared logic because we are not executing on Parent BU`);
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
if (createdUpdated.updated === 0) {
|
|
379
|
+
// only if updates were made could the issue in https://issues.salesforce.com/#q=W-11031095 affect data designer
|
|
380
|
+
Util.logger.debug(`Skipping fixShared logic because nothing was updated`);
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// find all shared data extensions
|
|
385
|
+
if (!this.deployedSharedKeys.length) {
|
|
386
|
+
Util.logger.debug(
|
|
387
|
+
`Skipping fixShared logic because no Shared Data Extensions were updated`
|
|
388
|
+
);
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
const sharedDataExtensionsKeys = this.deployedSharedKeys;
|
|
393
|
+
this.deployedSharedKeys = null;
|
|
394
|
+
|
|
395
|
+
if (Util.OPTIONS.fixShared) {
|
|
396
|
+
// select which BUs to run this for
|
|
397
|
+
const selectedBuNames = await this.#fixShared_getBUs();
|
|
398
|
+
|
|
399
|
+
// backup settings
|
|
400
|
+
const buObjectBak = this.buObject;
|
|
401
|
+
const clientBak = this.client;
|
|
402
|
+
|
|
403
|
+
// get dataExtension ID-Key relationship
|
|
404
|
+
const sharedDataExtensionMap = {};
|
|
405
|
+
for (const key of sharedDataExtensionsKeys) {
|
|
406
|
+
try {
|
|
407
|
+
const id = cache.searchForField(
|
|
408
|
+
'dataExtension',
|
|
409
|
+
key,
|
|
410
|
+
'CustomerKey',
|
|
411
|
+
'ObjectID',
|
|
412
|
+
this.buObject.eid
|
|
413
|
+
);
|
|
414
|
+
sharedDataExtensionMap[id] = key;
|
|
415
|
+
} catch {
|
|
416
|
+
continue;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// run the fix-data-model logic
|
|
421
|
+
Util.logger.info(
|
|
422
|
+
`Fixing Shared Data Extensions details in data models of child BUs` +
|
|
423
|
+
Util.getKeysString(sharedDataExtensionsKeys)
|
|
424
|
+
);
|
|
425
|
+
|
|
426
|
+
for (const buName of selectedBuNames) {
|
|
427
|
+
await this.#fixShared_onBU(buName, buObjectBak, clientBak, sharedDataExtensionMap);
|
|
428
|
+
}
|
|
429
|
+
Util.logger.info(`Finished fixing Shared Data Extensions details in data models`);
|
|
430
|
+
|
|
431
|
+
// restore settings
|
|
432
|
+
this.buObject = buObjectBak;
|
|
433
|
+
this.client = clientBak;
|
|
434
|
+
} else {
|
|
435
|
+
Util.logger.warn(
|
|
436
|
+
'Shared Data Extensions were updated but --fixShared option is not set. This can result in your changes not being visible in attribute groups on child BUs.'
|
|
437
|
+
);
|
|
438
|
+
Util.logger.info(
|
|
439
|
+
'We recommend to re-run your deployment with the --fixShared option unless you are sure your Shared Data Extension is not used in attribute groups on any child BU.'
|
|
440
|
+
);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* helper for {@link DataExtension.#fixShared}
|
|
446
|
+
*
|
|
447
|
+
* @returns {string[]} list of selected BU names
|
|
448
|
+
*/
|
|
449
|
+
static async #fixShared_getBUs() {
|
|
450
|
+
const buListObj = this.properties.credentials[this.buObject.credential].businessUnits;
|
|
451
|
+
const fixBuPreselected = [];
|
|
452
|
+
const availableBuNames = Object.keys(buListObj).filter(
|
|
453
|
+
(buName) => buName !== Util.parentBuName
|
|
454
|
+
);
|
|
455
|
+
if (typeof Util.OPTIONS.fixShared === 'string') {
|
|
456
|
+
if (Util.OPTIONS.fixShared === '*') {
|
|
457
|
+
// pre-select all BUs
|
|
458
|
+
fixBuPreselected.push(...availableBuNames);
|
|
459
|
+
} else {
|
|
460
|
+
// pre-select BUs from comma-separated list
|
|
461
|
+
fixBuPreselected.push(
|
|
462
|
+
...Util.OPTIONS.fixShared
|
|
463
|
+
.split(',')
|
|
464
|
+
.filter(Boolean)
|
|
465
|
+
.map((bu) => bu.trim())
|
|
466
|
+
.filter((bu) => availableBuNames.includes(bu))
|
|
467
|
+
);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
if (Util.skipInteraction && fixBuPreselected.length) {
|
|
471
|
+
// assume programmatic use case or user that wants to skip the wizard. Use pre-selected BUs
|
|
472
|
+
return fixBuPreselected;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
const buList = availableBuNames.map((name) => ({
|
|
476
|
+
name,
|
|
477
|
+
value: name,
|
|
478
|
+
checked: fixBuPreselected.includes(name),
|
|
479
|
+
}));
|
|
480
|
+
const questions = {
|
|
481
|
+
type: 'checkbox',
|
|
482
|
+
name: 'businessUnits',
|
|
483
|
+
message: 'Please select BUs that have access to the updated Shared Data Extensions:',
|
|
484
|
+
pageSize: 10,
|
|
485
|
+
choices: buList,
|
|
486
|
+
};
|
|
487
|
+
let responses = null;
|
|
488
|
+
|
|
489
|
+
try {
|
|
490
|
+
responses = await inquirer.prompt(questions);
|
|
491
|
+
} catch (ex) {
|
|
492
|
+
Util.logger.info(ex);
|
|
493
|
+
}
|
|
494
|
+
return responses.businessUnits;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
/**
|
|
498
|
+
* helper for {@link DataExtension.#fixShared}
|
|
499
|
+
*
|
|
500
|
+
* @param {string} childBuName name of child BU to fix
|
|
501
|
+
* @param {TYPE.BuObject} buObjectParent bu object for parent BU
|
|
502
|
+
* @param {object} clientParent SDK for parent BU
|
|
503
|
+
* @param {Object.<string, string>} sharedDataExtensionMap ID-Key relationship of shared data extensions
|
|
504
|
+
* @returns {Promise.<string[]>} updated shared DE keys on BU
|
|
505
|
+
*/
|
|
506
|
+
static async #fixShared_onBU(
|
|
507
|
+
childBuName,
|
|
508
|
+
buObjectParent,
|
|
509
|
+
clientParent,
|
|
510
|
+
sharedDataExtensionMap
|
|
511
|
+
) {
|
|
512
|
+
/** @type {TYPE.BuObject} */
|
|
513
|
+
const buObjectChildBu = {
|
|
514
|
+
eid: this.properties.credentials[buObjectParent.credential].eid,
|
|
515
|
+
mid: this.properties.credentials[buObjectParent.credential].businessUnits[childBuName],
|
|
516
|
+
businessUnit: childBuName,
|
|
517
|
+
credential: this.buObject.credential,
|
|
518
|
+
};
|
|
519
|
+
const clientChildBu = auth.getSDK(buObjectChildBu);
|
|
520
|
+
|
|
521
|
+
try {
|
|
522
|
+
// check if shared data Extension is used in an attributeSet on current BU
|
|
523
|
+
AttributeSet.properties = this.properties;
|
|
524
|
+
AttributeSet.buObject = buObjectChildBu;
|
|
525
|
+
AttributeSet.client = clientChildBu;
|
|
526
|
+
const sharedDeIdsUsedOnBU = await AttributeSet.fixShared_retrieve(
|
|
527
|
+
sharedDataExtensionMap,
|
|
528
|
+
DataExtensionField.fixShared_fields
|
|
529
|
+
);
|
|
530
|
+
if (sharedDeIdsUsedOnBU.length) {
|
|
531
|
+
let sharedDataExtensionsKeys = sharedDeIdsUsedOnBU.map(
|
|
532
|
+
(deId) => sharedDataExtensionMap[deId]
|
|
533
|
+
);
|
|
534
|
+
Util.logger.info(
|
|
535
|
+
` - Fixing dataExtensions on BU ${childBuName} ` +
|
|
536
|
+
Util.getKeysString(sharedDataExtensionsKeys)
|
|
537
|
+
);
|
|
538
|
+
|
|
539
|
+
for (const deId of sharedDeIdsUsedOnBU) {
|
|
540
|
+
// dont use Promise.all to ensure order of execution; otherwise, switched BU contexts in one step will affect the next
|
|
541
|
+
const fixed = await this.#fixShared_item(
|
|
542
|
+
deId,
|
|
543
|
+
sharedDataExtensionMap[deId],
|
|
544
|
+
buObjectChildBu,
|
|
545
|
+
clientChildBu,
|
|
546
|
+
buObjectParent,
|
|
547
|
+
clientParent
|
|
548
|
+
);
|
|
549
|
+
if (!fixed) {
|
|
550
|
+
// remove from list of shared DEs that were fixed
|
|
551
|
+
sharedDataExtensionsKeys = sharedDataExtensionsKeys.filter(
|
|
552
|
+
(key) => key !== sharedDataExtensionMap[deId]
|
|
553
|
+
);
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
if (sharedDataExtensionsKeys.length) {
|
|
557
|
+
Util.logger.debug(
|
|
558
|
+
` - Fixed ${sharedDataExtensionsKeys.length}/${
|
|
559
|
+
sharedDeIdsUsedOnBU.length
|
|
560
|
+
}: ${sharedDataExtensionsKeys.join(', ')}`
|
|
561
|
+
);
|
|
562
|
+
}
|
|
563
|
+
return sharedDataExtensionsKeys;
|
|
564
|
+
} else {
|
|
565
|
+
Util.logger.info(
|
|
566
|
+
Util.getGrayMsg(
|
|
567
|
+
` - No matching attributeSet found for given Shared Data Extensions keys found on BU ${childBuName}`
|
|
568
|
+
)
|
|
569
|
+
);
|
|
570
|
+
return [];
|
|
571
|
+
}
|
|
572
|
+
} catch (ex) {
|
|
573
|
+
Util.logger.error(ex.message);
|
|
574
|
+
return [];
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
/**
|
|
579
|
+
* method that actually takes care of triggering the update for a particular BU-sharedDe combo
|
|
580
|
+
* helper for {@link DataExtension.#fixShared_onBU}
|
|
581
|
+
*
|
|
582
|
+
* @param {string} deId data extension ObjectID
|
|
583
|
+
* @param {string} deKey dataExtension key
|
|
584
|
+
* @param {TYPE.BuObject} buObjectChildBu BU object for Child BU
|
|
585
|
+
* @param {object} clientChildBu SDK for child BU
|
|
586
|
+
* @param {TYPE.BuObject} buObjectParent BU object for Parent BU
|
|
587
|
+
* @param {object} clientParent SDK for parent BU
|
|
588
|
+
* @returns {Promise.<boolean>} flag that signals if the fix was successful
|
|
589
|
+
*/
|
|
590
|
+
static async #fixShared_item(
|
|
591
|
+
deId,
|
|
592
|
+
deKey,
|
|
593
|
+
buObjectChildBu,
|
|
594
|
+
clientChildBu,
|
|
595
|
+
buObjectParent,
|
|
596
|
+
clientParent
|
|
597
|
+
) {
|
|
598
|
+
try {
|
|
599
|
+
// add field via child BU
|
|
600
|
+
const randomSuffix = await DataExtension.#fixShared_item_addField(
|
|
601
|
+
buObjectChildBu,
|
|
602
|
+
clientChildBu,
|
|
603
|
+
deKey,
|
|
604
|
+
deId
|
|
605
|
+
);
|
|
606
|
+
|
|
607
|
+
// get field ID from parent BU (it is not returned on child BU)
|
|
608
|
+
const fieldObjectID = await DataExtension.#fixShared_item_getFieldId(
|
|
609
|
+
randomSuffix,
|
|
610
|
+
buObjectParent,
|
|
611
|
+
clientParent,
|
|
612
|
+
deKey
|
|
613
|
+
);
|
|
614
|
+
|
|
615
|
+
// delete field via child BU
|
|
616
|
+
await DataExtension.#fixShared_item_deleteField(
|
|
617
|
+
randomSuffix,
|
|
618
|
+
buObjectChildBu,
|
|
619
|
+
clientChildBu,
|
|
620
|
+
deKey,
|
|
621
|
+
fieldObjectID
|
|
622
|
+
);
|
|
623
|
+
|
|
624
|
+
Util.logger.info(
|
|
625
|
+
` - Fixed dataExtension ${deKey} on BU ${buObjectChildBu.businessUnit}`
|
|
626
|
+
);
|
|
627
|
+
|
|
628
|
+
return true;
|
|
629
|
+
} catch (ex) {
|
|
630
|
+
Util.logger.error(
|
|
631
|
+
`- error fixing dataExtension ${deKey} on BU ${buObjectChildBu.businessUnit}: ${ex.message}`
|
|
632
|
+
);
|
|
633
|
+
return false;
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
/**
|
|
638
|
+
* add a new field to the shared DE to trigger an update to the data model
|
|
639
|
+
* helper for {@link DataExtension.#fixShared_item}
|
|
640
|
+
*
|
|
641
|
+
* @param {TYPE.BuObject} buObjectChildBu BU object for Child BU
|
|
642
|
+
* @param {object} clientChildBu SDK for child BU
|
|
643
|
+
* @param {string} deKey dataExtension key
|
|
644
|
+
* @param {string} deId dataExtension ObjectID
|
|
645
|
+
* @returns {Promise.<string>} randomSuffix
|
|
646
|
+
*/
|
|
647
|
+
static async #fixShared_item_addField(buObjectChildBu, clientChildBu, deKey, deId) {
|
|
648
|
+
this.buObject = buObjectChildBu;
|
|
649
|
+
this.client = clientChildBu;
|
|
650
|
+
const randomSuffix = Util.OPTIONS._runningTest
|
|
651
|
+
? '_randomNumber_'
|
|
652
|
+
: Math.floor(Math.random() * 9999999999);
|
|
653
|
+
// add a new field to the shared DE to trigger an update to the data model
|
|
654
|
+
const soapType = this.definition.soapType || this.definition.type;
|
|
655
|
+
await this.client.soap.update(
|
|
656
|
+
Util.capitalizeFirstLetter(soapType),
|
|
657
|
+
{
|
|
658
|
+
CustomerKey: deKey,
|
|
659
|
+
ObjectID: deId,
|
|
660
|
+
Fields: {
|
|
661
|
+
Field: [
|
|
662
|
+
{
|
|
663
|
+
Name: 'TriggerUpdate' + randomSuffix,
|
|
664
|
+
IsRequired: false,
|
|
665
|
+
IsPrimaryKey: false,
|
|
666
|
+
FieldType: 'Boolean',
|
|
667
|
+
ObjectID: null,
|
|
668
|
+
},
|
|
669
|
+
],
|
|
670
|
+
},
|
|
671
|
+
},
|
|
672
|
+
null
|
|
673
|
+
);
|
|
674
|
+
return randomSuffix;
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
/**
|
|
678
|
+
* get ID of the field added by {@link DataExtension.#fixShared_item_addField} on the shared DE via parent BU
|
|
679
|
+
* helper for {@link DataExtension.#fixShared_item}
|
|
680
|
+
*
|
|
681
|
+
* @param {string} randomSuffix -
|
|
682
|
+
* @param {TYPE.BuObject} buObjectParent BU object for Parent BU
|
|
683
|
+
* @param {object} clientParent SDK for parent BU
|
|
684
|
+
* @param {string} deKey dataExtension key
|
|
685
|
+
* @returns {Promise.<string>} fieldObjectID
|
|
686
|
+
*/
|
|
687
|
+
static async #fixShared_item_getFieldId(randomSuffix, buObjectParent, clientParent, deKey) {
|
|
688
|
+
DataExtensionField.buObject = buObjectParent;
|
|
689
|
+
DataExtensionField.client = clientParent;
|
|
690
|
+
const fieldKey = `[${deKey}].[TriggerUpdate${randomSuffix}]`;
|
|
691
|
+
const fieldResponse = await DataExtensionField.retrieveForCache(
|
|
692
|
+
{
|
|
693
|
+
filter: {
|
|
694
|
+
leftOperand: 'CustomerKey',
|
|
695
|
+
operator: 'equals',
|
|
696
|
+
rightOperand: fieldKey,
|
|
697
|
+
},
|
|
698
|
+
},
|
|
699
|
+
['Name', 'ObjectID']
|
|
700
|
+
);
|
|
701
|
+
const fieldObjectID = fieldResponse.metadata[fieldKey]?.ObjectID;
|
|
702
|
+
return fieldObjectID;
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
/**
|
|
706
|
+
* delete the field added by {@link DataExtension.#fixShared_item_addField}
|
|
707
|
+
* helper for {@link DataExtension.#fixShared_item}
|
|
708
|
+
*
|
|
709
|
+
* @param {string} randomSuffix -
|
|
710
|
+
* @param {TYPE.BuObject} buObjectChildBu BU object for Child BU
|
|
711
|
+
* @param {object} clientChildBu SDK for child BU
|
|
712
|
+
* @param {string} deKey dataExtension key
|
|
713
|
+
* @param {string} fieldObjectID field ObjectID
|
|
714
|
+
* @returns {Promise} -
|
|
715
|
+
*/
|
|
716
|
+
static async #fixShared_item_deleteField(
|
|
717
|
+
randomSuffix,
|
|
718
|
+
buObjectChildBu,
|
|
719
|
+
clientChildBu,
|
|
720
|
+
deKey,
|
|
721
|
+
fieldObjectID
|
|
722
|
+
) {
|
|
723
|
+
DataExtensionField.buObject = buObjectChildBu;
|
|
724
|
+
DataExtensionField.client = clientChildBu;
|
|
725
|
+
await DataExtensionField.deleteByKeySOAP(
|
|
726
|
+
deKey + '.TriggerUpdate' + randomSuffix,
|
|
727
|
+
fieldObjectID
|
|
728
|
+
);
|
|
357
729
|
}
|
|
358
730
|
|
|
359
731
|
/**
|
|
@@ -390,70 +762,10 @@ class DataExtension extends MetadataType {
|
|
|
390
762
|
// in case of cache dont get fields
|
|
391
763
|
if (metadata && retrieveDir) {
|
|
392
764
|
// get fields from API
|
|
393
|
-
await this
|
|
765
|
+
await this.#attachFields(metadata, fieldOptions, additionalFields);
|
|
394
766
|
}
|
|
395
767
|
if (!retrieveDir && this.buObject.eid !== this.buObject.mid) {
|
|
396
|
-
|
|
397
|
-
Util.logger.info(
|
|
398
|
-
' - Caching dependent Metadata: dataExtension (shared via _ParentBU_)'
|
|
399
|
-
);
|
|
400
|
-
/** @type {TYPE.BuObject} */
|
|
401
|
-
const buObjectParentBu = {
|
|
402
|
-
eid: this.properties.credentials[this.buObject.credential].eid,
|
|
403
|
-
mid: this.properties.credentials[this.buObject.credential].eid,
|
|
404
|
-
businessUnit: Util.parentBuName,
|
|
405
|
-
credential: this.buObject.credential,
|
|
406
|
-
};
|
|
407
|
-
try {
|
|
408
|
-
this.client = auth.getSDK(buObjectParentBu);
|
|
409
|
-
} catch (ex) {
|
|
410
|
-
Util.logger.error(ex.message);
|
|
411
|
-
return;
|
|
412
|
-
}
|
|
413
|
-
const metadataParentBu = await this._retrieveAll(additionalFields);
|
|
414
|
-
|
|
415
|
-
// get shared folders to match our shared / synched Data Extensions
|
|
416
|
-
const subTypeArr = this.definition.dependencies
|
|
417
|
-
.filter((item) => item.startsWith('folder-'))
|
|
418
|
-
.map((item) => item.slice(7));
|
|
419
|
-
Util.logger.info(' - Caching dependent Metadata: folder (shared via _ParentBU_)');
|
|
420
|
-
Util.logSubtypes(subTypeArr);
|
|
421
|
-
Folder.client = this.client;
|
|
422
|
-
Folder.buObject = buObjectParentBu;
|
|
423
|
-
Folder.properties = this.properties;
|
|
424
|
-
const result = await Folder.retrieveForCache(null, subTypeArr);
|
|
425
|
-
cache.mergeMetadata('folder', result.metadata, this.buObject.eid);
|
|
426
|
-
|
|
427
|
-
// get the types and clean out non-shared ones
|
|
428
|
-
const folderTypesFromParent = require('../MetadataTypeDefinitions').folder
|
|
429
|
-
.folderTypesFromParent;
|
|
430
|
-
for (const metadataEntry in metadataParentBu) {
|
|
431
|
-
try {
|
|
432
|
-
// get the data extension type from the folder
|
|
433
|
-
const folderContentType = cache.searchForField(
|
|
434
|
-
'folder',
|
|
435
|
-
metadataParentBu[metadataEntry].CategoryID,
|
|
436
|
-
'ID',
|
|
437
|
-
'ContentType',
|
|
438
|
-
this.buObject.eid
|
|
439
|
-
);
|
|
440
|
-
if (!folderTypesFromParent.includes(folderContentType)) {
|
|
441
|
-
Util.logger.verbose(
|
|
442
|
-
`removing ${metadataEntry} because r__folder_ContentType '${folderContentType}' identifies this DE as not being shared`
|
|
443
|
-
);
|
|
444
|
-
delete metadataParentBu[metadataEntry];
|
|
445
|
-
}
|
|
446
|
-
} catch (ex) {
|
|
447
|
-
Util.logger.debug(
|
|
448
|
-
`removing ${metadataEntry} because of error while retrieving r__folder_ContentType: ${ex.message}`
|
|
449
|
-
);
|
|
450
|
-
delete metadataParentBu[metadataEntry];
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
// revert client to current default
|
|
455
|
-
this.client = auth.getSDK(this.buObject);
|
|
456
|
-
Folder.client = auth.getSDK(this.buObject);
|
|
768
|
+
const metadataParentBu = await this.retrieveSharedForCache(additionalFields);
|
|
457
769
|
|
|
458
770
|
// make sure to overwrite parent bu DEs with local ones
|
|
459
771
|
metadata = { ...metadataParentBu, ...metadata };
|
|
@@ -469,6 +781,82 @@ class DataExtension extends MetadataType {
|
|
|
469
781
|
return { metadata: metadata, type: 'dataExtension' };
|
|
470
782
|
}
|
|
471
783
|
|
|
784
|
+
/**
|
|
785
|
+
* get shared dataExtensions from parent BU and merge them into the cache
|
|
786
|
+
* helper for {@link DataExtension.retrieve} and for AttributeSet.fixShared_retrieve
|
|
787
|
+
*
|
|
788
|
+
* @param {string[]} [additionalFields] Returns specified fields even if their retrieve definition is not set to true
|
|
789
|
+
* @returns {Promise.<TYPE.DataExtensionMap>} keyField => metadata map
|
|
790
|
+
*/
|
|
791
|
+
static async retrieveSharedForCache(additionalFields = []) {
|
|
792
|
+
// for caching, we want to retrieve shared DEs as well from the instance parent BU
|
|
793
|
+
Util.logger.info(' - Caching dependent Metadata: dataExtension (shared via _ParentBU_)');
|
|
794
|
+
const buObjectBak = this.buObject;
|
|
795
|
+
const clientBak = this.client;
|
|
796
|
+
/** @type {TYPE.BuObject} */
|
|
797
|
+
const buObjectParentBu = {
|
|
798
|
+
eid: this.properties.credentials[this.buObject.credential].eid,
|
|
799
|
+
mid: this.properties.credentials[this.buObject.credential].eid,
|
|
800
|
+
businessUnit: Util.parentBuName,
|
|
801
|
+
credential: this.buObject.credential,
|
|
802
|
+
};
|
|
803
|
+
try {
|
|
804
|
+
this.buObject = buObjectParentBu;
|
|
805
|
+
this.client = auth.getSDK(buObjectParentBu);
|
|
806
|
+
} catch (ex) {
|
|
807
|
+
Util.logger.error(ex.message);
|
|
808
|
+
return;
|
|
809
|
+
}
|
|
810
|
+
const metadataParentBu = await this._retrieveAll(additionalFields);
|
|
811
|
+
|
|
812
|
+
// get shared folders to match our shared / synched Data Extensions
|
|
813
|
+
const subTypeArr = this.definition.dependencies
|
|
814
|
+
.filter((item) => item.startsWith('folder-'))
|
|
815
|
+
.map((item) => item.slice(7));
|
|
816
|
+
Util.logger.info(' - Caching dependent Metadata: folder (shared via _ParentBU_)');
|
|
817
|
+
Util.logSubtypes(subTypeArr);
|
|
818
|
+
Folder.client = this.client;
|
|
819
|
+
Folder.buObject = this.buObject;
|
|
820
|
+
Folder.properties = this.properties;
|
|
821
|
+
const result = await Folder.retrieveForCache(null, subTypeArr);
|
|
822
|
+
cache.mergeMetadata('folder', result.metadata, this.buObject.eid);
|
|
823
|
+
|
|
824
|
+
// get the types and clean out non-shared ones
|
|
825
|
+
const folderTypesFromParent = require('../MetadataTypeDefinitions').folder
|
|
826
|
+
.folderTypesFromParent;
|
|
827
|
+
for (const metadataEntry in metadataParentBu) {
|
|
828
|
+
try {
|
|
829
|
+
// get the data extension type from the folder
|
|
830
|
+
const folderContentType = cache.searchForField(
|
|
831
|
+
'folder',
|
|
832
|
+
metadataParentBu[metadataEntry].CategoryID,
|
|
833
|
+
'ID',
|
|
834
|
+
'ContentType',
|
|
835
|
+
this.buObject.eid
|
|
836
|
+
);
|
|
837
|
+
if (!folderTypesFromParent.includes(folderContentType)) {
|
|
838
|
+
// Util.logger.verbose(
|
|
839
|
+
// `removing ${metadataEntry} because r__folder_ContentType '${folderContentType}' identifies this DE as not being shared`
|
|
840
|
+
// );
|
|
841
|
+
delete metadataParentBu[metadataEntry];
|
|
842
|
+
}
|
|
843
|
+
} catch (ex) {
|
|
844
|
+
Util.logger.debug(
|
|
845
|
+
`removing ${metadataEntry} because of error while retrieving r__folder_ContentType: ${ex.message}`
|
|
846
|
+
);
|
|
847
|
+
delete metadataParentBu[metadataEntry];
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
// revert client to current default
|
|
852
|
+
this.client = clientBak;
|
|
853
|
+
this.buObject = buObjectBak;
|
|
854
|
+
Folder.client = clientBak;
|
|
855
|
+
Folder.buObject = buObjectBak;
|
|
856
|
+
|
|
857
|
+
return metadataParentBu;
|
|
858
|
+
}
|
|
859
|
+
|
|
472
860
|
/**
|
|
473
861
|
* helper to retrieve all dataExtension fields and attach them to the dataExtension metadata
|
|
474
862
|
*
|
|
@@ -478,7 +866,7 @@ class DataExtension extends MetadataType {
|
|
|
478
866
|
* @param {string[]} [additionalFields] Returns specified fields even if their retrieve definition is not set to true
|
|
479
867
|
* @returns {Promise.<void>} -
|
|
480
868
|
*/
|
|
481
|
-
static async
|
|
869
|
+
static async #attachFields(metadata, fieldOptions, additionalFields) {
|
|
482
870
|
const fieldsObj = await this._retrieveFields(fieldOptions, additionalFields);
|
|
483
871
|
const fieldKeys = Object.keys(fieldsObj);
|
|
484
872
|
// add fields to corresponding DE
|
|
@@ -607,7 +995,7 @@ class DataExtension extends MetadataType {
|
|
|
607
995
|
metadata[customerKey].Fields = fieldArr;
|
|
608
996
|
}
|
|
609
997
|
/**
|
|
610
|
-
* helper for {@link
|
|
998
|
+
* helper for {@link MetadataType.updateREST} and {@link MetadataType.updateSOAP} that removes old files after the key was changed
|
|
611
999
|
*
|
|
612
1000
|
* @private
|
|
613
1001
|
* @param {TYPE.MetadataTypeItem} metadataEntry a single metadata Entry
|
|
@@ -628,11 +1016,16 @@ class DataExtension extends MetadataType {
|
|
|
628
1016
|
throw new Error(`Cannot Upsert Strongly Typed Data Extensions`);
|
|
629
1017
|
}
|
|
630
1018
|
if (
|
|
1019
|
+
!Util.OPTIONS._fixSharedOnBu &&
|
|
631
1020
|
this.buObject.eid !== this.buObject.mid &&
|
|
632
1021
|
metadata.r__folder_Path?.startsWith('Shared Items')
|
|
633
1022
|
) {
|
|
634
1023
|
throw new Error(`Cannot Create/Update a Shared Data Extension from the Child BU`);
|
|
635
1024
|
}
|
|
1025
|
+
if (metadata.r__folder_ContentType === 'shared_dataextension') {
|
|
1026
|
+
this.deployedSharedKeys ||= [];
|
|
1027
|
+
this.deployedSharedKeys.push(metadata.CustomerKey);
|
|
1028
|
+
}
|
|
636
1029
|
if (metadata.r__folder_Path?.startsWith('Synchronized Data Extensions')) {
|
|
637
1030
|
throw new Error(
|
|
638
1031
|
`Cannot Create/Update a Synchronized Data Extension. Please use Contact Builder to maintain these`
|
|
@@ -822,7 +1215,11 @@ class DataExtension extends MetadataType {
|
|
|
822
1215
|
for (const element of fieldsJson) {
|
|
823
1216
|
const newJsonElement = {};
|
|
824
1217
|
for (const field of fieldsToKeep) {
|
|
825
|
-
|
|
1218
|
+
if (field === 'MaxLength' && element.FieldType === 'Decimal') {
|
|
1219
|
+
newJsonElement.MaxLength = `${element.MaxLength},${element.Scale}`;
|
|
1220
|
+
} else {
|
|
1221
|
+
newJsonElement[field] = element[field];
|
|
1222
|
+
}
|
|
826
1223
|
}
|
|
827
1224
|
newJson.push(newJsonElement);
|
|
828
1225
|
}
|