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
|
@@ -86,7 +86,7 @@ class Asset extends MetadataType {
|
|
|
86
86
|
return { metadata: Object.values(metadata)[0], type: this.definition.type };
|
|
87
87
|
}
|
|
88
88
|
/**
|
|
89
|
-
* helper for {@link retrieve} + {@link retrieveAsTemplate}
|
|
89
|
+
* helper for {@link Asset.retrieve} + {@link Asset.retrieveAsTemplate}
|
|
90
90
|
*
|
|
91
91
|
* @private
|
|
92
92
|
* @returns {TYPE.AssetSubType[]} subtype array
|
|
@@ -448,14 +448,14 @@ class Asset extends MetadataType {
|
|
|
448
448
|
);
|
|
449
449
|
}
|
|
450
450
|
/**
|
|
451
|
-
* helper for {@link preDeployTasks}
|
|
451
|
+
* helper for {@link Asset.preDeployTasks}
|
|
452
452
|
* Some metadata types store their actual content as a separate file, e.g. images
|
|
453
453
|
* This method reads these from the local FS stores them in the metadata object allowing to deploy it
|
|
454
454
|
*
|
|
455
455
|
* @param {TYPE.AssetItem} metadata a single asset
|
|
456
456
|
* @param {TYPE.AssetSubType} subType group of similar assets to put in a folder (ie. images)
|
|
457
457
|
* @param {string} deployDir directory of deploy files
|
|
458
|
-
* @param {boolean} [pathOnly
|
|
458
|
+
* @param {boolean} [pathOnly] used by getFilesToCommit which does not need the binary file to be actually read
|
|
459
459
|
* @returns {Promise.<string>} if found will return the path of the binary file
|
|
460
460
|
*/
|
|
461
461
|
static async _readExtendedFileFromFS(metadata, subType, deployDir, pathOnly = false) {
|
|
@@ -504,11 +504,10 @@ class Asset extends MetadataType {
|
|
|
504
504
|
* @param {TYPE.MetadataTypeMap} metadata metadata mapped by their keyField
|
|
505
505
|
* @param {TYPE.MetadataTypeMap} _ originalMetadata to be updated (contains additioanl fields)
|
|
506
506
|
* @param {{created: number, updated: number}} createdUpdated counter representing successful creates/updates
|
|
507
|
-
* @param {boolean} [isRefresh] optional flag to indicate that triggeredSend should be refreshed after deployment of assets
|
|
508
507
|
* @returns {Promise.<void>} -
|
|
509
508
|
*/
|
|
510
|
-
static async postDeployTasks(metadata, _, createdUpdated
|
|
511
|
-
if (
|
|
509
|
+
static async postDeployTasks(metadata, _, createdUpdated) {
|
|
510
|
+
if (Util.OPTIONS.refresh) {
|
|
512
511
|
if (createdUpdated.updated) {
|
|
513
512
|
// only run this if assets were updated. for created assets we do not expect
|
|
514
513
|
this._refreshTriggeredSend(metadata);
|
|
@@ -521,7 +520,7 @@ class Asset extends MetadataType {
|
|
|
521
520
|
}
|
|
522
521
|
|
|
523
522
|
/**
|
|
524
|
-
* helper for {@link postDeployTasks}. triggers a refresh of active triggerredSendDefinitions associated with the updated asset-message items. Gets executed if
|
|
523
|
+
* helper for {@link Asset.postDeployTasks}. triggers a refresh of active triggerredSendDefinitions associated with the updated asset-message items. Gets executed if refresh option has been set.
|
|
525
524
|
*
|
|
526
525
|
* @private
|
|
527
526
|
* @param {TYPE.MetadataTypeMap} metadata metadata mapped by their keyField
|
|
@@ -546,7 +545,7 @@ class Asset extends MetadataType {
|
|
|
546
545
|
TriggeredSend.client = this.client;
|
|
547
546
|
try {
|
|
548
547
|
// find refreshable TSDs
|
|
549
|
-
const tsdObj = (await TriggeredSend.findRefreshableItems()).metadata;
|
|
548
|
+
const tsdObj = (await TriggeredSend.findRefreshableItems(true)).metadata;
|
|
550
549
|
|
|
551
550
|
const tsdCountInitial = Object.keys(tsdObj).length;
|
|
552
551
|
const emailCount = legacyIdArr.length;
|
|
@@ -867,7 +866,7 @@ class Asset extends MetadataType {
|
|
|
867
866
|
}
|
|
868
867
|
|
|
869
868
|
/**
|
|
870
|
-
* helper for {@link preDeployTasks} that loads extracted code content back into JSON
|
|
869
|
+
* helper for {@link Asset.preDeployTasks} that loads extracted code content back into JSON
|
|
871
870
|
*
|
|
872
871
|
* @param {TYPE.AssetItem} metadata a single asset definition
|
|
873
872
|
* @param {string} deployDir directory of deploy files
|
|
@@ -1151,7 +1150,7 @@ class Asset extends MetadataType {
|
|
|
1151
1150
|
return fileList;
|
|
1152
1151
|
}
|
|
1153
1152
|
/**
|
|
1154
|
-
* helper for {@link preDeployTasks} that loads extracted code content back into JSON
|
|
1153
|
+
* helper for {@link Asset.preDeployTasks} that loads extracted code content back into JSON
|
|
1155
1154
|
*
|
|
1156
1155
|
* @param {string} prefix usually the customerkey
|
|
1157
1156
|
* @param {object} metadataSlots metadata.views.html.slots or deeper slots.<>.blocks.<>.slots
|
|
@@ -1231,7 +1230,7 @@ class Asset extends MetadataType {
|
|
|
1231
1230
|
}
|
|
1232
1231
|
}
|
|
1233
1232
|
/**
|
|
1234
|
-
* helper for {@link postRetrieveTasks} that finds code content in JSON and extracts it
|
|
1233
|
+
* helper for {@link Asset.postRetrieveTasks} that finds code content in JSON and extracts it
|
|
1235
1234
|
* to allow saving that separately and formatted
|
|
1236
1235
|
*
|
|
1237
1236
|
* @param {TYPE.AssetItem} metadata a single asset definition
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const MetadataType = require('./MetadataType');
|
|
4
3
|
const TYPE = require('../../types/mcdev.d');
|
|
4
|
+
const MetadataType = require('./MetadataType');
|
|
5
|
+
const Util = require('../util/util');
|
|
6
|
+
const cache = require('../util/cache');
|
|
5
7
|
|
|
6
8
|
/**
|
|
7
9
|
* AttributeGroup MetadataType
|
|
@@ -18,7 +20,7 @@ class AttributeGroup extends MetadataType {
|
|
|
18
20
|
* @param {string} [key] customer key of single item to retrieve
|
|
19
21
|
* @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
|
|
20
22
|
*/
|
|
21
|
-
static retrieve(retrieveDir, _, __, key) {
|
|
23
|
+
static async retrieve(retrieveDir, _, __, key) {
|
|
22
24
|
return super.retrieveREST(
|
|
23
25
|
retrieveDir,
|
|
24
26
|
'/hub/v1/contacts/schema/attributeGroups',
|
|
@@ -34,6 +36,78 @@ class AttributeGroup extends MetadataType {
|
|
|
34
36
|
static retrieveForCache() {
|
|
35
37
|
return super.retrieveREST(null, '/hub/v1/contacts/schema/attributeGroups');
|
|
36
38
|
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* manages post retrieve steps
|
|
42
|
+
*
|
|
43
|
+
* @param {TYPE.MetadataTypeItem} metadata a single metadata
|
|
44
|
+
* @returns {TYPE.MetadataTypeItem} metadata
|
|
45
|
+
*/
|
|
46
|
+
static postRetrieveTasks(metadata) {
|
|
47
|
+
// Member ID
|
|
48
|
+
delete metadata.mID;
|
|
49
|
+
|
|
50
|
+
// attributeSet
|
|
51
|
+
metadata.attributeSetIdentifiers = metadata.attributeSetIdentifiers.map((attributeSet) => {
|
|
52
|
+
try {
|
|
53
|
+
const key = cache.searchForField(
|
|
54
|
+
'attributeSet',
|
|
55
|
+
attributeSet.definitionID,
|
|
56
|
+
'definitionID',
|
|
57
|
+
'definitionKey'
|
|
58
|
+
);
|
|
59
|
+
if (key !== attributeSet.definitionKey) {
|
|
60
|
+
throw new Error(
|
|
61
|
+
`AttributeSet key mismatch. Found ${key} instead of ${attributeSet.definitionKey}`
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
return key;
|
|
65
|
+
} catch (ex) {
|
|
66
|
+
Util.logger.warn(
|
|
67
|
+
` - ${this.definition.type} ${metadata[this.definition.keyField]} (for ${
|
|
68
|
+
attributeSet.definitionKey
|
|
69
|
+
}): ${ex.message}`
|
|
70
|
+
);
|
|
71
|
+
return attributeSet;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// requiredRelationships
|
|
76
|
+
// TODO: implement
|
|
77
|
+
|
|
78
|
+
// description is not returned by API when empty. Set to empty string to propose the field as an option to users
|
|
79
|
+
metadata.description ||= '';
|
|
80
|
+
|
|
81
|
+
// applicationKey is only used by system generated attribute groups and otherwise it's empty.
|
|
82
|
+
if (metadata.applicationKey === '') {
|
|
83
|
+
// remove useless field
|
|
84
|
+
delete metadata.applicationKey;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// connectingID.identifierType seems to be always set to 'FullyQualifiedName' - to be sure we check it here and remove it if it's the case
|
|
88
|
+
if (metadata.connectingID?.identifierType === 'FullyQualifiedName') {
|
|
89
|
+
// remove useless field
|
|
90
|
+
delete metadata.connectingID;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// containsSchemaAttributes is only true for system generated attribute groups and otherwise it's false.
|
|
94
|
+
if (!metadata.containsSchemaAttributes) {
|
|
95
|
+
delete metadata.containsSchemaAttributes;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// isSystemDefined is only true for system generated attribute groups and cannot be deployed
|
|
99
|
+
if (!metadata.isSystemDefined) {
|
|
100
|
+
delete metadata.isSystemDefined;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return metadata;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* prepares for deployment
|
|
107
|
+
*
|
|
108
|
+
* @param {TYPE.MetadataTypeItem} metadata a single item
|
|
109
|
+
* @returns {TYPE.MetadataTypeItem} Promise
|
|
110
|
+
*/
|
|
37
111
|
}
|
|
38
112
|
|
|
39
113
|
// Assign definition to static attributes
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const TYPE = require('../../types/mcdev.d');
|
|
4
|
+
const MetadataType = require('./MetadataType');
|
|
5
|
+
const AttributeGroup = require('./AttributeGroup');
|
|
6
|
+
const Util = require('../util/util');
|
|
7
|
+
const cache = require('../util/cache');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* AttributeSet MetadataType
|
|
11
|
+
*
|
|
12
|
+
* @augments MetadataType
|
|
13
|
+
*/
|
|
14
|
+
class AttributeSet extends MetadataType {
|
|
15
|
+
/**
|
|
16
|
+
* Retrieves Metadata of schema set Definitions.
|
|
17
|
+
*
|
|
18
|
+
* @param {string} retrieveDir Directory where retrieved metadata directory will be saved
|
|
19
|
+
* @param {void} [_] unused parameter
|
|
20
|
+
* @param {void} [__] unused parameter
|
|
21
|
+
* @param {string} [key] customer key of single item to retrieve
|
|
22
|
+
* @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
|
|
23
|
+
*/
|
|
24
|
+
static async retrieve(retrieveDir, _, __, key) {
|
|
25
|
+
if (retrieveDir && !cache.getCache()?.attributeGroup) {
|
|
26
|
+
// ! attributeGroup and attributeSet both link to each other. caching attributeGroup here "manually", assuming that it's quicker than the other way round
|
|
27
|
+
Util.logger.info(' - Caching dependent Metadata: attributeGroup');
|
|
28
|
+
AttributeGroup.buObject = this.buObject;
|
|
29
|
+
AttributeGroup.client = this.client;
|
|
30
|
+
AttributeGroup.properties = this.properties;
|
|
31
|
+
const result = await AttributeGroup.retrieveForCache();
|
|
32
|
+
cache.setMetadata('attributeGroup', result.metadata);
|
|
33
|
+
}
|
|
34
|
+
return super.retrieveREST(retrieveDir, '/hub/v1/contacts/schema/setDefinitions', null, key);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Retrieves Metadata of schema set definitions for caching.
|
|
38
|
+
*
|
|
39
|
+
* @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
|
|
40
|
+
*/
|
|
41
|
+
static retrieveForCache() {
|
|
42
|
+
return super.retrieveREST(null, '/hub/v1/contacts/schema/setDefinitions');
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* used to identify updated shared data extensions that are used in attributeSets.
|
|
46
|
+
* helper for DataExtension.#fixShared_onBU
|
|
47
|
+
*
|
|
48
|
+
* @param {Object.<string, string>} sharedDataExtensionMap ID-Key relationship of shared data extensions
|
|
49
|
+
* @param {object} fixShared_fields DataExtensionField.fixShared_fields
|
|
50
|
+
* @returns {Promise.<string[]>} Promise of list of shared dataExtension IDs
|
|
51
|
+
*/
|
|
52
|
+
static async fixShared_retrieve(sharedDataExtensionMap, fixShared_fields) {
|
|
53
|
+
if (!Object.keys(sharedDataExtensionMap).length) {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
const result = await super.retrieveREST(null, '/hub/v1/contacts/schema/setDefinitions');
|
|
57
|
+
const metadataMap = result?.metadata;
|
|
58
|
+
if (metadataMap && Object.keys(metadataMap).length) {
|
|
59
|
+
const sharedDeIds = Object.keys(metadataMap)
|
|
60
|
+
.filter(
|
|
61
|
+
(asKey) =>
|
|
62
|
+
metadataMap[asKey].storageLogicalType === 'ExactTargetSchema' ||
|
|
63
|
+
metadataMap[asKey].storageLogicalType === 'DataExtension'
|
|
64
|
+
)
|
|
65
|
+
.filter((asKey) => {
|
|
66
|
+
// check if dataExtension ID is found on any attributeSet of this BU
|
|
67
|
+
if (sharedDataExtensionMap[metadataMap[asKey].storageReferenceID.value]) {
|
|
68
|
+
Util.logger.debug(
|
|
69
|
+
` shared dataExtension ID ${metadataMap[asKey].storageReferenceID.value} found in attributeSet ${asKey}`
|
|
70
|
+
);
|
|
71
|
+
return true;
|
|
72
|
+
} else {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
.filter((asKey) => {
|
|
77
|
+
// check if any of the dataExtension fields dont exist on the attributeSet or are out of date
|
|
78
|
+
const deKey =
|
|
79
|
+
sharedDataExtensionMap[metadataMap[asKey].storageReferenceID.value];
|
|
80
|
+
const asFields = metadataMap[asKey].valueDefinitions;
|
|
81
|
+
const deFields = Object.values(fixShared_fields[deKey]);
|
|
82
|
+
return deFields.some((deField) => {
|
|
83
|
+
const search = asFields.filter((asf) => asf.name === deField.Name);
|
|
84
|
+
if (!search.length) {
|
|
85
|
+
Util.logger.debug(
|
|
86
|
+
Util.getGrayMsg(
|
|
87
|
+
` - Field ${deField.Name} not found in attributeSet; Note: only first recognized difference is printed to log`
|
|
88
|
+
)
|
|
89
|
+
);
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
const asField = search[0];
|
|
93
|
+
if (asField.dataType !== deField.FieldType) {
|
|
94
|
+
Util.logger.debug(
|
|
95
|
+
Util.getGrayMsg(
|
|
96
|
+
` - Field ${deField.Name} FieldType changed (old: ${asField.dataType}; new: ${deField.FieldType}); Note: only first recognized difference is printed to log`
|
|
97
|
+
)
|
|
98
|
+
);
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
asField.defaultValue ||= '';
|
|
102
|
+
if (
|
|
103
|
+
(asField.defaultValue && deField.DefaultValue === '') ||
|
|
104
|
+
(deField.FieldType === 'Boolean' &&
|
|
105
|
+
deField.DefaultValue !== '' &&
|
|
106
|
+
(deField.DefaultValue
|
|
107
|
+
? 'True'
|
|
108
|
+
: 'False' !== asField.defaultValue)) ||
|
|
109
|
+
(deField.FieldType !== 'Boolean' &&
|
|
110
|
+
deField.DefaultValue !== asField.defaultValue)
|
|
111
|
+
) {
|
|
112
|
+
Util.logger.debug(
|
|
113
|
+
` - Field ${deField.Name} DefaultValue changed (old: ${asField.defaultValue}; new: ${deField.DefaultValue}); Note: only first recognized difference is printed to log`
|
|
114
|
+
);
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
// some field types don't carry the length property. reset to 0 to ease comparison
|
|
118
|
+
asField.length ||= 0;
|
|
119
|
+
if (asField.length !== deField.MaxLength) {
|
|
120
|
+
Util.logger.debug(
|
|
121
|
+
` - Field ${deField.Name} MaxLength changed (old: ${asField.length}; new: ${deField.MaxLength}); Note: only first recognized difference is printed to log`
|
|
122
|
+
);
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
if (asField.isNullable !== deField.IsRequired) {
|
|
126
|
+
Util.logger.debug(
|
|
127
|
+
` - Field ${deField.Name} IsRequired changed (old: ${asField.isNullable}; new: ${deField.IsRequired}); Note: only first recognized difference is printed to log`
|
|
128
|
+
);
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
if (asField.isPrimaryKey !== deField.IsPrimaryKey) {
|
|
132
|
+
Util.logger.debug(
|
|
133
|
+
` - Field ${deField.Name} IsPrimaryKey changed (old: ${asField.isPrimaryKey}; new: ${deField.IsPrimaryKey}); Note: only first recognized difference is printed to log`
|
|
134
|
+
);
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
return false;
|
|
138
|
+
});
|
|
139
|
+
})
|
|
140
|
+
.map((key) => metadataMap[key].storageReferenceID.value)
|
|
141
|
+
.filter(Boolean);
|
|
142
|
+
return sharedDeIds;
|
|
143
|
+
} else {
|
|
144
|
+
// nothing to do - return empty array
|
|
145
|
+
return [];
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Builds map of metadata entries mapped to their keyfields
|
|
151
|
+
*
|
|
152
|
+
* @param {object} body json of response body
|
|
153
|
+
* @param {string|number} [singleRetrieve] key of single item to filter by
|
|
154
|
+
* @returns {TYPE.MetadataTypeMap} keyField => metadata map
|
|
155
|
+
*/
|
|
156
|
+
static parseResponseBody(body, singleRetrieve) {
|
|
157
|
+
const metadataCache = super.parseResponseBody(body);
|
|
158
|
+
|
|
159
|
+
// make sure we add the entire list to cache before running postRetrieveTasks because of the self-references this type is using
|
|
160
|
+
// usually, the cache is only written into after all postRetrieveTasks have been run
|
|
161
|
+
cache.setMetadata(this.definition.type, metadataCache);
|
|
162
|
+
|
|
163
|
+
const metadataStructure = super.parseResponseBody(body, singleRetrieve);
|
|
164
|
+
return metadataStructure;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* manages post retrieve steps
|
|
169
|
+
*
|
|
170
|
+
* @param {TYPE.MetadataTypeItem} metadata a single metadata
|
|
171
|
+
* @returns {TYPE.MetadataTypeItem} metadata
|
|
172
|
+
*/
|
|
173
|
+
static postRetrieveTasks(metadata) {
|
|
174
|
+
// folder
|
|
175
|
+
if (metadata.storageLogicalType === 'DataExtension') {
|
|
176
|
+
// attributeSet created for Group Connect do not have a folder
|
|
177
|
+
super.setFolderPath(metadata);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// source
|
|
181
|
+
switch (metadata.storageLogicalType) {
|
|
182
|
+
case 'ExactTargetSchema': // synced / shared DEs
|
|
183
|
+
case 'DataExtension': {
|
|
184
|
+
// shared / local DEs
|
|
185
|
+
try {
|
|
186
|
+
metadata.r__dataExtension_CustomerKey = cache.searchForField(
|
|
187
|
+
'dataExtension',
|
|
188
|
+
metadata.storageReferenceID.value,
|
|
189
|
+
'ObjectID',
|
|
190
|
+
'CustomerKey'
|
|
191
|
+
);
|
|
192
|
+
// TODO: check if fields in metadata.sendAttributeStorageName exist in data extension --> error
|
|
193
|
+
// TODO: check if fields in data extension exist in metadata.sendAttributeStorageName --> warn
|
|
194
|
+
|
|
195
|
+
delete metadata.storageReferenceID;
|
|
196
|
+
delete metadata.storageName;
|
|
197
|
+
delete metadata.storageObjectInformation; // type ExactTargetSchema only
|
|
198
|
+
} catch (ex) {
|
|
199
|
+
Util.logger.warn(
|
|
200
|
+
` - ${this.definition.type} ${metadata[this.definition.keyField]}: ${
|
|
201
|
+
ex.message
|
|
202
|
+
}`
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
case 'MobileAttributes': {
|
|
208
|
+
// TODO: implement
|
|
209
|
+
// "storageName": "_MobileAddress",
|
|
210
|
+
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
case 'EnterpriseAttributes': {
|
|
214
|
+
// TODO: implement
|
|
215
|
+
// "storageName": "_EnterpriseAttribute",
|
|
216
|
+
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
case 'PushAttributes': {
|
|
220
|
+
// TODO: implement
|
|
221
|
+
// "storageName": "_PushAddress",
|
|
222
|
+
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// relationships to attributeGroups & AttributeSet
|
|
228
|
+
if (Array.isArray(metadata.relationships)) {
|
|
229
|
+
for (const relationship of metadata.relationships) {
|
|
230
|
+
for (const type of ['left', 'right']) {
|
|
231
|
+
if (
|
|
232
|
+
relationship[type + 'Item']?.connectingID?.identifierType ===
|
|
233
|
+
'FullyQualifiedName'
|
|
234
|
+
) {
|
|
235
|
+
delete relationship[type + 'Item'].connectingID;
|
|
236
|
+
}
|
|
237
|
+
let relationshipObj = null;
|
|
238
|
+
switch (relationship[type + 'Item'].relationshipType) {
|
|
239
|
+
case 'AttributeGroup': {
|
|
240
|
+
try {
|
|
241
|
+
relationship[type + 'Item'].r__attributeGroup_definitionKey =
|
|
242
|
+
cache.searchForField(
|
|
243
|
+
'attributeGroup',
|
|
244
|
+
relationship[type + 'Item']?.identifier,
|
|
245
|
+
'definitionID',
|
|
246
|
+
'definitionKey'
|
|
247
|
+
);
|
|
248
|
+
delete relationship[type + 'Item']?.identifier;
|
|
249
|
+
} catch (ex) {
|
|
250
|
+
Util.logger.warn(
|
|
251
|
+
` - ${this.definition.type} ${
|
|
252
|
+
metadata[this.definition.keyField]
|
|
253
|
+
}: ${ex.message}`
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
// get relationship fieldnames
|
|
257
|
+
relationshipObj = {
|
|
258
|
+
valueDefinitions: this._getSystemValueDefinitions(),
|
|
259
|
+
};
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
case 'AttributeSet': {
|
|
263
|
+
try {
|
|
264
|
+
relationship[type + 'Item'].r__attributeSet_definitionKey =
|
|
265
|
+
cache.searchForField(
|
|
266
|
+
'attributeSet',
|
|
267
|
+
relationship[type + 'Item']?.identifier,
|
|
268
|
+
'definitionID',
|
|
269
|
+
'definitionKey'
|
|
270
|
+
);
|
|
271
|
+
delete relationship[type + 'Item']?.identifier;
|
|
272
|
+
|
|
273
|
+
// get relationship fieldnames
|
|
274
|
+
// check if its a self-reference to metadata.valueDefinitions or if it's a reference to another attributeSet
|
|
275
|
+
relationshipObj =
|
|
276
|
+
relationship[type + 'Item'].r__attributeSet_definitionKey ===
|
|
277
|
+
metadata.definitionKey
|
|
278
|
+
? metadata
|
|
279
|
+
: cache.getByKey(
|
|
280
|
+
'attributeSet',
|
|
281
|
+
relationship[type + 'Item']
|
|
282
|
+
.r__attributeSet_definitionKey
|
|
283
|
+
);
|
|
284
|
+
} catch (ex) {
|
|
285
|
+
Util.logger.warn(
|
|
286
|
+
` - ${this.definition.type} ${
|
|
287
|
+
metadata[this.definition.keyField]
|
|
288
|
+
}: ${ex.message}`
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
break;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
try {
|
|
295
|
+
// get relationship fieldnames
|
|
296
|
+
// resolve field values
|
|
297
|
+
for (const attr of relationship.relationshipAttributes) {
|
|
298
|
+
const id = attr[type + 'AttributeID'];
|
|
299
|
+
const valueDefinition = relationshipObj.valueDefinitions.find(
|
|
300
|
+
(item) => item.valueDefinitionID === id
|
|
301
|
+
);
|
|
302
|
+
if (valueDefinition) {
|
|
303
|
+
attr['c__' + type + 'FullyQualifiedName'] =
|
|
304
|
+
valueDefinition.fullyQualifiedName;
|
|
305
|
+
delete attr[type + 'AttributeID'];
|
|
306
|
+
delete attr[type + 'ConnectingID'];
|
|
307
|
+
} else {
|
|
308
|
+
throw new Error(
|
|
309
|
+
`Could not find ${type}AttributeID ${id} of relationship ${relationship.relationshipID}`
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
} catch (ex) {
|
|
314
|
+
Util.logger.warn(
|
|
315
|
+
` - ${this.definition.type} ${metadata[this.definition.nameField]} / ${
|
|
316
|
+
metadata[this.definition.keyField]
|
|
317
|
+
}: ${ex.message}`
|
|
318
|
+
);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// Member ID
|
|
325
|
+
delete metadata.customObjectOwnerMID;
|
|
326
|
+
|
|
327
|
+
// remove duplicate ID fields (main field is definitionID)
|
|
328
|
+
delete metadata.setDefinitionID;
|
|
329
|
+
if (metadata.dataRetentionProperties?.setDefinitionID) {
|
|
330
|
+
delete metadata.dataRetentionProperties?.setDefinitionID;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// connectingID.identifierType seems to be always set to 'FullyQualifiedName' - to be sure we check it here and remove it if it's the case
|
|
334
|
+
if (metadata.connectingID?.identifierType === 'FullyQualifiedName') {
|
|
335
|
+
// remove useless field
|
|
336
|
+
delete metadata.connectingID;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return metadata;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* helper for {@link AttributeSet.postRetrieveTasks}
|
|
344
|
+
*
|
|
345
|
+
* @returns {object[]} all system value definitions
|
|
346
|
+
*/
|
|
347
|
+
static _getSystemValueDefinitions() {
|
|
348
|
+
this.systemValueDefinitions ||= {};
|
|
349
|
+
if (!this.systemValueDefinitions[this.buObject.mid]) {
|
|
350
|
+
this.systemValueDefinitions[this.buObject.mid] = Object.values(
|
|
351
|
+
cache.getCache()['attributeSet']
|
|
352
|
+
)
|
|
353
|
+
.flatMap((item) => {
|
|
354
|
+
if (item.isSystemDefined) {
|
|
355
|
+
return item.valueDefinitions;
|
|
356
|
+
}
|
|
357
|
+
})
|
|
358
|
+
.filter(Boolean);
|
|
359
|
+
}
|
|
360
|
+
return this.systemValueDefinitions[this.buObject.mid];
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// Assign definition to static attributes
|
|
365
|
+
AttributeSet.definition = require('../MetadataTypeDefinitions').attributeSet;
|
|
366
|
+
|
|
367
|
+
module.exports = AttributeSet;
|