@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,288 @@
|
|
|
1
|
+
<!-- Parent: building-sf-integrations/SKILL.md -->
|
|
2
|
+
# Change Data Capture (CDC) Guide
|
|
3
|
+
|
|
4
|
+
## Overview
|
|
5
|
+
|
|
6
|
+
Change Data Capture publishes change events for Salesforce records, enabling near real-time data synchronization with external systems.
|
|
7
|
+
|
|
8
|
+
## How CDC Works
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
12
|
+
│ CHANGE DATA CAPTURE FLOW │
|
|
13
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
14
|
+
│ │
|
|
15
|
+
│ 1. Record Created/Updated/Deleted in Salesforce │
|
|
16
|
+
│ ↓ │
|
|
17
|
+
│ 2. Salesforce generates Change Event │
|
|
18
|
+
│ ↓ │
|
|
19
|
+
│ 3. Event published to {{Object}}ChangeEvent channel │
|
|
20
|
+
│ ↓ │
|
|
21
|
+
│ 4. Apex Trigger or External Subscriber receives event │
|
|
22
|
+
│ ↓ │
|
|
23
|
+
│ 5. Process event (sync, audit, notify) │
|
|
24
|
+
│ │
|
|
25
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## CDC vs Platform Events
|
|
29
|
+
|
|
30
|
+
| Feature | CDC | Platform Events |
|
|
31
|
+
|---------|-----|-----------------|
|
|
32
|
+
| Trigger | Automatic on DML | Manual publish |
|
|
33
|
+
| Schema | Predefined (object fields) | Custom defined |
|
|
34
|
+
| Use Case | Data sync/replication | Custom messaging |
|
|
35
|
+
| Control | Limited | Full control |
|
|
36
|
+
|
|
37
|
+
## Enabling CDC
|
|
38
|
+
|
|
39
|
+
### Via Setup
|
|
40
|
+
|
|
41
|
+
1. Go to **Setup → Integrations → Change Data Capture**
|
|
42
|
+
2. Select objects to enable
|
|
43
|
+
3. Save
|
|
44
|
+
|
|
45
|
+
### Supported Objects
|
|
46
|
+
|
|
47
|
+
- Most Standard objects (Account, Contact, Opportunity, etc.)
|
|
48
|
+
- Custom objects
|
|
49
|
+
- Some system objects (User, Group, etc.)
|
|
50
|
+
|
|
51
|
+
## Event Channel Names
|
|
52
|
+
|
|
53
|
+
| Object Type | Channel Name |
|
|
54
|
+
|-------------|--------------|
|
|
55
|
+
| Standard | `AccountChangeEvent`, `ContactChangeEvent` |
|
|
56
|
+
| Custom | `My_Object__ChangeEvent` (append ChangeEvent) |
|
|
57
|
+
|
|
58
|
+
## Change Event Structure
|
|
59
|
+
|
|
60
|
+
### ChangeEventHeader
|
|
61
|
+
|
|
62
|
+
```apex
|
|
63
|
+
EventBus.ChangeEventHeader header = event.ChangeEventHeader;
|
|
64
|
+
|
|
65
|
+
// Available methods
|
|
66
|
+
header.getChangeType(); // CREATE, UPDATE, DELETE, UNDELETE
|
|
67
|
+
header.getChangedFields(); // List of changed field API names
|
|
68
|
+
header.getRecordIds(); // Affected record IDs
|
|
69
|
+
header.getEntityName(); // Object API name
|
|
70
|
+
header.getCommitNumber(); // Transaction sequence
|
|
71
|
+
header.getCommitTimestamp(); // When change occurred
|
|
72
|
+
header.getTransactionKey(); // Unique transaction ID
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Change Types
|
|
76
|
+
|
|
77
|
+
| Type | Description | Event Contains |
|
|
78
|
+
|------|-------------|----------------|
|
|
79
|
+
| CREATE | New record | All field values |
|
|
80
|
+
| UPDATE | Record modified | Changed field values only |
|
|
81
|
+
| DELETE | Record deleted | Record IDs only |
|
|
82
|
+
| UNDELETE | Restored from bin | All field values |
|
|
83
|
+
| GAP_* | Events missed | Affected record IDs |
|
|
84
|
+
| GAP_OVERFLOW | Too many changes | Entity name |
|
|
85
|
+
|
|
86
|
+
### Field Values
|
|
87
|
+
|
|
88
|
+
- **Changed fields**: Contain new values
|
|
89
|
+
- **Unchanged fields**: Null
|
|
90
|
+
- Use `getChangedFields()` to know what changed
|
|
91
|
+
|
|
92
|
+
## Subscribing to CDC
|
|
93
|
+
|
|
94
|
+
### Apex Trigger
|
|
95
|
+
|
|
96
|
+
```apex
|
|
97
|
+
trigger AccountCDC on AccountChangeEvent (after insert) {
|
|
98
|
+
for (AccountChangeEvent event : Trigger.new) {
|
|
99
|
+
EventBus.ChangeEventHeader header = event.ChangeEventHeader;
|
|
100
|
+
|
|
101
|
+
String changeType = header.getChangeType();
|
|
102
|
+
List<String> changedFields = header.getChangedFields();
|
|
103
|
+
List<String> recordIds = header.getRecordIds();
|
|
104
|
+
|
|
105
|
+
switch on changeType {
|
|
106
|
+
when 'CREATE' {
|
|
107
|
+
// Handle new records
|
|
108
|
+
}
|
|
109
|
+
when 'UPDATE' {
|
|
110
|
+
// Handle updates
|
|
111
|
+
}
|
|
112
|
+
when 'DELETE' {
|
|
113
|
+
// Handle deletions
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Set checkpoint
|
|
119
|
+
EventBus.TriggerContext.currentContext().setResumeCheckpoint(
|
|
120
|
+
Trigger.new[Trigger.new.size()-1].ReplayId
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### External (CometD)
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
Channel: /data/AccountChangeEvent
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Handling Specific Changes
|
|
132
|
+
|
|
133
|
+
### Filter by Changed Fields
|
|
134
|
+
|
|
135
|
+
```apex
|
|
136
|
+
// Only process if important fields changed
|
|
137
|
+
Set<String> importantFields = new Set<String>{'Status__c', 'Amount__c'};
|
|
138
|
+
List<String> changedFields = header.getChangedFields();
|
|
139
|
+
|
|
140
|
+
Boolean relevant = false;
|
|
141
|
+
for (String field : changedFields) {
|
|
142
|
+
if (importantFields.contains(field)) {
|
|
143
|
+
relevant = true;
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (!relevant) return;
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Get New Values
|
|
152
|
+
|
|
153
|
+
```apex
|
|
154
|
+
// Access field values from event (UPDATE: only changed fields have values)
|
|
155
|
+
if (changedFields.contains('Status__c')) {
|
|
156
|
+
String newStatus = event.Status__c;
|
|
157
|
+
// Process status change
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Gap Events
|
|
162
|
+
|
|
163
|
+
Gap events indicate missed events:
|
|
164
|
+
|
|
165
|
+
### Types
|
|
166
|
+
|
|
167
|
+
| Event | Meaning | Action |
|
|
168
|
+
|-------|---------|--------|
|
|
169
|
+
| GAP_CREATE | Missed creates | Query and sync records |
|
|
170
|
+
| GAP_UPDATE | Missed updates | Query current state |
|
|
171
|
+
| GAP_DELETE | Missed deletes | Reconcile with source |
|
|
172
|
+
| GAP_UNDELETE | Missed restores | Query and sync |
|
|
173
|
+
| GAP_OVERFLOW | Too many changes | Full sync required |
|
|
174
|
+
|
|
175
|
+
### Handling Gaps
|
|
176
|
+
|
|
177
|
+
```apex
|
|
178
|
+
when 'GAP_CREATE', 'GAP_UPDATE', 'GAP_DELETE', 'GAP_UNDELETE' {
|
|
179
|
+
// Query current state and sync
|
|
180
|
+
List<Account> records = [
|
|
181
|
+
SELECT Id, Name, Status__c
|
|
182
|
+
FROM Account
|
|
183
|
+
WHERE Id IN :header.getRecordIds()
|
|
184
|
+
];
|
|
185
|
+
syncToExternalSystem(records);
|
|
186
|
+
}
|
|
187
|
+
when 'GAP_OVERFLOW' {
|
|
188
|
+
// Trigger full sync batch job
|
|
189
|
+
Database.executeBatch(new FullSyncBatch());
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Replay and Durability
|
|
194
|
+
|
|
195
|
+
### Retention
|
|
196
|
+
|
|
197
|
+
CDC events retained for **3 days** (72 hours).
|
|
198
|
+
|
|
199
|
+
### Replay ID
|
|
200
|
+
|
|
201
|
+
Each event has unique ReplayId for tracking:
|
|
202
|
+
|
|
203
|
+
```apex
|
|
204
|
+
String replayId = event.ReplayId;
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Resume Checkpoint
|
|
208
|
+
|
|
209
|
+
Critical for durability:
|
|
210
|
+
|
|
211
|
+
```apex
|
|
212
|
+
// Always set checkpoint at end of trigger
|
|
213
|
+
EventBus.TriggerContext.currentContext().setResumeCheckpoint(lastReplayId);
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
If trigger fails after checkpoint, processing resumes from that point.
|
|
217
|
+
|
|
218
|
+
## External Sync Pattern
|
|
219
|
+
|
|
220
|
+
```apex
|
|
221
|
+
public class AccountCDCHandler {
|
|
222
|
+
|
|
223
|
+
public static void syncToExternal(AccountChangeEvent event) {
|
|
224
|
+
EventBus.ChangeEventHeader header = event.ChangeEventHeader;
|
|
225
|
+
|
|
226
|
+
Map<String, Object> payload = new Map<String, Object>{
|
|
227
|
+
'recordIds' => header.getRecordIds(),
|
|
228
|
+
'operation' => header.getChangeType(),
|
|
229
|
+
'timestamp' => header.getCommitTimestamp(),
|
|
230
|
+
'changedFields' => header.getChangedFields()
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
// Add field values for CREATE/UPDATE
|
|
234
|
+
if (header.getChangeType() != 'DELETE') {
|
|
235
|
+
payload.put('name', event.Name);
|
|
236
|
+
payload.put('accountNumber', event.AccountNumber);
|
|
237
|
+
// Add relevant fields
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Queue async callout
|
|
241
|
+
System.enqueueJob(new ExternalSyncJob(payload));
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## Best Practices
|
|
247
|
+
|
|
248
|
+
### DO
|
|
249
|
+
|
|
250
|
+
1. **Set resume checkpoint** in every trigger
|
|
251
|
+
2. **Filter by relevant fields** to reduce noise
|
|
252
|
+
3. **Handle all change types** including GAPs
|
|
253
|
+
4. **Process idempotently** (events may replay)
|
|
254
|
+
5. **Use async** for external callouts
|
|
255
|
+
6. **Log changes** for debugging
|
|
256
|
+
|
|
257
|
+
### DON'T
|
|
258
|
+
|
|
259
|
+
1. **Don't throw exceptions** - catch and log
|
|
260
|
+
2. **Don't ignore GAP events** - they indicate data loss
|
|
261
|
+
3. **Don't assume single record** - batch DML creates multi-record events
|
|
262
|
+
4. **Don't block on external calls** - use Queueable
|
|
263
|
+
|
|
264
|
+
## Monitoring
|
|
265
|
+
|
|
266
|
+
### Event Delivery
|
|
267
|
+
|
|
268
|
+
Check for failures in:
|
|
269
|
+
- Setup → Platform Events → Monitor
|
|
270
|
+
- Debug logs for triggers
|
|
271
|
+
|
|
272
|
+
### Common Issues
|
|
273
|
+
|
|
274
|
+
| Issue | Cause | Solution |
|
|
275
|
+
|-------|-------|----------|
|
|
276
|
+
| Missing events | No CDC enabled | Enable in Setup |
|
|
277
|
+
| Duplicate processing | No idempotency | Check transactionKey |
|
|
278
|
+
| GAP events | Processing too slow | Optimize trigger, scale out |
|
|
279
|
+
| Timeout | Heavy processing | Move to async |
|
|
280
|
+
|
|
281
|
+
## Limits
|
|
282
|
+
|
|
283
|
+
| Limit | Value |
|
|
284
|
+
|-------|-------|
|
|
285
|
+
| Objects per org | 100 |
|
|
286
|
+
| Events per 15 minutes | Varies by edition |
|
|
287
|
+
| Event retention | 3 days (72 hours) |
|
|
288
|
+
| Replay window | 3 days |
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
<!-- Parent: building-sf-integrations/SKILL.md -->
|
|
2
|
+
|
|
3
|
+
# CLI Commands & Helper Scripts
|
|
4
|
+
|
|
5
|
+
## Named Credentials
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# List Named Credentials
|
|
9
|
+
sf org list metadata --metadata-type NamedCredential --target-org {{alias}}
|
|
10
|
+
|
|
11
|
+
# Deploy Named Credential
|
|
12
|
+
sf project deploy start --metadata NamedCredential:{{Name}} --target-org {{alias}}
|
|
13
|
+
|
|
14
|
+
# Retrieve Named Credential
|
|
15
|
+
sf project retrieve start --metadata NamedCredential:{{Name}} --target-org {{alias}}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## External Services
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# List External Service Registrations
|
|
22
|
+
sf org list metadata --metadata-type ExternalServiceRegistration --target-org {{alias}}
|
|
23
|
+
|
|
24
|
+
# Deploy External Service
|
|
25
|
+
sf project deploy start --metadata ExternalServiceRegistration:{{Name}} --target-org {{alias}}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Platform Events
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# List Platform Events
|
|
32
|
+
sf org list metadata --metadata-type CustomObject --target-org {{alias}} | grep "__e"
|
|
33
|
+
|
|
34
|
+
# Deploy Platform Event
|
|
35
|
+
sf project deploy start --metadata CustomObject:{{EventName}}__e --target-org {{alias}}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## API Requests (Beta)
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# REST API request
|
|
42
|
+
sf api request rest /services/data/v66.0/sobjects/Account/describe --target-org {{alias}}
|
|
43
|
+
|
|
44
|
+
# REST with POST body
|
|
45
|
+
sf api request rest /services/data/v66.0/sobjects/Account --method POST \
|
|
46
|
+
--body '{"Name":"Test Account"}' --target-org {{alias}}
|
|
47
|
+
|
|
48
|
+
# GraphQL query
|
|
49
|
+
sf api request graphql --body '{"query":"{ uiapi { query { Account { edges { node { Name { value } } } } } } }"}' --target-org {{alias}}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
> **[Beta]** These commands simplify API exploration. For production, use Named Credentials and Apex callouts.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Helper Scripts
|
|
57
|
+
|
|
58
|
+
building-sf-integrations includes automation scripts to configure credentials without manual UI steps.
|
|
59
|
+
|
|
60
|
+
### Available Scripts
|
|
61
|
+
|
|
62
|
+
| Script | Purpose | Usage |
|
|
63
|
+
|--------|---------|-------|
|
|
64
|
+
| `configure-named-credential.sh` | Set API keys via ConnectApi (Enhanced NC) | `./scripts/configure-named-credential.sh <org-alias>` |
|
|
65
|
+
| `set-api-credential.sh` | Store keys in Custom Settings (legacy) | `./scripts/set-api-credential.sh <name> - <org-alias>` |
|
|
66
|
+
|
|
67
|
+
### Auto-Run Behavior
|
|
68
|
+
|
|
69
|
+
| File Pattern | Suggested Action |
|
|
70
|
+
|--------------|------------------|
|
|
71
|
+
| `*.namedCredential-meta.xml` | Run `configure-named-credential.sh` |
|
|
72
|
+
| `*.externalCredential-meta.xml` | Run `configure-named-credential.sh` |
|
|
73
|
+
| `*.cspTrustedSite-meta.xml` | Deploy endpoint security |
|
|
74
|
+
|
|
75
|
+
### Example Workflow
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# 1. Deploy metadata first
|
|
79
|
+
sf project deploy start --metadata ExternalCredential:WeatherAPI \
|
|
80
|
+
--metadata NamedCredential:WeatherAPI \
|
|
81
|
+
--target-org MyOrg
|
|
82
|
+
|
|
83
|
+
# 2. Run automation script
|
|
84
|
+
./scripts/configure-named-credential.sh MyOrg
|
|
85
|
+
# Enter API key when prompted (secure, hidden input)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Prerequisites
|
|
89
|
+
|
|
90
|
+
- **Salesforce CLI v2+**: `sf` command available
|
|
91
|
+
- **Authenticated org**: `sf org login web -a <alias>`
|
|
92
|
+
- **Deployed metadata**: External Credential and Named Credential deployed
|
|
93
|
+
|
|
94
|
+
See [references/named-credentials-automation.md](../references/named-credentials-automation.md) for complete guide.
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
<!-- Parent: building-sf-integrations/SKILL.md -->
|
|
2
|
+
# Event-Driven Architecture Guide
|
|
3
|
+
|
|
4
|
+
> **Source**: Salesforce Architect Decision Guides — Event-Driven Architecture, Async Processing
|
|
5
|
+
> **Related**: [event-patterns.md](./event-patterns.md) | [callout-patterns.md](./callout-patterns.md)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
Event-Driven Architecture (EDA) decouples producers from consumers, enabling scalable, resilient integrations. Salesforce supports multiple event mechanisms — choosing the right one depends on volume, latency, and consumer location.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 5 Core EDA Patterns
|
|
16
|
+
|
|
17
|
+
### Pattern Comparison Matrix
|
|
18
|
+
|
|
19
|
+
| Pattern | Description | Salesforce Implementation | Best For |
|
|
20
|
+
|---------|-------------|--------------------------|----------|
|
|
21
|
+
| **Pub/Sub** | Publisher emits, multiple subscribers consume | Platform Events + Pub/Sub API | Multi-consumer notifications, cross-system sync |
|
|
22
|
+
| **Fanout** | One event → multiple independent consumers | Platform Events + multiple subscribers | Parallel processing, diverse downstream systems |
|
|
23
|
+
| **Passed Messages** | Event carries data payload for consumer processing | Platform Events with rich fields | External systems needing full context in message |
|
|
24
|
+
| **Streaming** | Continuous data feed for real-time consumers | CDC + Pub/Sub API | Data replication, real-time dashboards |
|
|
25
|
+
| **Queueing** | Ordered, guaranteed-delivery message processing | Platform Events (High-Volume) with checkpoints | Sequential processing, backpressure handling |
|
|
26
|
+
|
|
27
|
+
### When to Use Each
|
|
28
|
+
|
|
29
|
+
**Pub/Sub**: Default choice for most event-driven integrations. Works for both internal (Apex triggers) and external (Pub/Sub API) consumers.
|
|
30
|
+
|
|
31
|
+
**Fanout**: When a single business event (e.g., "Order Placed") needs to notify billing, shipping, analytics, and notifications simultaneously.
|
|
32
|
+
|
|
33
|
+
**Passed Messages**: When the consumer needs all context in the event itself (no callback to Salesforce). Keep payloads lean — 1 MB limit.
|
|
34
|
+
|
|
35
|
+
**Streaming**: For data replication to warehouses or lakes. CDC + Pub/Sub API replaces legacy Streaming API.
|
|
36
|
+
|
|
37
|
+
**Queueing**: When processing order matters and you need backpressure handling. Use High-Volume Platform Events with resume checkpoints.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Pub/Sub API (Recommended External Subscription)
|
|
42
|
+
|
|
43
|
+
The Pub/Sub API is the **recommended mechanism for external consumers** subscribing to Platform Events and CDC events. It replaces the legacy Streaming API (CometD).
|
|
44
|
+
|
|
45
|
+
### Key Characteristics
|
|
46
|
+
|
|
47
|
+
| Feature | Pub/Sub API | Legacy Streaming API (Deprecated) |
|
|
48
|
+
|---------|-------------|----------------------------------|
|
|
49
|
+
| **Protocol** | gRPC | CometD (long-polling) |
|
|
50
|
+
| **Authentication** | OAuth 2.0 | Session-based |
|
|
51
|
+
| **Event Types** | Platform Events, CDC, Custom Channels | PushTopic, Generic Events, Platform Events |
|
|
52
|
+
| **Performance** | High throughput, binary protocol | Limited by long-polling overhead |
|
|
53
|
+
| **Status** | **Current — use for all new development** | Deprecated — no new investments |
|
|
54
|
+
|
|
55
|
+
### Subscription Modes
|
|
56
|
+
|
|
57
|
+
- **Subscribe**: Stream events from a given replay ID forward
|
|
58
|
+
- **PublishStream**: Bi-directional — publish events via gRPC (no Apex needed)
|
|
59
|
+
- **ManagedSubscribe**: Salesforce manages replay state (simplest for external consumers)
|
|
60
|
+
|
|
61
|
+
### External Consumer Architecture
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
Salesforce Org
|
|
65
|
+
└── Platform Event / CDC Event
|
|
66
|
+
└── Pub/Sub API (gRPC endpoint)
|
|
67
|
+
└── External Consumer (Java, Python, Node.js, Go)
|
|
68
|
+
├── Process event
|
|
69
|
+
├── Commit replay ID
|
|
70
|
+
└── Handle failures with retry
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### LWC Subscription (Internal)
|
|
74
|
+
|
|
75
|
+
For Lightning Web Components subscribing to Platform Events, use **empApi**:
|
|
76
|
+
|
|
77
|
+
```javascript
|
|
78
|
+
import { subscribe, unsubscribe, onError } from 'lightning/empApi';
|
|
79
|
+
|
|
80
|
+
const channelName = '/event/Order_Status__e';
|
|
81
|
+
let subscription = {};
|
|
82
|
+
|
|
83
|
+
connectedCallback() {
|
|
84
|
+
subscribe(channelName, -1, (response) => {
|
|
85
|
+
console.log('Event received:', JSON.stringify(response));
|
|
86
|
+
this.handleEvent(response.data.payload);
|
|
87
|
+
}).then((sub) => {
|
|
88
|
+
subscription = sub;
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
onError((error) => {
|
|
92
|
+
console.error('empApi error:', JSON.stringify(error));
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
disconnectedCallback() {
|
|
97
|
+
unsubscribe(subscription);
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Event Relays to AWS EventBridge
|
|
104
|
+
|
|
105
|
+
Salesforce Event Relays forward Platform Events to AWS EventBridge, enabling cloud-native event processing.
|
|
106
|
+
|
|
107
|
+
### Architecture
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
Salesforce Platform Event
|
|
111
|
+
└── Event Relay Definition (Metadata)
|
|
112
|
+
└── AWS EventBridge Partner Event Source
|
|
113
|
+
├── AWS Lambda
|
|
114
|
+
├── AWS SQS
|
|
115
|
+
├── AWS Step Functions
|
|
116
|
+
└── Any EventBridge target
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### When to Use
|
|
120
|
+
|
|
121
|
+
- AWS-native architecture needing Salesforce events
|
|
122
|
+
- Complex event processing requiring AWS services (Step Functions, SQS, SNS)
|
|
123
|
+
- Fan-out to multiple AWS consumers from a single Salesforce event
|
|
124
|
+
- Event archival in AWS S3 or data lakes
|
|
125
|
+
|
|
126
|
+
### Limitations
|
|
127
|
+
|
|
128
|
+
- One-way only (Salesforce → AWS)
|
|
129
|
+
- Adds latency (~seconds) compared to direct Pub/Sub API
|
|
130
|
+
- Requires AWS account configuration and IAM setup
|
|
131
|
+
- Platform Event limits still apply on the Salesforce side
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Apache Kafka on Heroku
|
|
136
|
+
|
|
137
|
+
For organizations needing long-retention, high-throughput event streaming beyond Platform Event limits.
|
|
138
|
+
|
|
139
|
+
### Comparison with Platform Events
|
|
140
|
+
|
|
141
|
+
| Feature | Platform Events | Kafka on Heroku |
|
|
142
|
+
|---------|----------------|-----------------|
|
|
143
|
+
| **Retention** | 24h (HV) / 72h (SV) | 1-6 weeks (configurable) |
|
|
144
|
+
| **Throughput** | Millions/day (HV) | Millions/second |
|
|
145
|
+
| **Consumer groups** | Limited | Unlimited |
|
|
146
|
+
| **Replay** | ReplayId-based | Offset-based, topic-level |
|
|
147
|
+
| **Cost** | Included / Platform Event add-on | Heroku Kafka add-on |
|
|
148
|
+
|
|
149
|
+
### When to Choose Kafka
|
|
150
|
+
|
|
151
|
+
- Retention > 72 hours required
|
|
152
|
+
- Need multiple independent consumer groups
|
|
153
|
+
- Event throughput exceeds Platform Event limits
|
|
154
|
+
- Existing Kafka ecosystem in organization
|
|
155
|
+
- Need topic partitioning for ordered processing
|
|
156
|
+
|
|
157
|
+
### Integration Pattern
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
Salesforce → Platform Event → Apex/Flow subscriber → Heroku Kafka producer
|
|
161
|
+
└── Consumer Group A (analytics)
|
|
162
|
+
└── Consumer Group B (data lake)
|
|
163
|
+
└── Consumer Group C (external CRM)
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## When NOT to Use Events
|
|
169
|
+
|
|
170
|
+
Events are not always the right choice. Prefer synchronous patterns when:
|
|
171
|
+
|
|
172
|
+
| Scenario | Why Not Events | Better Alternative |
|
|
173
|
+
|----------|---------------|-------------------|
|
|
174
|
+
| **Need synchronous response** | Events are async — no return value | REST callout with Named Credential |
|
|
175
|
+
| **Infrequent data changes** | Event infrastructure overhead not justified | Scheduled batch sync |
|
|
176
|
+
| **Target system lacks event support** | Consumer can't subscribe to events | Outbound Messages or REST callout |
|
|
177
|
+
| **Simple record sync** | Over-engineering for basic needs | Salesforce Connect / External Objects |
|
|
178
|
+
| **Data volume < 100 records/day** | Platform Event overhead unnecessary | Scheduled Flow with REST callout |
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## High-Volume Outbound Pattern
|
|
183
|
+
|
|
184
|
+
For scenarios requiring high-volume data push to external systems:
|
|
185
|
+
|
|
186
|
+
> **Do NOT use async Apex directly for high-volume outbound.** Apex async limits (250K daily Queueable, 250K daily @future) are shared across all org operations. Consuming them for outbound sync starves other automation.
|
|
187
|
+
|
|
188
|
+
### Recommended Pattern: Middleware + Platform Events
|
|
189
|
+
|
|
190
|
+
```
|
|
191
|
+
Salesforce Record Change
|
|
192
|
+
└── After-Save Flow / Trigger
|
|
193
|
+
└── Publish Platform Event (lightweight payload)
|
|
194
|
+
└── External Middleware (MuleSoft, Pub/Sub API consumer)
|
|
195
|
+
├── Enrich data (callback to Salesforce REST API if needed)
|
|
196
|
+
├── Transform to target format
|
|
197
|
+
├── Deliver to target system with retry logic
|
|
198
|
+
└── Report status back via Platform Event or REST callback
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Benefits
|
|
202
|
+
|
|
203
|
+
- **No Apex async limit consumption** — events don't count against daily limits
|
|
204
|
+
- **Middleware handles retries** — exponential backoff, dead letter queues
|
|
205
|
+
- **Scalable** — middleware scales independently of Salesforce
|
|
206
|
+
- **Observable** — middleware provides logging, monitoring, alerting
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## Monitoring Event-Driven Systems
|
|
211
|
+
|
|
212
|
+
### AsyncApexJob Monitoring
|
|
213
|
+
|
|
214
|
+
Query job status for async Apex that processes events:
|
|
215
|
+
|
|
216
|
+
```apex
|
|
217
|
+
List<AsyncApexJob> jobs = [
|
|
218
|
+
SELECT Id, JobType, Status, NumberOfErrors, MethodName, CreatedDate
|
|
219
|
+
FROM AsyncApexJob
|
|
220
|
+
WHERE CreatedDate = TODAY
|
|
221
|
+
AND Status IN ('Failed', 'Aborted')
|
|
222
|
+
ORDER BY CreatedDate DESC
|
|
223
|
+
LIMIT 50
|
|
224
|
+
];
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
> **Polling limit**: AsyncApexJob queries are subject to SOQL limits. Max polling frequency: every 5 minutes.
|
|
228
|
+
|
|
229
|
+
### Platform Event Metrics
|
|
230
|
+
|
|
231
|
+
- **Setup → Platform Events → Usage**: View publish/subscribe counts
|
|
232
|
+
- **EventBusSubscriber**: Query for subscriber status and position
|
|
233
|
+
- **Proactive Monitoring**: Set up Flow or Apex to alert on failed event processing
|
|
234
|
+
|
|
235
|
+
```apex
|
|
236
|
+
// Check subscriber lag
|
|
237
|
+
List<EventBusSubscriber> subs = [
|
|
238
|
+
SELECT Name, Position, Retries, LastError, Status
|
|
239
|
+
FROM EventBusSubscriber
|
|
240
|
+
WHERE Topic = 'Order_Status__e'
|
|
241
|
+
];
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### Key Metrics to Monitor
|
|
245
|
+
|
|
246
|
+
| Metric | Source | Alert Threshold |
|
|
247
|
+
|--------|--------|-----------------|
|
|
248
|
+
| Failed events | `EventBusSubscriber.Retries` | > 3 consecutive retries |
|
|
249
|
+
| Subscriber lag | `EventBusSubscriber.Position` vs latest ReplayId | Lag > 1000 events |
|
|
250
|
+
| Async job failures | `AsyncApexJob.NumberOfErrors` | Any failure |
|
|
251
|
+
| Event publish errors | `Database.SaveResult` in publisher | Any failure |
|
|
252
|
+
| Daily event usage | Setup → Company Information → Platform Event Usage | > 80% of allocation |
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## Summary: EDA Decision Tree
|
|
257
|
+
|
|
258
|
+
```
|
|
259
|
+
Need real-time data sync?
|
|
260
|
+
├── YES → Is consumer external?
|
|
261
|
+
│ ├── YES → Pub/Sub API + Platform Events (or CDC for record changes)
|
|
262
|
+
│ └── NO → Platform Event trigger subscriber (or empApi for LWC)
|
|
263
|
+
└── NO → Is volume high (>10K records/day)?
|
|
264
|
+
├── YES → Middleware + Platform Events (high-volume outbound pattern)
|
|
265
|
+
└── NO → Scheduled batch sync (simplest, most maintainable)
|
|
266
|
+
```
|