@salesforce/afv-skills 1.8.0 → 1.9.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/package.json +1 -1
- package/skills/activating-datacloud/CREDITS.md +5 -0
- package/skills/activating-datacloud/README.md +39 -0
- package/skills/activating-datacloud/SKILL.md +118 -0
- package/skills/analyzing-omnistudio-dependencies/CREDITS.md +5 -0
- package/skills/analyzing-omnistudio-dependencies/SKILL.md +477 -0
- package/skills/analyzing-omnistudio-dependencies/references/dependency-patterns.md +508 -0
- package/skills/analyzing-omnistudio-dependencies/references/namespace-guide.md +300 -0
- package/skills/building-omnistudio-callable-apex/CREDITS.md +9 -0
- package/skills/building-omnistudio-callable-apex/README.md +80 -0
- package/skills/building-omnistudio-callable-apex/SKILL.md +276 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_callable_openinterface.cls +40 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_callable_vanilla.cls +32 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_migration.cls +54 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_openinterface.cls +45 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_test_class.cls +65 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/IndustriesCallableException.cls +7 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallable.cls +115 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallableTest.cls +189 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/TRANSCRIPT.md +115 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/IndustriesCallableException.cls +7 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomCallable.cls +74 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomCallableTest.cls +146 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomRemoteClass.cls +16 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/TRANSCRIPT.md +120 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/IndustriesCallableException.cls +7 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomCallable.cls +73 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomCallableTest.cls +128 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomVlocityOpenInterface2.cls +23 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/TRANSCRIPT.md +75 -0
- package/skills/building-omnistudio-datamapper/CREDITS.md +5 -0
- package/skills/building-omnistudio-datamapper/SKILL.md +270 -0
- package/skills/building-omnistudio-datamapper/assets/completion-summary-template.md +28 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-extract.json +6 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-item.json +12 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-load.json +6 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-transform.json +6 -0
- package/skills/building-omnistudio-datamapper/references/best-practices.md +277 -0
- package/skills/building-omnistudio-datamapper/references/naming-conventions.md +145 -0
- package/skills/building-omnistudio-flexcard/CREDITS.md +5 -0
- package/skills/building-omnistudio-flexcard/SKILL.md +325 -0
- package/skills/building-omnistudio-flexcard/assets/omni-ui-card.json +10 -0
- package/skills/building-omnistudio-flexcard/references/best-practices.md +291 -0
- package/skills/building-omnistudio-flexcard/references/data-binding-guide.md +311 -0
- package/skills/building-omnistudio-flexcard/references/scoring-rubric.md +66 -0
- package/skills/building-omnistudio-flexcard/scripts/flexcard-commands.sh +24 -0
- package/skills/building-omnistudio-integration-procedure/CREDITS.md +5 -0
- package/skills/building-omnistudio-integration-procedure/SKILL.md +275 -0
- package/skills/building-omnistudio-integration-procedure/assets/omni-process-element-dr-extract.json +10 -0
- package/skills/building-omnistudio-integration-procedure/assets/omni-process-element-set-values.json +10 -0
- package/skills/building-omnistudio-integration-procedure/assets/omni-process-ip.json +12 -0
- package/skills/building-omnistudio-integration-procedure/assets/scoring-report-format.txt +14 -0
- package/skills/building-omnistudio-integration-procedure/references/best-practices.md +388 -0
- package/skills/building-omnistudio-integration-procedure/references/element-types.md +588 -0
- package/skills/building-omnistudio-integration-procedure/scripts/cli-commands.sh +18 -0
- package/skills/building-omnistudio-omniscript/CREDITS.md +5 -0
- package/skills/building-omnistudio-omniscript/SKILL.md +367 -0
- package/skills/building-omnistudio-omniscript/assets/omni-process-element-step.json +10 -0
- package/skills/building-omnistudio-omniscript/assets/omni-process-element-text-block.json +11 -0
- package/skills/building-omnistudio-omniscript/assets/omni-process-omniscript.json +12 -0
- package/skills/building-omnistudio-omniscript/references/best-practices.md +480 -0
- package/skills/building-omnistudio-omniscript/references/element-types.md +1172 -0
- package/skills/building-omnistudio-omniscript/scripts/check-duplicate-omniscript.sh +13 -0
- package/skills/building-omnistudio-omniscript/scripts/cli-reference.sh +21 -0
- package/skills/building-omnistudio-omniscript/scripts/deploy-omniscript.sh +29 -0
- package/skills/building-sf-integrations/CREDITS.md +5 -0
- package/skills/building-sf-integrations/README.md +95 -0
- package/skills/building-sf-integrations/SKILL.md +192 -0
- package/skills/building-sf-integrations/assets/callouts/callout-retry-handler.cls +167 -0
- package/skills/building-sf-integrations/assets/callouts/http-response-handler.cls +257 -0
- package/skills/building-sf-integrations/assets/callouts/rest-queueable-callout.cls +262 -0
- package/skills/building-sf-integrations/assets/callouts/rest-sync-callout.cls +211 -0
- package/skills/building-sf-integrations/assets/cdc/cdc-handler.cls +246 -0
- package/skills/building-sf-integrations/assets/cdc/cdc-subscriber-trigger.trigger +139 -0
- package/skills/building-sf-integrations/assets/endpoint-security/example.cspTrustedSite-meta.xml +58 -0
- package/skills/building-sf-integrations/assets/endpoint-security/example.remoteSite-meta.xml +39 -0
- package/skills/building-sf-integrations/assets/external-credentials/jwt-external-credential.externalCredential-meta.xml +90 -0
- package/skills/building-sf-integrations/assets/external-credentials/oauth-external-credential.externalCredential-meta.xml +87 -0
- package/skills/building-sf-integrations/assets/external-services/external-service-operations.md +221 -0
- package/skills/building-sf-integrations/assets/external-services/openapi-registration.externalServiceRegistration-meta.xml +193 -0
- package/skills/building-sf-integrations/assets/named-credentials/certificate-auth.namedCredential-meta.xml +62 -0
- package/skills/building-sf-integrations/assets/named-credentials/custom-auth.namedCredential-meta.xml +71 -0
- package/skills/building-sf-integrations/assets/named-credentials/oauth-client-credentials.namedCredential-meta.xml +51 -0
- package/skills/building-sf-integrations/assets/named-credentials/oauth-jwt-bearer.namedCredential-meta.xml +67 -0
- package/skills/building-sf-integrations/assets/platform-events/event-publisher.cls +191 -0
- package/skills/building-sf-integrations/assets/platform-events/event-subscriber-action.cls +295 -0
- package/skills/building-sf-integrations/assets/platform-events/event-subscriber-trigger.trigger +108 -0
- package/skills/building-sf-integrations/assets/platform-events/platform-event-definition.object-meta.xml +124 -0
- package/skills/building-sf-integrations/assets/soap/soap-callout-service.cls +186 -0
- package/skills/building-sf-integrations/assets/soap/wsdl2apex-guide.md +213 -0
- package/skills/building-sf-integrations/hooks/scripts/suggest_credential_setup.py +271 -0
- package/skills/building-sf-integrations/hooks/scripts/validate_integration.py +363 -0
- package/skills/building-sf-integrations/references/callout-patterns.md +719 -0
- package/skills/building-sf-integrations/references/cdc-guide.md +288 -0
- package/skills/building-sf-integrations/references/cli-reference.md +94 -0
- package/skills/building-sf-integrations/references/event-driven-architecture-guide.md +266 -0
- package/skills/building-sf-integrations/references/event-patterns.md +838 -0
- package/skills/building-sf-integrations/references/external-services-guide.md +303 -0
- package/skills/building-sf-integrations/references/messaging-api-v2.md +609 -0
- package/skills/building-sf-integrations/references/named-credentials-automation.md +201 -0
- package/skills/building-sf-integrations/references/named-credentials-guide.md +173 -0
- package/skills/building-sf-integrations/references/platform-events-guide.md +288 -0
- package/skills/building-sf-integrations/references/rest-callout-patterns.md +288 -0
- package/skills/building-sf-integrations/references/scoring-rubric.md +59 -0
- package/skills/building-sf-integrations/references/security-best-practices.md +248 -0
- package/skills/building-sf-integrations/scripts/README.md +100 -0
- package/skills/building-sf-integrations/scripts/configure-named-credential.sh +236 -0
- package/skills/building-sf-integrations/scripts/set-api-credential.sh +146 -0
- package/skills/building-sf-integrations/scripts/templates/setup-credentials-with-csp.sh +158 -0
- package/skills/configuring-connected-apps/CREDITS.md +3 -0
- package/skills/configuring-connected-apps/README.md +99 -0
- package/skills/configuring-connected-apps/SKILL.md +224 -0
- package/skills/configuring-connected-apps/assets/connected-app-basic.xml +29 -0
- package/skills/configuring-connected-apps/assets/connected-app-canvas.xml +62 -0
- package/skills/configuring-connected-apps/assets/connected-app-jwt.xml +49 -0
- package/skills/configuring-connected-apps/assets/connected-app-oauth.xml +65 -0
- package/skills/configuring-connected-apps/assets/eca-global-oauth.xml +36 -0
- package/skills/configuring-connected-apps/assets/eca-oauth-settings.xml +36 -0
- package/skills/configuring-connected-apps/assets/eca-policies.xml +36 -0
- package/skills/configuring-connected-apps/assets/external-client-app.xml +35 -0
- package/skills/configuring-connected-apps/references/example-usage.md +256 -0
- package/skills/configuring-connected-apps/references/migration-guide.md +328 -0
- package/skills/configuring-connected-apps/references/oauth-flows-reference.md +660 -0
- package/skills/configuring-connected-apps/references/security-checklist.md +209 -0
- package/skills/configuring-connected-apps/references/testing-validation-guide.md +275 -0
- package/skills/connecting-datacloud/CREDITS.md +5 -0
- package/skills/connecting-datacloud/README.md +59 -0
- package/skills/connecting-datacloud/SKILL.md +155 -0
- package/skills/connecting-datacloud/examples/connections/heroku-postgres.json +15 -0
- package/skills/connecting-datacloud/examples/connections/ingest-api-connection.json +5 -0
- package/skills/connecting-datacloud/examples/connections/ingest-api-schema.json +31 -0
- package/skills/connecting-datacloud/examples/connections/redshift.json +16 -0
- package/skills/connecting-datacloud/examples/connections/sharepoint-unstructured.json +20 -0
- package/skills/connecting-datacloud/examples/connections/snowflake-connection.json +42 -0
- package/skills/debugging-apex-logs/CREDITS.md +22 -0
- package/skills/debugging-apex-logs/README.md +74 -0
- package/skills/debugging-apex-logs/SKILL.md +172 -0
- package/skills/debugging-apex-logs/assets/benchmarking-template.cls +327 -0
- package/skills/debugging-apex-logs/assets/cpu-heap-optimization.cls +307 -0
- package/skills/debugging-apex-logs/assets/dml-in-loop-fix.cls +219 -0
- package/skills/debugging-apex-logs/assets/null-pointer-fix.cls +252 -0
- package/skills/debugging-apex-logs/assets/soql-in-loop-fix.cls +157 -0
- package/skills/debugging-apex-logs/references/analysis-playbook.md +53 -0
- package/skills/debugging-apex-logs/references/benchmarking-guide.md +287 -0
- package/skills/debugging-apex-logs/references/cli-commands.md +368 -0
- package/skills/debugging-apex-logs/references/common-issues.md +68 -0
- package/skills/debugging-apex-logs/references/debug-log-reference.md +328 -0
- package/skills/debugging-apex-logs/references/log-analysis-tools.md +248 -0
- package/skills/debugging-apex-logs/references/scoring-rubric.md +21 -0
- package/skills/deploying-metadata/CREDITS.md +25 -0
- package/skills/deploying-metadata/README.md +104 -0
- package/skills/deploying-metadata/SKILL.md +214 -0
- package/skills/deploying-metadata/assets/destructiveChanges.xml +143 -0
- package/skills/deploying-metadata/assets/package.xml +121 -0
- package/skills/deploying-metadata/references/agent-deployment-guide.md +628 -0
- package/skills/deploying-metadata/references/deploy.sh +73 -0
- package/skills/deploying-metadata/references/deployment-report-template.md +89 -0
- package/skills/deploying-metadata/references/deployment-workflows.md +395 -0
- package/skills/deploying-metadata/references/orchestration.md +183 -0
- package/skills/deploying-metadata/references/trigger-deployment-safety.md +376 -0
- package/skills/deploying-omnistudio-datapacks/CREDITS.md +5 -0
- package/skills/deploying-omnistudio-datapacks/README.md +88 -0
- package/skills/deploying-omnistudio-datapacks/SKILL.md +174 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle/TRANSCRIPT.md +124 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle/deploy-business-internet-plus-bundle.yaml +11 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle-deploy/TRANSCRIPT.md +142 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle-deploy/deploy-business-internet-plus-bundle.yaml +10 -0
- package/skills/deploying-omnistudio-datapacks/references/job-file-template.md +42 -0
- package/skills/deploying-omnistudio-datapacks/references/troubleshooting-matrix.md +24 -0
- package/skills/developing-agentforce/assets/metadata/http-callout-flow.flow-meta.xml +1 -1
- package/skills/developing-agentforce/references/actions-reference.md +8 -8
- package/skills/fetching-salesforce-docs/README.md +66 -0
- package/skills/fetching-salesforce-docs/SKILL.md +209 -0
- package/skills/fetching-salesforce-docs/requirements.txt +2 -0
- package/skills/fetching-salesforce-docs/scripts/extract_help_salesforce.py +497 -0
- package/skills/fetching-salesforce-docs/scripts/extract_salesforce_doc.py +357 -0
- package/skills/fetching-salesforce-docs/scripts/runtime_bootstrap.py +58 -0
- package/skills/generating-apex/CREDITS.md +1 -26
- package/skills/generating-apex-test/CREDITS.md +2 -27
- package/skills/generating-lwc-components/CREDITS.md +5 -0
- package/skills/generating-lwc-components/README.md +126 -0
- package/skills/generating-lwc-components/SKILL.md +191 -0
- package/skills/generating-lwc-components/assets/apex-controller/LwcController.cls +327 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.css +72 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.html +111 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.js +163 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.js-meta.xml +137 -0
- package/skills/generating-lwc-components/assets/datatable-component/datatableComponent.html +111 -0
- package/skills/generating-lwc-components/assets/datatable-component/datatableComponent.js +367 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.css +63 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.html +154 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.js +348 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.js-meta.xml +87 -0
- package/skills/generating-lwc-components/assets/form-component/formComponent.html +165 -0
- package/skills/generating-lwc-components/assets/form-component/formComponent.js +275 -0
- package/skills/generating-lwc-components/assets/graphql-component/graphqlComponent.html +100 -0
- package/skills/generating-lwc-components/assets/graphql-component/graphqlComponent.js +336 -0
- package/skills/generating-lwc-components/assets/jest-test/componentName.test.js.example +371 -0
- package/skills/generating-lwc-components/assets/message-channel/RecordSelected.messageChannel-meta.xml +71 -0
- package/skills/generating-lwc-components/assets/message-channel/lmsPublisher.js +103 -0
- package/skills/generating-lwc-components/assets/message-channel/lmsSubscriber.js +181 -0
- package/skills/generating-lwc-components/assets/modal-component/modalComponent.html +85 -0
- package/skills/generating-lwc-components/assets/modal-component/modalComponent.js +199 -0
- package/skills/generating-lwc-components/assets/record-picker/recordPicker.html +55 -0
- package/skills/generating-lwc-components/assets/record-picker/recordPicker.js +199 -0
- package/skills/generating-lwc-components/assets/state-store/store.js +282 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.css +65 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.html +95 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.js-meta.xml +75 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.test.ts.example +301 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.ts +295 -0
- package/skills/generating-lwc-components/assets/workspace-api/workspaceComponent.html +71 -0
- package/skills/generating-lwc-components/assets/workspace-api/workspaceComponent.js +316 -0
- package/skills/generating-lwc-components/hooks/scripts/lwc-lsp-validate.py +295 -0
- package/skills/generating-lwc-components/hooks/scripts/post-tool-validate.py +347 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_data/deprecated_patterns.json +74 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_data/styling_hooks.json +111 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_data/valid_slds_classes.json +127 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_linter_wrapper.py +294 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_rules/__init__.py +22 -0
- package/skills/generating-lwc-components/hooks/scripts/template_validator.py +332 -0
- package/skills/generating-lwc-components/hooks/scripts/validate_slds.py +595 -0
- package/skills/generating-lwc-components/references/accessibility-guide.md +843 -0
- package/skills/generating-lwc-components/references/advanced-features.md +108 -0
- package/skills/generating-lwc-components/references/async-notification-patterns.md +661 -0
- package/skills/generating-lwc-components/references/cli-commands.md +545 -0
- package/skills/generating-lwc-components/references/component-patterns.md +1476 -0
- package/skills/generating-lwc-components/references/flow-integration-guide.md +675 -0
- package/skills/generating-lwc-components/references/jest-testing.md +1011 -0
- package/skills/generating-lwc-components/references/lms-guide.md +860 -0
- package/skills/generating-lwc-components/references/lwc-best-practices.md +1310 -0
- package/skills/generating-lwc-components/references/performance-guide.md +861 -0
- package/skills/generating-lwc-components/references/scoring-and-testing.md +116 -0
- package/skills/generating-lwc-components/references/slds-blueprints.json +14389 -0
- package/skills/generating-lwc-components/references/slds-design-guide.md +166 -0
- package/skills/generating-lwc-components/references/state-management.md +642 -0
- package/skills/generating-lwc-components/references/template-anti-patterns.md +948 -0
- package/skills/generating-lwc-components/references/triangle-pattern.md +365 -0
- package/skills/generating-lwc-components/scripts/local-dev-preview.sh +34 -0
- package/skills/generating-mermaid-diagrams/CREDITS.md +46 -0
- package/skills/generating-mermaid-diagrams/README.md +114 -0
- package/skills/generating-mermaid-diagrams/SKILL.md +218 -0
- package/skills/generating-mermaid-diagrams/assets/agentforce/agent-flow.md +313 -0
- package/skills/generating-mermaid-diagrams/assets/architecture/system-landscape.md +351 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/b2b-commerce-erd.md +317 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/campaigns-erd.md +195 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/consent-erd.md +262 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/files-erd.md +266 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/forecasting-erd.md +261 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/fsl-erd.md +332 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/party-model-erd.md +237 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/quote-order-erd.md +277 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/revenue-cloud-erd.md +343 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/sales-cloud-erd.md +192 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/salesforce-erd.md +209 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/scheduler-erd.md +276 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/service-cloud-erd.md +217 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/territory-management-erd.md +241 -0
- package/skills/generating-mermaid-diagrams/assets/integration/api-sequence.md +387 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/authorization-code-pkce.md +197 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/authorization-code.md +152 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/client-credentials.md +233 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/device-authorization.md +295 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/jwt-bearer.md +256 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/refresh-token.md +281 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/user-agent-social-sign-on.md +281 -0
- package/skills/generating-mermaid-diagrams/assets/role-hierarchy/user-hierarchy.md +322 -0
- package/skills/generating-mermaid-diagrams/references/color-palette.md +464 -0
- package/skills/generating-mermaid-diagrams/references/diagram-conventions.md +313 -0
- package/skills/generating-mermaid-diagrams/references/erd-conventions.md +320 -0
- package/skills/generating-mermaid-diagrams/references/mermaid-reference.md +434 -0
- package/skills/generating-mermaid-diagrams/references/mermaid-styling.md +81 -0
- package/skills/generating-mermaid-diagrams/references/preview-guide.md +49 -0
- package/skills/generating-mermaid-diagrams/references/usage-examples.md +340 -0
- package/skills/generating-mermaid-diagrams/scripts/README.md +160 -0
- package/skills/generating-mermaid-diagrams/scripts/mermaid_preview.py +654 -0
- package/skills/generating-mermaid-diagrams/scripts/query-org-metadata.py +293 -0
- package/skills/generating-visual-diagrams/CREDITS.md +80 -0
- package/skills/generating-visual-diagrams/README.md +83 -0
- package/skills/generating-visual-diagrams/SKILL.md +208 -0
- package/skills/generating-visual-diagrams/assets/architecture/integration-flow.md +55 -0
- package/skills/generating-visual-diagrams/assets/erd/core-objects.md +131 -0
- package/skills/generating-visual-diagrams/assets/erd/custom-objects.md +60 -0
- package/skills/generating-visual-diagrams/assets/lwc/dashboard-card.md +45 -0
- package/skills/generating-visual-diagrams/assets/lwc/data-table.md +57 -0
- package/skills/generating-visual-diagrams/assets/lwc/record-form.md +60 -0
- package/skills/generating-visual-diagrams/assets/review/apex-review.md +57 -0
- package/skills/generating-visual-diagrams/assets/review/lwc-review.md +48 -0
- package/skills/generating-visual-diagrams/references/architect-aesthetic-guide.md +257 -0
- package/skills/generating-visual-diagrams/references/examples-index.md +35 -0
- package/skills/generating-visual-diagrams/references/gemini-cli-setup.md +65 -0
- package/skills/generating-visual-diagrams/references/interview-questions.md +529 -0
- package/skills/generating-visual-diagrams/references/iteration-workflow.md +173 -0
- package/skills/generating-visual-diagrams/scripts/check-prerequisites.sh +101 -0
- package/skills/generating-visual-diagrams/scripts/generate_image.py +243 -0
- package/skills/handling-sf-data/CREDITS.md +5 -0
- package/skills/handling-sf-data/README.md +112 -0
- package/skills/handling-sf-data/SKILL.md +235 -0
- package/skills/handling-sf-data/assets/bulk/bulk-insert-10000.apex +293 -0
- package/skills/handling-sf-data/assets/bulk/bulk-insert-200.apex +208 -0
- package/skills/handling-sf-data/assets/bulk/bulk-insert-500.apex +219 -0
- package/skills/handling-sf-data/assets/bulk/bulk-upsert-external-id.apex +324 -0
- package/skills/handling-sf-data/assets/cleanup/delete-by-created-date.apex +319 -0
- package/skills/handling-sf-data/assets/cleanup/delete-by-name.apex +240 -0
- package/skills/handling-sf-data/assets/cleanup/delete-test-data.apex +311 -0
- package/skills/handling-sf-data/assets/cleanup/rollback-transaction.apex +266 -0
- package/skills/handling-sf-data/assets/csv/account-import.csv +11 -0
- package/skills/handling-sf-data/assets/csv/contact-import.csv +11 -0
- package/skills/handling-sf-data/assets/csv/custom-object-import.csv +11 -0
- package/skills/handling-sf-data/assets/csv/opportunity-import.csv +11 -0
- package/skills/handling-sf-data/assets/factories/account-factory.apex +165 -0
- package/skills/handling-sf-data/assets/factories/case-factory.apex +237 -0
- package/skills/handling-sf-data/assets/factories/contact-factory.apex +168 -0
- package/skills/handling-sf-data/assets/factories/custom-object-factory.apex +260 -0
- package/skills/handling-sf-data/assets/factories/event-factory.apex +275 -0
- package/skills/handling-sf-data/assets/factories/hierarchy-factory.apex +372 -0
- package/skills/handling-sf-data/assets/factories/lead-factory.apex +190 -0
- package/skills/handling-sf-data/assets/factories/opportunity-factory.apex +206 -0
- package/skills/handling-sf-data/assets/factories/task-factory.apex +246 -0
- package/skills/handling-sf-data/assets/factories/user-factory.apex +278 -0
- package/skills/handling-sf-data/assets/json/account-contact-tree.json +130 -0
- package/skills/handling-sf-data/assets/json/account-opportunity-tree.json +110 -0
- package/skills/handling-sf-data/assets/json/full-hierarchy-tree.json +188 -0
- package/skills/handling-sf-data/assets/soql/aggregate.soql +226 -0
- package/skills/handling-sf-data/assets/soql/child-to-parent.soql +162 -0
- package/skills/handling-sf-data/assets/soql/parent-to-child.soql +153 -0
- package/skills/handling-sf-data/assets/soql/polymorphic.soql +198 -0
- package/skills/handling-sf-data/assets/soql/subquery.soql +287 -0
- package/skills/handling-sf-data/references/anonymous-apex-guide.md +98 -0
- package/skills/handling-sf-data/references/bulk-operations-guide.md +94 -0
- package/skills/handling-sf-data/references/bulk-testing-example.md +194 -0
- package/skills/handling-sf-data/references/cleanup-rollback-example.md +322 -0
- package/skills/handling-sf-data/references/cleanup-rollback-guide.md +84 -0
- package/skills/handling-sf-data/references/crud-workflow-example.md +183 -0
- package/skills/handling-sf-data/references/governor-limits-reference.md +74 -0
- package/skills/handling-sf-data/references/orchestration.md +174 -0
- package/skills/handling-sf-data/references/relationship-query-examples.md +249 -0
- package/skills/handling-sf-data/references/sf-cli-data-commands.md +158 -0
- package/skills/handling-sf-data/references/soql-relationship-guide.md +84 -0
- package/skills/handling-sf-data/references/test-data-best-practices.md +104 -0
- package/skills/handling-sf-data/references/test-data-factory-usage.md +290 -0
- package/skills/handling-sf-data/references/test-data-patterns.md +98 -0
- package/skills/handling-sf-data/scripts/soql_validator.py +292 -0
- package/skills/handling-sf-data/scripts/validate_data_operation.py +379 -0
- package/skills/harmonizing-datacloud/CREDITS.md +3 -0
- package/skills/harmonizing-datacloud/README.md +31 -0
- package/skills/harmonizing-datacloud/SKILL.md +117 -0
- package/skills/modeling-omnistudio-epc-catalog/CREDITS.md +14 -0
- package/skills/modeling-omnistudio-epc-catalog/README.md +89 -0
- package/skills/modeling-omnistudio-epc-catalog/SKILL.md +395 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/attribute-assignment-template.json +402 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/compiled-attribute-overrides-template.json +43 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/completion-block-template.txt +8 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/decomposition-relationships-template.json +233 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_AttributeAssignments.json +514 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_CompiledAttributeOverrides.json +21 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_DataPack.json +649 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_DecompositionRelationships.json +200 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ObjectFieldAttributes.json +138 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_OrchestrationScenarios.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_OverrideDefinitions.json +266 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ParentKeys.json +23 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_PriceListEntries.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ProductChildItems.json +34 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_RuleAssignments.json +21 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_AttributeAssignments.json +410 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_DataPack.json +535 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_DecompositionRelationships.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ObjectFieldAttributes.json +138 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_OrchestrationScenarios.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ParentKeys.json +23 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_PriceListEntries.json +220 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ProductChildItems.json +414 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_AttributeAssignments.json +382 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_DataPack.json +565 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_DecompositionRelationships.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ObjectFieldAttributes.json +104 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_OrchestrationScenarios.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ParentKeys.json +13 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_PriceListEntries.json +106 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ProductChildItems.json +72 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_AttributeAssignments.json +142 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_DataPack.json +377 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_DecompositionRelationships.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ObjectFieldAttributes.json +36 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ParentKeys.json +8 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_PriceListEntries.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ProductChildItems.json +34 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/object-field-attributes-template.json +138 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/orchestration-scenarios-template.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/override-definitions-template.json +134 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/parent-keys-template.json +29 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/price-list-entries-template.json +158 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/pricebook-entries-template.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/product-child-item-template.json +338 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/product2-offer-template.json +527 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/.gitkeep +1 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_AttributeAssignments.json +95 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_CompiledAttributeOverrides.json +1 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_DataPack.json +214 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_DecompositionRelationships.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ObjectFieldAttributes.json +98 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_OrchestrationScenarios.json +22 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_OverrideDefinitions.json +1 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ParentKeys.json +13 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_PriceListEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_PricebookEntries.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ProductChildItems.json +110 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/TRANSCRIPT.md +58 -0
- package/skills/modeling-omnistudio-epc-catalog/references/epc-field-guide.md +90 -0
- package/skills/modeling-omnistudio-epc-catalog/references/naming-conventions.md +80 -0
- package/skills/modeling-omnistudio-epc-catalog/references/scoring-model.md +57 -0
- package/skills/modeling-omnistudio-epc-catalog/scripts/cli-validation-commands.sh +19 -0
- package/skills/modeling-omnistudio-epc-catalog/scripts/sample-invocations.sh +18 -0
- package/skills/orchestrating-datacloud/CREDITS.md +15 -0
- package/skills/orchestrating-datacloud/README.md +129 -0
- package/skills/orchestrating-datacloud/SKILL.md +236 -0
- package/skills/orchestrating-datacloud/UPSTREAM.md +45 -0
- package/skills/orchestrating-datacloud/assets/definitions/activation-target.template.json +5 -0
- package/skills/orchestrating-datacloud/assets/definitions/activation.template.json +7 -0
- package/skills/orchestrating-datacloud/assets/definitions/calculated-insight.template.json +7 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-action-target.template.json +5 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-action.template.json +5 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-graph.template.json +21 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-stream.template.json +55 -0
- package/skills/orchestrating-datacloud/assets/definitions/dmo.template.json +17 -0
- package/skills/orchestrating-datacloud/assets/definitions/identity-resolution.template.json +30 -0
- package/skills/orchestrating-datacloud/assets/definitions/mapping.template.json +14 -0
- package/skills/orchestrating-datacloud/assets/definitions/relationship.template.json +12 -0
- package/skills/orchestrating-datacloud/assets/definitions/search-index.template.json +9 -0
- package/skills/orchestrating-datacloud/assets/definitions/segment.template.json +16 -0
- package/skills/orchestrating-datacloud/references/feature-readiness.md +157 -0
- package/skills/orchestrating-datacloud/references/plugin-setup.md +140 -0
- package/skills/orchestrating-datacloud/scripts/bootstrap-plugin.sh +53 -0
- package/skills/orchestrating-datacloud/scripts/diagnose-org.mjs +511 -0
- package/skills/orchestrating-datacloud/scripts/generate-manifest.mjs +68 -0
- package/skills/orchestrating-datacloud/scripts/verify-plugin.sh +58 -0
- package/skills/preparing-datacloud/CREDITS.md +7 -0
- package/skills/preparing-datacloud/README.md +51 -0
- package/skills/preparing-datacloud/SKILL.md +191 -0
- package/skills/preparing-datacloud/examples/ingestion-api/.env.example +8 -0
- package/skills/preparing-datacloud/examples/ingestion-api/README.md +48 -0
- package/skills/preparing-datacloud/examples/ingestion-api/send-data.py +144 -0
- package/skills/querying-soql/CREDITS.md +21 -0
- package/skills/querying-soql/README.md +41 -0
- package/skills/querying-soql/SKILL.md +143 -0
- package/skills/querying-soql/assets/aggregate-queries.soql +242 -0
- package/skills/querying-soql/assets/basic-queries.soql +188 -0
- package/skills/querying-soql/assets/bulkified-query-pattern.cls +280 -0
- package/skills/querying-soql/assets/optimization-patterns.soql +259 -0
- package/skills/querying-soql/assets/relationship-queries.soql +203 -0
- package/skills/querying-soql/assets/selector-class.cls +219 -0
- package/skills/querying-soql/references/anti-patterns.md +348 -0
- package/skills/querying-soql/references/cli-commands.md +358 -0
- package/skills/querying-soql/references/field-coverage-rules.md +514 -0
- package/skills/querying-soql/references/query-optimization.md +142 -0
- package/skills/querying-soql/references/selector-patterns.md +479 -0
- package/skills/querying-soql/references/soql-reference.md +227 -0
- package/skills/querying-soql/references/soql-syntax-reference.md +208 -0
- package/skills/querying-soql/scripts/post-tool-validate.py +322 -0
- package/skills/retrieving-datacloud/CREDITS.md +7 -0
- package/skills/retrieving-datacloud/README.md +44 -0
- package/skills/retrieving-datacloud/SKILL.md +120 -0
- package/skills/retrieving-datacloud/examples/search-indexes/hybrid-structured.json +44 -0
- package/skills/retrieving-datacloud/examples/search-indexes/vector-knowledge.json +43 -0
- package/skills/running-apex-tests/CREDITS.md +22 -0
- package/skills/running-apex-tests/README.md +94 -0
- package/skills/running-apex-tests/SKILL.md +158 -0
- package/skills/running-apex-tests/assets/basic-test.cls +169 -0
- package/skills/running-apex-tests/assets/bulk-test.cls +255 -0
- package/skills/running-apex-tests/assets/dml-mock.cls +339 -0
- package/skills/running-apex-tests/assets/mock-callout-test.cls +353 -0
- package/skills/running-apex-tests/assets/stub-provider-example.cls +364 -0
- package/skills/running-apex-tests/assets/test-data-factory.cls +328 -0
- package/skills/running-apex-tests/hooks/scripts/parse-test-results.py +364 -0
- package/skills/running-apex-tests/references/cli-commands.md +289 -0
- package/skills/running-apex-tests/references/mocking-patterns.md +500 -0
- package/skills/running-apex-tests/references/performance-optimization.md +283 -0
- package/skills/running-apex-tests/references/test-fix-loop.md +49 -0
- package/skills/running-apex-tests/references/test-patterns.md +154 -0
- package/skills/running-apex-tests/references/testing-best-practices.md +509 -0
- package/skills/segmenting-datacloud/CREDITS.md +3 -0
- package/skills/segmenting-datacloud/README.md +36 -0
- package/skills/segmenting-datacloud/SKILL.md +115 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Synchronous REST Callout Service for {{ServiceName}}
|
|
3
|
+
*
|
|
4
|
+
* Use Case: Real-time API calls where immediate response is needed
|
|
5
|
+
* - User-initiated actions requiring feedback
|
|
6
|
+
* - API calls NOT triggered from DML operations
|
|
7
|
+
*
|
|
8
|
+
* IMPORTANT: Do NOT use synchronous callouts from triggers or DML contexts.
|
|
9
|
+
* Use rest-queueable-callout.cls template instead.
|
|
10
|
+
*
|
|
11
|
+
* @author {{Author}}
|
|
12
|
+
* @date {{Date}}
|
|
13
|
+
*/
|
|
14
|
+
public with sharing class {{ServiceName}}Callout {
|
|
15
|
+
|
|
16
|
+
// Named Credential reference (configured in Setup)
|
|
17
|
+
private static final String NAMED_CREDENTIAL = 'callout:{{NamedCredentialName}}';
|
|
18
|
+
|
|
19
|
+
// Default timeout (max 120000 ms = 120 seconds)
|
|
20
|
+
private static final Integer DEFAULT_TIMEOUT = 120000;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @description Make HTTP request to external API
|
|
24
|
+
* @param method HTTP method (GET, POST, PUT, PATCH, DELETE)
|
|
25
|
+
* @param endpoint API endpoint path (appended to Named Credential base URL)
|
|
26
|
+
* @param body Request body (null for GET/DELETE)
|
|
27
|
+
* @return HttpResponse from external API
|
|
28
|
+
*/
|
|
29
|
+
public static HttpResponse makeRequest(String method, String endpoint, String body) {
|
|
30
|
+
HttpRequest req = new HttpRequest();
|
|
31
|
+
req.setEndpoint(NAMED_CREDENTIAL + endpoint);
|
|
32
|
+
req.setMethod(method);
|
|
33
|
+
req.setHeader('Content-Type', 'application/json');
|
|
34
|
+
req.setHeader('Accept', 'application/json');
|
|
35
|
+
req.setTimeout(DEFAULT_TIMEOUT);
|
|
36
|
+
|
|
37
|
+
if (String.isNotBlank(body) && (method == 'POST' || method == 'PUT' || method == 'PATCH')) {
|
|
38
|
+
req.setBody(body);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
Http http = new Http();
|
|
42
|
+
return http.send(req);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @description GET request
|
|
47
|
+
* @param endpoint API endpoint path
|
|
48
|
+
* @return Parsed response as Map
|
|
49
|
+
*/
|
|
50
|
+
public static Map<String, Object> get(String endpoint) {
|
|
51
|
+
HttpResponse res = makeRequest('GET', endpoint, null);
|
|
52
|
+
return handleResponse(res);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @description GET request with query parameters
|
|
57
|
+
* @param endpoint API endpoint path
|
|
58
|
+
* @param params Query parameters
|
|
59
|
+
* @return Parsed response as Map
|
|
60
|
+
*/
|
|
61
|
+
public static Map<String, Object> get(String endpoint, Map<String, String> params) {
|
|
62
|
+
String queryString = buildQueryString(params);
|
|
63
|
+
String fullEndpoint = String.isNotBlank(queryString)
|
|
64
|
+
? endpoint + '?' + queryString
|
|
65
|
+
: endpoint;
|
|
66
|
+
return get(fullEndpoint);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* @description POST request
|
|
71
|
+
* @param endpoint API endpoint path
|
|
72
|
+
* @param payload Request body as Map
|
|
73
|
+
* @return Parsed response as Map
|
|
74
|
+
*/
|
|
75
|
+
public static Map<String, Object> post(String endpoint, Map<String, Object> payload) {
|
|
76
|
+
HttpResponse res = makeRequest('POST', endpoint, JSON.serialize(payload));
|
|
77
|
+
return handleResponse(res);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @description PUT request (full resource update)
|
|
82
|
+
* @param endpoint API endpoint path
|
|
83
|
+
* @param payload Request body as Map
|
|
84
|
+
* @return Parsed response as Map
|
|
85
|
+
*/
|
|
86
|
+
public static Map<String, Object> put(String endpoint, Map<String, Object> payload) {
|
|
87
|
+
HttpResponse res = makeRequest('PUT', endpoint, JSON.serialize(payload));
|
|
88
|
+
return handleResponse(res);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* @description PATCH request (partial resource update)
|
|
93
|
+
* @param endpoint API endpoint path
|
|
94
|
+
* @param payload Request body as Map
|
|
95
|
+
* @return Parsed response as Map
|
|
96
|
+
*/
|
|
97
|
+
public static Map<String, Object> patch(String endpoint, Map<String, Object> payload) {
|
|
98
|
+
HttpResponse res = makeRequest('PATCH', endpoint, JSON.serialize(payload));
|
|
99
|
+
return handleResponse(res);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* @description DELETE request
|
|
104
|
+
* @param endpoint API endpoint path
|
|
105
|
+
* @return Parsed response as Map (may be empty for 204)
|
|
106
|
+
*/
|
|
107
|
+
public static Map<String, Object> del(String endpoint) {
|
|
108
|
+
HttpResponse res = makeRequest('DELETE', endpoint, null);
|
|
109
|
+
return handleResponse(res);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* @description Handle HTTP response and parse JSON
|
|
114
|
+
* @param res HttpResponse from callout
|
|
115
|
+
* @return Parsed response as Map
|
|
116
|
+
* @throws CalloutException for error status codes
|
|
117
|
+
*/
|
|
118
|
+
private static Map<String, Object> handleResponse(HttpResponse res) {
|
|
119
|
+
Integer statusCode = res.getStatusCode();
|
|
120
|
+
String responseBody = res.getBody();
|
|
121
|
+
|
|
122
|
+
// Log for debugging (consider removing in production or use custom logging)
|
|
123
|
+
System.debug(LoggingLevel.DEBUG, 'Response Status: ' + statusCode);
|
|
124
|
+
System.debug(LoggingLevel.DEBUG, 'Response Body: ' + responseBody);
|
|
125
|
+
|
|
126
|
+
// Success (2xx)
|
|
127
|
+
if (statusCode >= 200 && statusCode < 300) {
|
|
128
|
+
if (String.isBlank(responseBody) || statusCode == 204) {
|
|
129
|
+
return new Map<String, Object>();
|
|
130
|
+
}
|
|
131
|
+
return (Map<String, Object>) JSON.deserializeUntyped(responseBody);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Client Error (4xx)
|
|
135
|
+
if (statusCode >= 400 && statusCode < 500) {
|
|
136
|
+
String errorMessage = parseErrorMessage(responseBody);
|
|
137
|
+
throw new ClientException('Client Error (' + statusCode + '): ' + errorMessage);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Server Error (5xx)
|
|
141
|
+
if (statusCode >= 500) {
|
|
142
|
+
throw new ServerException('Server Error (' + statusCode + '): ' + responseBody);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Unexpected status
|
|
146
|
+
throw new CalloutException('Unexpected status code: ' + statusCode);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* @description Parse error message from response body
|
|
151
|
+
* @param responseBody Raw response body
|
|
152
|
+
* @return Error message string
|
|
153
|
+
*/
|
|
154
|
+
private static String parseErrorMessage(String responseBody) {
|
|
155
|
+
try {
|
|
156
|
+
Map<String, Object> errorResponse = (Map<String, Object>) JSON.deserializeUntyped(responseBody);
|
|
157
|
+
|
|
158
|
+
// Common error message field names
|
|
159
|
+
if (errorResponse.containsKey('error')) {
|
|
160
|
+
Object error = errorResponse.get('error');
|
|
161
|
+
if (error instanceof String) {
|
|
162
|
+
return (String) error;
|
|
163
|
+
} else if (error instanceof Map<String, Object>) {
|
|
164
|
+
Map<String, Object> errorObj = (Map<String, Object>) error;
|
|
165
|
+
return (String) errorObj.get('message');
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (errorResponse.containsKey('message')) {
|
|
169
|
+
return (String) errorResponse.get('message');
|
|
170
|
+
}
|
|
171
|
+
if (errorResponse.containsKey('errors')) {
|
|
172
|
+
return JSON.serialize(errorResponse.get('errors'));
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return responseBody;
|
|
176
|
+
} catch (Exception e) {
|
|
177
|
+
return responseBody;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* @description Build URL query string from parameters
|
|
183
|
+
* @param params Map of query parameters
|
|
184
|
+
* @return Encoded query string
|
|
185
|
+
*/
|
|
186
|
+
private static String buildQueryString(Map<String, String> params) {
|
|
187
|
+
if (params == null || params.isEmpty()) {
|
|
188
|
+
return '';
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
List<String> pairs = new List<String>();
|
|
192
|
+
for (String key : params.keySet()) {
|
|
193
|
+
String value = params.get(key);
|
|
194
|
+
if (String.isNotBlank(value)) {
|
|
195
|
+
pairs.add(EncodingUtil.urlEncode(key, 'UTF-8') + '=' +
|
|
196
|
+
EncodingUtil.urlEncode(value, 'UTF-8'));
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return String.join(pairs, '&');
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* @description Client error (4xx) exception
|
|
204
|
+
*/
|
|
205
|
+
public class ClientException extends Exception {}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* @description Server error (5xx) exception
|
|
209
|
+
*/
|
|
210
|
+
public class ServerException extends Exception {}
|
|
211
|
+
}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Change Data Capture (CDC) Handler for {{ObjectName}}
|
|
3
|
+
*
|
|
4
|
+
* Use Case: Business logic for processing CDC events
|
|
5
|
+
* - Sync changes to external systems
|
|
6
|
+
* - Maintain audit logs
|
|
7
|
+
* - Trigger downstream processes
|
|
8
|
+
*
|
|
9
|
+
* This class is called by the {{ObjectName}}CDCSubscriber trigger
|
|
10
|
+
* and contains all business logic for CDC event processing.
|
|
11
|
+
*
|
|
12
|
+
* @author {{Author}}
|
|
13
|
+
* @date {{Date}}
|
|
14
|
+
*/
|
|
15
|
+
public with sharing class {{ObjectName}}CDCHandler {
|
|
16
|
+
|
|
17
|
+
// Fields to watch for sync (ignore changes to other fields)
|
|
18
|
+
private static final Set<String> SYNC_FIELDS = new Set<String>{
|
|
19
|
+
'Name',
|
|
20
|
+
'Status__c',
|
|
21
|
+
'Amount__c'
|
|
22
|
+
// Add fields that should trigger sync
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @description Handle CREATE change events
|
|
27
|
+
* @param event The CDC event
|
|
28
|
+
* @param header The change event header
|
|
29
|
+
*/
|
|
30
|
+
public static void handleCreate({{ObjectName}}ChangeEvent event, EventBus.ChangeEventHeader header) {
|
|
31
|
+
List<String> recordIds = header.getRecordIds();
|
|
32
|
+
Datetime commitTime = header.getCommitTimestamp();
|
|
33
|
+
|
|
34
|
+
System.debug(LoggingLevel.DEBUG,
|
|
35
|
+
'CDC CREATE - Records: ' + recordIds + ' at ' + commitTime);
|
|
36
|
+
|
|
37
|
+
// Build payload from event field values
|
|
38
|
+
Map<String, Object> payload = buildPayloadFromEvent(event);
|
|
39
|
+
payload.put('recordIds', recordIds);
|
|
40
|
+
payload.put('operation', 'CREATE');
|
|
41
|
+
payload.put('timestamp', commitTime);
|
|
42
|
+
|
|
43
|
+
// Queue sync to external system
|
|
44
|
+
System.enqueueJob(new ExternalSyncQueueable(payload));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @description Handle UPDATE change events
|
|
49
|
+
* @param event The CDC event
|
|
50
|
+
* @param header The change event header
|
|
51
|
+
* @param changedFields List of changed field API names
|
|
52
|
+
*/
|
|
53
|
+
public static void handleUpdate(
|
|
54
|
+
{{ObjectName}}ChangeEvent event,
|
|
55
|
+
EventBus.ChangeEventHeader header,
|
|
56
|
+
List<String> changedFields
|
|
57
|
+
) {
|
|
58
|
+
List<String> recordIds = header.getRecordIds();
|
|
59
|
+
|
|
60
|
+
// Check if any sync-relevant fields changed
|
|
61
|
+
Boolean relevantChange = false;
|
|
62
|
+
List<String> relevantFields = new List<String>();
|
|
63
|
+
|
|
64
|
+
for (String field : changedFields) {
|
|
65
|
+
if (SYNC_FIELDS.contains(field)) {
|
|
66
|
+
relevantChange = true;
|
|
67
|
+
relevantFields.add(field);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (!relevantChange) {
|
|
72
|
+
System.debug(LoggingLevel.DEBUG,
|
|
73
|
+
'CDC UPDATE - Ignoring (no sync fields changed): ' + changedFields);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
System.debug(LoggingLevel.DEBUG,
|
|
78
|
+
'CDC UPDATE - Records: ' + recordIds +
|
|
79
|
+
', Relevant changed fields: ' + relevantFields);
|
|
80
|
+
|
|
81
|
+
// Build payload with changed values
|
|
82
|
+
Map<String, Object> payload = buildPayloadFromEvent(event);
|
|
83
|
+
payload.put('recordIds', recordIds);
|
|
84
|
+
payload.put('operation', 'UPDATE');
|
|
85
|
+
payload.put('changedFields', relevantFields);
|
|
86
|
+
payload.put('timestamp', header.getCommitTimestamp());
|
|
87
|
+
|
|
88
|
+
// Queue sync to external system
|
|
89
|
+
System.enqueueJob(new ExternalSyncQueueable(payload));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* @description Handle DELETE change events
|
|
94
|
+
* @param recordIds Deleted record IDs
|
|
95
|
+
* @param header The change event header
|
|
96
|
+
*/
|
|
97
|
+
public static void handleDelete(List<String> recordIds, EventBus.ChangeEventHeader header) {
|
|
98
|
+
System.debug(LoggingLevel.DEBUG,
|
|
99
|
+
'CDC DELETE - Records: ' + recordIds);
|
|
100
|
+
|
|
101
|
+
Map<String, Object> payload = new Map<String, Object>{
|
|
102
|
+
'recordIds' => recordIds,
|
|
103
|
+
'operation' => 'DELETE',
|
|
104
|
+
'timestamp' => header.getCommitTimestamp()
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
// Queue delete sync to external system
|
|
108
|
+
System.enqueueJob(new ExternalSyncQueueable(payload));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* @description Handle UNDELETE change events
|
|
113
|
+
* @param event The CDC event
|
|
114
|
+
* @param header The change event header
|
|
115
|
+
*/
|
|
116
|
+
public static void handleUndelete({{ObjectName}}ChangeEvent event, EventBus.ChangeEventHeader header) {
|
|
117
|
+
// Treat undelete like create - sync full record
|
|
118
|
+
handleCreate(event, header);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* @description Handle GAP events (missed events)
|
|
123
|
+
* @param recordIds Affected record IDs
|
|
124
|
+
* @param gapType Type of gap event
|
|
125
|
+
*/
|
|
126
|
+
public static void handleGap(List<String> recordIds, String gapType) {
|
|
127
|
+
System.debug(LoggingLevel.WARN,
|
|
128
|
+
'CDC GAP - Type: ' + gapType + ', Records: ' + recordIds);
|
|
129
|
+
|
|
130
|
+
// Query current state of records and sync
|
|
131
|
+
// This ensures we have accurate data despite missed events
|
|
132
|
+
/*
|
|
133
|
+
List<{{ObjectName}}> records = [
|
|
134
|
+
SELECT Id, Name, Status__c, Amount__c
|
|
135
|
+
FROM {{ObjectName}}
|
|
136
|
+
WHERE Id IN :recordIds
|
|
137
|
+
WITH USER_MODE
|
|
138
|
+
];
|
|
139
|
+
|
|
140
|
+
for ({{ObjectName}} record : records) {
|
|
141
|
+
Map<String, Object> payload = new Map<String, Object>{
|
|
142
|
+
'recordIds' => new List<String>{record.Id},
|
|
143
|
+
'operation' => 'SYNC', // Full sync due to gap
|
|
144
|
+
'data' => record
|
|
145
|
+
};
|
|
146
|
+
System.enqueueJob(new ExternalSyncQueueable(payload));
|
|
147
|
+
}
|
|
148
|
+
*/
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* @description Handle GAP_OVERFLOW (too many changes)
|
|
153
|
+
* @param entityName The object API name
|
|
154
|
+
*/
|
|
155
|
+
public static void handleOverflow(String entityName) {
|
|
156
|
+
System.debug(LoggingLevel.ERROR,
|
|
157
|
+
'CDC OVERFLOW for ' + entityName + ' - Full sync required!');
|
|
158
|
+
|
|
159
|
+
// Create alert/task for admin attention
|
|
160
|
+
/*
|
|
161
|
+
Task alertTask = new Task(
|
|
162
|
+
Subject = 'CDC Overflow - Full Sync Required for ' + entityName,
|
|
163
|
+
Description = 'Change Data Capture experienced overflow. ' +
|
|
164
|
+
'Some events were missed. Full sync is required.',
|
|
165
|
+
Priority = 'High',
|
|
166
|
+
Status = 'Open',
|
|
167
|
+
ActivityDate = Date.today()
|
|
168
|
+
);
|
|
169
|
+
insert alertTask;
|
|
170
|
+
*/
|
|
171
|
+
|
|
172
|
+
// Consider triggering a batch job for full sync
|
|
173
|
+
// Database.executeBatch(new FullSyncBatch(entityName));
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* @description Build payload map from CDC event field values
|
|
178
|
+
* @param event The CDC event
|
|
179
|
+
* @return Map of field values
|
|
180
|
+
*/
|
|
181
|
+
private static Map<String, Object> buildPayloadFromEvent({{ObjectName}}ChangeEvent event) {
|
|
182
|
+
Map<String, Object> payload = new Map<String, Object>();
|
|
183
|
+
|
|
184
|
+
// Map event fields to payload
|
|
185
|
+
// Only non-null values are changed fields
|
|
186
|
+
payload.put('Name', event.Name);
|
|
187
|
+
// payload.put('Status__c', event.Status__c);
|
|
188
|
+
// payload.put('Amount__c', event.Amount__c);
|
|
189
|
+
// Add more fields as needed
|
|
190
|
+
|
|
191
|
+
// Remove null values (unchanged fields)
|
|
192
|
+
Set<String> keysToRemove = new Set<String>();
|
|
193
|
+
for (String key : payload.keySet()) {
|
|
194
|
+
if (payload.get(key) == null) {
|
|
195
|
+
keysToRemove.add(key);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
for (String key : keysToRemove) {
|
|
199
|
+
payload.remove(key);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return payload;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* @description Queueable job for syncing to external system
|
|
207
|
+
*/
|
|
208
|
+
public class ExternalSyncQueueable implements Queueable, Database.AllowsCallouts {
|
|
209
|
+
private Map<String, Object> payload;
|
|
210
|
+
|
|
211
|
+
public ExternalSyncQueueable(Map<String, Object> payload) {
|
|
212
|
+
this.payload = payload;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
public void execute(QueueableContext context) {
|
|
216
|
+
try {
|
|
217
|
+
// Call external system with payload
|
|
218
|
+
// Example: Use Named Credential + REST callout
|
|
219
|
+
/*
|
|
220
|
+
HttpRequest req = new HttpRequest();
|
|
221
|
+
req.setEndpoint('callout:ExternalSystem/sync');
|
|
222
|
+
req.setMethod('POST');
|
|
223
|
+
req.setHeader('Content-Type', 'application/json');
|
|
224
|
+
req.setBody(JSON.serialize(payload));
|
|
225
|
+
|
|
226
|
+
Http http = new Http();
|
|
227
|
+
HttpResponse res = http.send(req);
|
|
228
|
+
|
|
229
|
+
if (res.getStatusCode() >= 200 && res.getStatusCode() < 300) {
|
|
230
|
+
System.debug('Sync successful');
|
|
231
|
+
} else {
|
|
232
|
+
System.debug('Sync failed: ' + res.getStatusCode());
|
|
233
|
+
}
|
|
234
|
+
*/
|
|
235
|
+
|
|
236
|
+
System.debug(LoggingLevel.DEBUG,
|
|
237
|
+
'External sync payload: ' + JSON.serialize(payload));
|
|
238
|
+
|
|
239
|
+
} catch (Exception e) {
|
|
240
|
+
System.debug(LoggingLevel.ERROR,
|
|
241
|
+
'External sync failed: ' + e.getMessage());
|
|
242
|
+
// Consider: Create error log, retry logic, DLQ
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Change Data Capture (CDC) Subscriber Trigger for {{ObjectName}}
|
|
3
|
+
*
|
|
4
|
+
* Use Case: React to data changes in near real-time
|
|
5
|
+
* - Sync data to external systems
|
|
6
|
+
* - Audit logging
|
|
7
|
+
* - Cache invalidation
|
|
8
|
+
* - Event-driven integrations
|
|
9
|
+
*
|
|
10
|
+
* CDC Channel Name: {{ObjectName}}ChangeEvent
|
|
11
|
+
* - Standard objects: AccountChangeEvent, ContactChangeEvent, etc.
|
|
12
|
+
* - Custom objects: MyObject__ChangeEvent (append "ChangeEvent" to API name)
|
|
13
|
+
*
|
|
14
|
+
* Key Concepts:
|
|
15
|
+
* - ChangeEventHeader contains metadata (changeType, changedFields, recordIds)
|
|
16
|
+
* - Event contains changed field values (nulls for unchanged fields)
|
|
17
|
+
* - Supports CREATE, UPDATE, DELETE, UNDELETE change types
|
|
18
|
+
* - Gap events indicate missed events (handle replay)
|
|
19
|
+
*
|
|
20
|
+
* IMPORTANT:
|
|
21
|
+
* - Enable CDC for object in Setup → Integrations → Change Data Capture
|
|
22
|
+
* - Triggers fire in separate transaction from DML
|
|
23
|
+
* - Events are retained for 3 days (replay window)
|
|
24
|
+
*
|
|
25
|
+
* @author {{Author}}
|
|
26
|
+
* @date {{Date}}
|
|
27
|
+
*/
|
|
28
|
+
trigger {{ObjectName}}CDCSubscriber on {{ObjectName}}ChangeEvent (after insert) {
|
|
29
|
+
|
|
30
|
+
// Track replay ID for checkpoint
|
|
31
|
+
String lastReplayId = '';
|
|
32
|
+
|
|
33
|
+
for ({{ObjectName}}ChangeEvent event : Trigger.new) {
|
|
34
|
+
// Store replay ID
|
|
35
|
+
lastReplayId = event.ReplayId;
|
|
36
|
+
|
|
37
|
+
// Get change event header (metadata about the change)
|
|
38
|
+
EventBus.ChangeEventHeader header = event.ChangeEventHeader;
|
|
39
|
+
|
|
40
|
+
// Extract header information
|
|
41
|
+
String changeType = header.getChangeType();
|
|
42
|
+
List<String> changedFields = header.getChangedFields();
|
|
43
|
+
List<String> recordIds = header.getRecordIds();
|
|
44
|
+
String entityName = header.getEntityName();
|
|
45
|
+
Long commitNumber = header.getCommitNumber();
|
|
46
|
+
Datetime commitTimestamp = header.getCommitTimestamp();
|
|
47
|
+
String transactionKey = header.getTransactionKey();
|
|
48
|
+
|
|
49
|
+
// Log event details
|
|
50
|
+
System.debug(LoggingLevel.DEBUG,
|
|
51
|
+
'CDC Event - Type: ' + changeType +
|
|
52
|
+
', Entity: ' + entityName +
|
|
53
|
+
', Records: ' + recordIds +
|
|
54
|
+
', Changed Fields: ' + changedFields);
|
|
55
|
+
|
|
56
|
+
try {
|
|
57
|
+
// Route based on change type
|
|
58
|
+
switch on changeType {
|
|
59
|
+
when 'CREATE' {
|
|
60
|
+
{{ObjectName}}CDCHandler.handleCreate(event, header);
|
|
61
|
+
}
|
|
62
|
+
when 'UPDATE' {
|
|
63
|
+
{{ObjectName}}CDCHandler.handleUpdate(event, header, changedFields);
|
|
64
|
+
}
|
|
65
|
+
when 'DELETE' {
|
|
66
|
+
{{ObjectName}}CDCHandler.handleDelete(recordIds, header);
|
|
67
|
+
}
|
|
68
|
+
when 'UNDELETE' {
|
|
69
|
+
{{ObjectName}}CDCHandler.handleUndelete(event, header);
|
|
70
|
+
}
|
|
71
|
+
when 'GAP_CREATE', 'GAP_UPDATE', 'GAP_DELETE', 'GAP_UNDELETE' {
|
|
72
|
+
// Gap events indicate missed events
|
|
73
|
+
// Should trigger full sync for affected records
|
|
74
|
+
System.debug(LoggingLevel.WARN,
|
|
75
|
+
'GAP event detected - some events may have been missed. ' +
|
|
76
|
+
'Type: ' + changeType + ', Records: ' + recordIds);
|
|
77
|
+
{{ObjectName}}CDCHandler.handleGap(recordIds, changeType);
|
|
78
|
+
}
|
|
79
|
+
when 'GAP_OVERFLOW' {
|
|
80
|
+
// Too many changes to track - full sync needed
|
|
81
|
+
System.debug(LoggingLevel.ERROR,
|
|
82
|
+
'GAP_OVERFLOW - full sync required for ' + entityName);
|
|
83
|
+
{{ObjectName}}CDCHandler.handleOverflow(entityName);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
} catch (Exception e) {
|
|
88
|
+
// Log error but continue processing
|
|
89
|
+
System.debug(LoggingLevel.ERROR,
|
|
90
|
+
'CDC processing error for ' + recordIds + ': ' + e.getMessage());
|
|
91
|
+
System.debug(LoggingLevel.ERROR, 'Stack: ' + e.getStackTraceString());
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Set resume checkpoint for durability
|
|
96
|
+
if (String.isNotBlank(lastReplayId)) {
|
|
97
|
+
EventBus.TriggerContext.currentContext().setResumeCheckpoint(lastReplayId);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/*
|
|
102
|
+
* ============================================================================
|
|
103
|
+
* CDC TRIGGER BEST PRACTICES
|
|
104
|
+
* ============================================================================
|
|
105
|
+
*
|
|
106
|
+
* 1. ENABLE CDC FOR OBJECT
|
|
107
|
+
* Setup → Integrations → Change Data Capture → Select Objects
|
|
108
|
+
*
|
|
109
|
+
* 2. HANDLE ALL CHANGE TYPES
|
|
110
|
+
* - CREATE: New record
|
|
111
|
+
* - UPDATE: Record modified
|
|
112
|
+
* - DELETE: Record deleted
|
|
113
|
+
* - UNDELETE: Record restored from recycle bin
|
|
114
|
+
* - GAP_*: Events were missed (sync required)
|
|
115
|
+
* - GAP_OVERFLOW: Too many changes (full sync needed)
|
|
116
|
+
*
|
|
117
|
+
* 3. USE CHANGEDEVENTHEAD FOR METADATA
|
|
118
|
+
* - getChangeType(): Operation type
|
|
119
|
+
* - getChangedFields(): List of changed field API names
|
|
120
|
+
* - getRecordIds(): Affected record IDs
|
|
121
|
+
* - getCommitTimestamp(): When change occurred
|
|
122
|
+
*
|
|
123
|
+
* 4. FIELD VALUES IN EVENT
|
|
124
|
+
* - Changed fields have new values
|
|
125
|
+
* - Unchanged fields are NULL
|
|
126
|
+
* - Use changedFields list to know what changed
|
|
127
|
+
*
|
|
128
|
+
* 5. IDEMPOTENT HANDLERS
|
|
129
|
+
* - Same event might fire multiple times
|
|
130
|
+
* - Use transactionKey to detect duplicates
|
|
131
|
+
* - Design handlers to be safe for replay
|
|
132
|
+
*
|
|
133
|
+
* 6. BULK CONSIDERATIONS
|
|
134
|
+
* - Multiple records can be in single event (batch DML)
|
|
135
|
+
* - Use getRecordIds() to get all affected IDs
|
|
136
|
+
* - Process all record IDs efficiently
|
|
137
|
+
*
|
|
138
|
+
* ============================================================================
|
|
139
|
+
*/
|
package/skills/building-sf-integrations/assets/endpoint-security/example.cspTrustedSite-meta.xml
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!--
|
|
3
|
+
CSP Trusted Site Template
|
|
4
|
+
|
|
5
|
+
Use this template when creating integration skills that make HTTP callouts
|
|
6
|
+
to external APIs.
|
|
7
|
+
|
|
8
|
+
RECOMMENDED: This is the MODERN approach (API 48+ / Spring '20+)
|
|
9
|
+
that replaces Remote Site Settings.
|
|
10
|
+
|
|
11
|
+
CSP (Content Security Policy) advantages:
|
|
12
|
+
- More granular control over security contexts
|
|
13
|
+
- Better alignment with web security standards
|
|
14
|
+
- Per-context security (Apex, Lightning, etc.)
|
|
15
|
+
- Future-proof
|
|
16
|
+
|
|
17
|
+
Setup:
|
|
18
|
+
1. Copy this file to your skill's assets/ directory
|
|
19
|
+
2. Replace {{placeholders}} with your values
|
|
20
|
+
3. Deploy to org OR let setup script deploy automatically
|
|
21
|
+
|
|
22
|
+
File Location: force-app/main/default/cspTrustedSites/{{APIName}}.cspTrustedSite-meta.xml
|
|
23
|
+
-->
|
|
24
|
+
<CspTrustedSite xmlns="http://soap.sforce.com/2006/04/metadata">
|
|
25
|
+
<!-- API Name - must be unique, alphanumeric only -->
|
|
26
|
+
<fullName>{{APIName}}</fullName>
|
|
27
|
+
|
|
28
|
+
<!-- Description - what this endpoint is for -->
|
|
29
|
+
<description>{{Description}}</description>
|
|
30
|
+
|
|
31
|
+
<!-- Endpoint URL - the base domain (no trailing slash) -->
|
|
32
|
+
<!-- Examples:
|
|
33
|
+
- https://api.stripe.com
|
|
34
|
+
- https://api.twilio.com
|
|
35
|
+
- https://graph.microsoft.com
|
|
36
|
+
-->
|
|
37
|
+
<endpointUrl>{{BaseURL}}</endpointUrl>
|
|
38
|
+
|
|
39
|
+
<!-- Active - set to true to enable -->
|
|
40
|
+
<isActive>true</isActive>
|
|
41
|
+
|
|
42
|
+
<!--
|
|
43
|
+
Context: Where this trusted site applies
|
|
44
|
+
|
|
45
|
+
Available contexts:
|
|
46
|
+
- All: Apply to all contexts (recommended for most integrations)
|
|
47
|
+
- Connect: Apex HTTP callouts only
|
|
48
|
+
- Frame: iframe embedding
|
|
49
|
+
- Img: Image resources
|
|
50
|
+
- Script: JavaScript resources
|
|
51
|
+
- Style: CSS resources
|
|
52
|
+
|
|
53
|
+
For Apex HTTP callouts (most common), use either:
|
|
54
|
+
- "All" (simplest, covers everything)
|
|
55
|
+
- "Connect" (most specific, Apex callouts only)
|
|
56
|
+
-->
|
|
57
|
+
<context>{{Context}}</context>
|
|
58
|
+
</CspTrustedSite>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!--
|
|
3
|
+
Remote Site Setting Template
|
|
4
|
+
|
|
5
|
+
Use this template when creating integration skills that make HTTP callouts
|
|
6
|
+
to external APIs.
|
|
7
|
+
|
|
8
|
+
IMPORTANT:
|
|
9
|
+
- This is the LEGACY approach (still works in all API versions)
|
|
10
|
+
- For API 48+ (Spring '20+), prefer CSP Trusted Sites (see example.cspTrustedSite-meta.xml)
|
|
11
|
+
|
|
12
|
+
Setup:
|
|
13
|
+
1. Copy this file to your skill's assets/ directory
|
|
14
|
+
2. Replace {{placeholders}} with your values
|
|
15
|
+
3. Deploy to org OR let setup script deploy automatically
|
|
16
|
+
|
|
17
|
+
File Location: force-app/main/default/remoteSiteSettings/{{APIName}}.remoteSite-meta.xml
|
|
18
|
+
-->
|
|
19
|
+
<RemoteSiteSetting xmlns="http://soap.sforce.com/2006/04/metadata">
|
|
20
|
+
<!-- API Name - must be unique, alphanumeric only -->
|
|
21
|
+
<fullName>{{APIName}}</fullName>
|
|
22
|
+
|
|
23
|
+
<!-- Description - what this endpoint is for -->
|
|
24
|
+
<description>{{Description}}</description>
|
|
25
|
+
|
|
26
|
+
<!-- Security - ALWAYS keep this false (don't allow HTTP, only HTTPS) -->
|
|
27
|
+
<disableProtocolSecurity>false</disableProtocolSecurity>
|
|
28
|
+
|
|
29
|
+
<!-- Active - set to true to enable -->
|
|
30
|
+
<isActive>true</isActive>
|
|
31
|
+
|
|
32
|
+
<!-- URL - the base domain (no path, no trailing slash) -->
|
|
33
|
+
<!-- Examples:
|
|
34
|
+
- https://api.stripe.com
|
|
35
|
+
- https://api.twilio.com
|
|
36
|
+
- https://graph.microsoft.com
|
|
37
|
+
-->
|
|
38
|
+
<url>{{BaseURL}}</url>
|
|
39
|
+
</RemoteSiteSetting>
|