@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,71 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!--
|
|
3
|
+
Named Credential Template: Custom Authentication (API Key / Basic Auth)
|
|
4
|
+
|
|
5
|
+
Use Case: Simple APIs with API key or username/password
|
|
6
|
+
- Internal APIs
|
|
7
|
+
- Legacy systems
|
|
8
|
+
- APIs with simple authentication
|
|
9
|
+
- Development/testing environments
|
|
10
|
+
|
|
11
|
+
Authentication Types:
|
|
12
|
+
- Basic Auth: Username + Password in Authorization header
|
|
13
|
+
- API Key: Custom header with API key value
|
|
14
|
+
|
|
15
|
+
Setup Steps:
|
|
16
|
+
1. Replace all {{placeholder}} values
|
|
17
|
+
2. Deploy to org
|
|
18
|
+
3. Enter credentials via Setup → Named Credentials UI
|
|
19
|
+
|
|
20
|
+
File Location: force-app/main/default/namedCredentials/{{CredentialName}}.namedCredential-meta.xml
|
|
21
|
+
-->
|
|
22
|
+
<NamedCredential xmlns="http://soap.sforce.com/2006/04/metadata">
|
|
23
|
+
<fullName>{{CredentialName}}</fullName>
|
|
24
|
+
<label>{{CredentialLabel}}</label>
|
|
25
|
+
|
|
26
|
+
<!-- Base URL for the external service -->
|
|
27
|
+
<endpoint>{{BaseEndpoint}}</endpoint>
|
|
28
|
+
|
|
29
|
+
<!--
|
|
30
|
+
Authentication Configuration
|
|
31
|
+
|
|
32
|
+
For Basic Auth:
|
|
33
|
+
- principalType: NamedUser
|
|
34
|
+
- protocol: Password
|
|
35
|
+
- generateAuthorizationHeader: true
|
|
36
|
+
|
|
37
|
+
For API Key (via custom header):
|
|
38
|
+
- principalType: Anonymous
|
|
39
|
+
- protocol: NoAuthentication
|
|
40
|
+
- Use calloutOptions or Apex to add header
|
|
41
|
+
-->
|
|
42
|
+
<principalType>NamedUser</principalType>
|
|
43
|
+
<protocol>Password</protocol>
|
|
44
|
+
|
|
45
|
+
<!--
|
|
46
|
+
Username for Basic Auth
|
|
47
|
+
Password is entered via UI after deployment (NOT stored in metadata)
|
|
48
|
+
-->
|
|
49
|
+
<username>{{Username}}</username>
|
|
50
|
+
|
|
51
|
+
<!-- Request Options -->
|
|
52
|
+
<generateAuthorizationHeader>true</generateAuthorizationHeader>
|
|
53
|
+
<allowMergeFieldsInBody>true</allowMergeFieldsInBody>
|
|
54
|
+
<allowMergeFieldsInHeader>true</allowMergeFieldsInHeader>
|
|
55
|
+
|
|
56
|
+
<!--
|
|
57
|
+
SECURITY WARNING:
|
|
58
|
+
- Password is stored securely by Salesforce, NOT in this file
|
|
59
|
+
- After deployment, configure password via:
|
|
60
|
+
Setup → Named Credentials → Edit → Enter Password
|
|
61
|
+
- Never commit passwords to source control
|
|
62
|
+
|
|
63
|
+
For API Key pattern (in Apex):
|
|
64
|
+
|
|
65
|
+
HttpRequest req = new HttpRequest();
|
|
66
|
+
req.setEndpoint('callout:{{CredentialName}}/endpoint');
|
|
67
|
+
req.setHeader('X-API-Key', '{!$Credential.Password}');
|
|
68
|
+
|
|
69
|
+
Or use External Credentials (API 61+) with Custom headers for cleaner API key handling.
|
|
70
|
+
-->
|
|
71
|
+
</NamedCredential>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!--
|
|
3
|
+
Named Credential Template: OAuth 2.0 Client Credentials Flow
|
|
4
|
+
|
|
5
|
+
Use Case: Server-to-server integration without user context
|
|
6
|
+
- Machine-to-machine authentication
|
|
7
|
+
- Backend service integrations
|
|
8
|
+
- Scheduled jobs calling external APIs
|
|
9
|
+
|
|
10
|
+
Setup Steps:
|
|
11
|
+
1. Replace all {{placeholder}} values
|
|
12
|
+
2. Create corresponding Auth Provider if using OAuth
|
|
13
|
+
3. Deploy to org
|
|
14
|
+
4. Store client credentials in Setup → Named Credentials
|
|
15
|
+
|
|
16
|
+
File Location: force-app/main/default/namedCredentials/{{CredentialName}}.namedCredential-meta.xml
|
|
17
|
+
-->
|
|
18
|
+
<NamedCredential xmlns="http://soap.sforce.com/2006/04/metadata">
|
|
19
|
+
<fullName>{{CredentialName}}</fullName>
|
|
20
|
+
<label>{{CredentialLabel}}</label>
|
|
21
|
+
|
|
22
|
+
<!-- Base URL for the external service (without trailing slash) -->
|
|
23
|
+
<endpoint>{{BaseEndpoint}}</endpoint>
|
|
24
|
+
|
|
25
|
+
<!-- Authentication Configuration -->
|
|
26
|
+
<principalType>NamedUser</principalType>
|
|
27
|
+
<protocol>Oauth</protocol>
|
|
28
|
+
|
|
29
|
+
<!-- OAuth Settings -->
|
|
30
|
+
<!-- Token endpoint where Salesforce requests access tokens -->
|
|
31
|
+
<oauthTokenEndpoint>{{TokenEndpoint}}</oauthTokenEndpoint>
|
|
32
|
+
|
|
33
|
+
<!-- Space-separated OAuth scopes (e.g., "read write") -->
|
|
34
|
+
<oauthScope>{{Scopes}}</oauthScope>
|
|
35
|
+
|
|
36
|
+
<!-- Auth Provider reference (create this first in Setup → Auth Providers) -->
|
|
37
|
+
<!-- <authProvider>{{AuthProviderName}}</authProvider> -->
|
|
38
|
+
|
|
39
|
+
<!-- Request Options -->
|
|
40
|
+
<generateAuthorizationHeader>true</generateAuthorizationHeader>
|
|
41
|
+
<allowMergeFieldsInBody>true</allowMergeFieldsInBody>
|
|
42
|
+
<allowMergeFieldsInHeader>true</allowMergeFieldsInHeader>
|
|
43
|
+
|
|
44
|
+
<!--
|
|
45
|
+
Client ID and Secret are stored via UI, NOT in metadata for security.
|
|
46
|
+
After deployment:
|
|
47
|
+
1. Go to Setup → Named Credentials
|
|
48
|
+
2. Edit the credential
|
|
49
|
+
3. Enter Client ID and Client Secret
|
|
50
|
+
-->
|
|
51
|
+
</NamedCredential>
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!--
|
|
3
|
+
Named Credential Template: OAuth 2.0 JWT Bearer Flow
|
|
4
|
+
|
|
5
|
+
Use Case: Server-to-server with certificate-based authentication
|
|
6
|
+
- CI/CD pipelines
|
|
7
|
+
- Backend service integrations
|
|
8
|
+
- Automated jobs requiring strong authentication
|
|
9
|
+
|
|
10
|
+
Prerequisites:
|
|
11
|
+
1. Create certificate in Setup → Certificate and Key Management
|
|
12
|
+
2. Create Connected App with JWT Bearer enabled
|
|
13
|
+
3. Upload public certificate to external system
|
|
14
|
+
4. Pre-authorize Connected App for users
|
|
15
|
+
|
|
16
|
+
Setup Steps:
|
|
17
|
+
1. Replace all {{placeholder}} values
|
|
18
|
+
2. Ensure certificate is uploaded
|
|
19
|
+
3. Configure Connected App for JWT
|
|
20
|
+
4. Deploy to org
|
|
21
|
+
|
|
22
|
+
File Location: force-app/main/default/namedCredentials/{{CredentialName}}.namedCredential-meta.xml
|
|
23
|
+
-->
|
|
24
|
+
<NamedCredential xmlns="http://soap.sforce.com/2006/04/metadata">
|
|
25
|
+
<fullName>{{CredentialName}}</fullName>
|
|
26
|
+
<label>{{CredentialLabel}}</label>
|
|
27
|
+
|
|
28
|
+
<!-- Base URL for the external service -->
|
|
29
|
+
<endpoint>{{BaseEndpoint}}</endpoint>
|
|
30
|
+
|
|
31
|
+
<!-- Authentication Configuration -->
|
|
32
|
+
<principalType>NamedUser</principalType>
|
|
33
|
+
<protocol>Oauth</protocol>
|
|
34
|
+
|
|
35
|
+
<!-- JWT Bearer Settings -->
|
|
36
|
+
<oauthTokenEndpoint>{{TokenEndpoint}}</oauthTokenEndpoint>
|
|
37
|
+
<oauthScope>{{Scopes}}</oauthScope>
|
|
38
|
+
|
|
39
|
+
<!--
|
|
40
|
+
Certificate for signing JWT assertions
|
|
41
|
+
Must exist in Setup → Certificate and Key Management
|
|
42
|
+
-->
|
|
43
|
+
<certificate>{{CertificateName}}</certificate>
|
|
44
|
+
|
|
45
|
+
<!-- Auth Provider (configure for JWT Bearer) -->
|
|
46
|
+
<!-- <authProvider>{{AuthProviderName}}</authProvider> -->
|
|
47
|
+
|
|
48
|
+
<!-- Request Options -->
|
|
49
|
+
<generateAuthorizationHeader>true</generateAuthorizationHeader>
|
|
50
|
+
<allowMergeFieldsInBody>true</allowMergeFieldsInBody>
|
|
51
|
+
<allowMergeFieldsInHeader>true</allowMergeFieldsInHeader>
|
|
52
|
+
|
|
53
|
+
<!--
|
|
54
|
+
JWT Bearer Flow Details:
|
|
55
|
+
1. Salesforce creates JWT assertion signed with certificate
|
|
56
|
+
2. JWT is sent to token endpoint
|
|
57
|
+
3. External system validates signature
|
|
58
|
+
4. Access token returned
|
|
59
|
+
5. Access token used for API calls
|
|
60
|
+
|
|
61
|
+
JWT Claims (automatically generated):
|
|
62
|
+
- iss: Client ID
|
|
63
|
+
- sub: Username (for SF-to-SF) or service account
|
|
64
|
+
- aud: Token endpoint
|
|
65
|
+
- exp: Expiration timestamp
|
|
66
|
+
-->
|
|
67
|
+
</NamedCredential>
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Platform Event Publisher for {{EventName}}__e
|
|
3
|
+
*
|
|
4
|
+
* Use Case: Publish events from Apex
|
|
5
|
+
* - Trigger-based event publishing
|
|
6
|
+
* - Service layer event notifications
|
|
7
|
+
* - Batch job completion events
|
|
8
|
+
*
|
|
9
|
+
* Features:
|
|
10
|
+
* - Single and bulk event publishing
|
|
11
|
+
* - Error handling and logging
|
|
12
|
+
* - Partial success handling for bulk publishes
|
|
13
|
+
*
|
|
14
|
+
* @author {{Author}}
|
|
15
|
+
* @date {{Date}}
|
|
16
|
+
*/
|
|
17
|
+
public with sharing class {{EventName}}Publisher {
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @description Publish a single event
|
|
21
|
+
* @param recordId ID of the triggering record
|
|
22
|
+
* @param operation Operation type (CREATE, UPDATE, DELETE)
|
|
23
|
+
* @param payload JSON payload data
|
|
24
|
+
* @throws EventPublishException if publish fails
|
|
25
|
+
*/
|
|
26
|
+
public static void publishEvent(Id recordId, String operation, Map<String, Object> payload) {
|
|
27
|
+
{{EventName}}__e event = new {{EventName}}__e();
|
|
28
|
+
event.Record_Id__c = recordId;
|
|
29
|
+
event.Operation__c = operation;
|
|
30
|
+
event.Payload__c = JSON.serialize(payload);
|
|
31
|
+
event.Correlation_Id__c = generateCorrelationId();
|
|
32
|
+
event.Event_Timestamp__c = Datetime.now();
|
|
33
|
+
|
|
34
|
+
Database.SaveResult result = EventBus.publish(event);
|
|
35
|
+
|
|
36
|
+
if (!result.isSuccess()) {
|
|
37
|
+
String errorMessage = getErrorMessage(result);
|
|
38
|
+
System.debug(LoggingLevel.ERROR, 'Event publish failed: ' + errorMessage);
|
|
39
|
+
throw new EventPublishException('Failed to publish event: ' + errorMessage);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
System.debug(LoggingLevel.DEBUG, 'Event published successfully. Correlation ID: ' + event.Correlation_Id__c);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @description Publish multiple events in bulk
|
|
47
|
+
* @param events List of events to publish
|
|
48
|
+
* @return List of publish results
|
|
49
|
+
*/
|
|
50
|
+
public static List<PublishResult> publishEvents(List<{{EventName}}__e> events) {
|
|
51
|
+
if (events == null || events.isEmpty()) {
|
|
52
|
+
return new List<PublishResult>();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Ensure correlation IDs and timestamps
|
|
56
|
+
for ({{EventName}}__e event : events) {
|
|
57
|
+
if (String.isBlank(event.Correlation_Id__c)) {
|
|
58
|
+
event.Correlation_Id__c = generateCorrelationId();
|
|
59
|
+
}
|
|
60
|
+
if (event.Event_Timestamp__c == null) {
|
|
61
|
+
event.Event_Timestamp__c = Datetime.now();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
List<Database.SaveResult> results = EventBus.publish(events);
|
|
66
|
+
|
|
67
|
+
List<PublishResult> publishResults = new List<PublishResult>();
|
|
68
|
+
for (Integer i = 0; i < results.size(); i++) {
|
|
69
|
+
Database.SaveResult sr = results[i];
|
|
70
|
+
{{EventName}}__e event = events[i];
|
|
71
|
+
|
|
72
|
+
PublishResult pr = new PublishResult();
|
|
73
|
+
pr.correlationId = event.Correlation_Id__c;
|
|
74
|
+
pr.success = sr.isSuccess();
|
|
75
|
+
|
|
76
|
+
if (!sr.isSuccess()) {
|
|
77
|
+
pr.errorMessage = getErrorMessage(sr);
|
|
78
|
+
System.debug(LoggingLevel.ERROR,
|
|
79
|
+
'Event publish failed for correlation ' + pr.correlationId + ': ' + pr.errorMessage);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
publishResults.add(pr);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return publishResults;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @description Publish events for record changes (use in triggers)
|
|
90
|
+
* @param records Changed records
|
|
91
|
+
* @param operation Operation type
|
|
92
|
+
*/
|
|
93
|
+
public static void publishForRecords(List<SObject> records, String operation) {
|
|
94
|
+
if (records == null || records.isEmpty()) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
List<{{EventName}}__e> events = new List<{{EventName}}__e>();
|
|
99
|
+
|
|
100
|
+
for (SObject record : records) {
|
|
101
|
+
{{EventName}}__e event = new {{EventName}}__e();
|
|
102
|
+
event.Record_Id__c = record.Id;
|
|
103
|
+
event.Operation__c = operation;
|
|
104
|
+
event.Payload__c = JSON.serialize(record);
|
|
105
|
+
event.Correlation_Id__c = generateCorrelationId();
|
|
106
|
+
event.Event_Timestamp__c = Datetime.now();
|
|
107
|
+
events.add(event);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
List<PublishResult> results = publishEvents(events);
|
|
111
|
+
|
|
112
|
+
// Log any failures
|
|
113
|
+
for (PublishResult pr : results) {
|
|
114
|
+
if (!pr.success) {
|
|
115
|
+
System.debug(LoggingLevel.ERROR, 'Publish failed: ' + pr.errorMessage);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* @description Create event from Map (flexible payload)
|
|
122
|
+
* @param eventData Map containing event fields
|
|
123
|
+
* @return Constructed event
|
|
124
|
+
*/
|
|
125
|
+
public static {{EventName}}__e createEvent(Map<String, Object> eventData) {
|
|
126
|
+
{{EventName}}__e event = new {{EventName}}__e();
|
|
127
|
+
|
|
128
|
+
if (eventData.containsKey('recordId')) {
|
|
129
|
+
event.Record_Id__c = (String) eventData.get('recordId');
|
|
130
|
+
}
|
|
131
|
+
if (eventData.containsKey('operation')) {
|
|
132
|
+
event.Operation__c = (String) eventData.get('operation');
|
|
133
|
+
}
|
|
134
|
+
if (eventData.containsKey('payload')) {
|
|
135
|
+
Object payload = eventData.get('payload');
|
|
136
|
+
event.Payload__c = payload instanceof String
|
|
137
|
+
? (String) payload
|
|
138
|
+
: JSON.serialize(payload);
|
|
139
|
+
}
|
|
140
|
+
if (eventData.containsKey('correlationId')) {
|
|
141
|
+
event.Correlation_Id__c = (String) eventData.get('correlationId');
|
|
142
|
+
} else {
|
|
143
|
+
event.Correlation_Id__c = generateCorrelationId();
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
event.Event_Timestamp__c = Datetime.now();
|
|
147
|
+
|
|
148
|
+
return event;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* @description Generate unique correlation ID
|
|
153
|
+
* @return UUID-like correlation ID
|
|
154
|
+
*/
|
|
155
|
+
private static String generateCorrelationId() {
|
|
156
|
+
Blob b = Crypto.generateAesKey(128);
|
|
157
|
+
String h = EncodingUtil.convertToHex(b);
|
|
158
|
+
return h.substring(0, 8) + '-' +
|
|
159
|
+
h.substring(8, 12) + '-' +
|
|
160
|
+
h.substring(12, 16) + '-' +
|
|
161
|
+
h.substring(16, 20) + '-' +
|
|
162
|
+
h.substring(20);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* @description Extract error message from SaveResult
|
|
167
|
+
* @param result Database.SaveResult
|
|
168
|
+
* @return Error message string
|
|
169
|
+
*/
|
|
170
|
+
private static String getErrorMessage(Database.SaveResult result) {
|
|
171
|
+
List<String> messages = new List<String>();
|
|
172
|
+
for (Database.Error err : result.getErrors()) {
|
|
173
|
+
messages.add(err.getStatusCode() + ': ' + err.getMessage());
|
|
174
|
+
}
|
|
175
|
+
return String.join(messages, '; ');
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* @description Result wrapper for bulk publish operations
|
|
180
|
+
*/
|
|
181
|
+
public class PublishResult {
|
|
182
|
+
public String correlationId;
|
|
183
|
+
public Boolean success;
|
|
184
|
+
public String errorMessage;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* @description Exception for event publish failures
|
|
189
|
+
*/
|
|
190
|
+
public class EventPublishException extends Exception {}
|
|
191
|
+
}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Platform Event Handler/Action Class for {{EventName}}__e
|
|
3
|
+
*
|
|
4
|
+
* Use Case: Business logic for processing Platform Events
|
|
5
|
+
* - Separated from trigger for testability
|
|
6
|
+
* - TAF-compatible action pattern
|
|
7
|
+
* - Bulkified processing
|
|
8
|
+
*
|
|
9
|
+
* This class is called by the {{EventName}}Subscriber trigger
|
|
10
|
+
* and contains all business logic for event processing.
|
|
11
|
+
*
|
|
12
|
+
* @author {{Author}}
|
|
13
|
+
* @date {{Date}}
|
|
14
|
+
*/
|
|
15
|
+
public with sharing class {{EventName}}Handler {
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @description Handle CREATE operation events
|
|
19
|
+
* @param event The platform event
|
|
20
|
+
*/
|
|
21
|
+
public static void handleCreate({{EventName}}__e event) {
|
|
22
|
+
Map<String, Object> payload = parsePayload(event.Payload__c);
|
|
23
|
+
|
|
24
|
+
// Example: Create a record based on event data
|
|
25
|
+
/*
|
|
26
|
+
{{TargetObject}}__c newRecord = new {{TargetObject}}__c();
|
|
27
|
+
newRecord.Name = (String) payload.get('name');
|
|
28
|
+
newRecord.External_Id__c = event.Record_Id__c;
|
|
29
|
+
newRecord.Source_System__c = 'Platform Event';
|
|
30
|
+
insert newRecord;
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
System.debug(LoggingLevel.DEBUG,
|
|
34
|
+
'Processed CREATE event: ' + event.Correlation_Id__c);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @description Handle UPDATE operation events
|
|
39
|
+
* @param event The platform event
|
|
40
|
+
*/
|
|
41
|
+
public static void handleUpdate({{EventName}}__e event) {
|
|
42
|
+
Map<String, Object> payload = parsePayload(event.Payload__c);
|
|
43
|
+
String recordId = event.Record_Id__c;
|
|
44
|
+
|
|
45
|
+
// Example: Update existing record
|
|
46
|
+
/*
|
|
47
|
+
List<{{TargetObject}}__c> records = [
|
|
48
|
+
SELECT Id, Name
|
|
49
|
+
FROM {{TargetObject}}__c
|
|
50
|
+
WHERE External_Id__c = :recordId
|
|
51
|
+
WITH USER_MODE
|
|
52
|
+
LIMIT 1
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
if (!records.isEmpty()) {
|
|
56
|
+
{{TargetObject}}__c record = records[0];
|
|
57
|
+
record.Name = (String) payload.get('name');
|
|
58
|
+
record.Last_Sync__c = Datetime.now();
|
|
59
|
+
update record;
|
|
60
|
+
}
|
|
61
|
+
*/
|
|
62
|
+
|
|
63
|
+
System.debug(LoggingLevel.DEBUG,
|
|
64
|
+
'Processed UPDATE event: ' + event.Correlation_Id__c);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @description Handle DELETE operation events
|
|
69
|
+
* @param event The platform event
|
|
70
|
+
*/
|
|
71
|
+
public static void handleDelete({{EventName}}__e event) {
|
|
72
|
+
String recordId = event.Record_Id__c;
|
|
73
|
+
|
|
74
|
+
// Example: Delete or archive record
|
|
75
|
+
/*
|
|
76
|
+
List<{{TargetObject}}__c> records = [
|
|
77
|
+
SELECT Id
|
|
78
|
+
FROM {{TargetObject}}__c
|
|
79
|
+
WHERE External_Id__c = :recordId
|
|
80
|
+
WITH USER_MODE
|
|
81
|
+
LIMIT 1
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
if (!records.isEmpty()) {
|
|
85
|
+
delete records;
|
|
86
|
+
}
|
|
87
|
+
*/
|
|
88
|
+
|
|
89
|
+
System.debug(LoggingLevel.DEBUG,
|
|
90
|
+
'Processed DELETE event: ' + event.Correlation_Id__c);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* @description Handle bulk events (for optimized processing)
|
|
95
|
+
* Call this from trigger instead of individual handlers
|
|
96
|
+
* when processing high volumes
|
|
97
|
+
* @param events List of events to process
|
|
98
|
+
*/
|
|
99
|
+
public static void handleBulk(List<{{EventName}}__e> events) {
|
|
100
|
+
// Separate events by operation
|
|
101
|
+
List<{{EventName}}__e> createEvents = new List<{{EventName}}__e>();
|
|
102
|
+
List<{{EventName}}__e> updateEvents = new List<{{EventName}}__e>();
|
|
103
|
+
List<{{EventName}}__e> deleteEvents = new List<{{EventName}}__e>();
|
|
104
|
+
|
|
105
|
+
for ({{EventName}}__e event : events) {
|
|
106
|
+
switch on event.Operation__c {
|
|
107
|
+
when 'CREATE' {
|
|
108
|
+
createEvents.add(event);
|
|
109
|
+
}
|
|
110
|
+
when 'UPDATE' {
|
|
111
|
+
updateEvents.add(event);
|
|
112
|
+
}
|
|
113
|
+
when 'DELETE' {
|
|
114
|
+
deleteEvents.add(event);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Process each operation type in bulk
|
|
120
|
+
if (!createEvents.isEmpty()) {
|
|
121
|
+
handleBulkCreate(createEvents);
|
|
122
|
+
}
|
|
123
|
+
if (!updateEvents.isEmpty()) {
|
|
124
|
+
handleBulkUpdate(updateEvents);
|
|
125
|
+
}
|
|
126
|
+
if (!deleteEvents.isEmpty()) {
|
|
127
|
+
handleBulkDelete(deleteEvents);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* @description Bulk create handler
|
|
133
|
+
* @param events CREATE events
|
|
134
|
+
*/
|
|
135
|
+
private static void handleBulkCreate(List<{{EventName}}__e> events) {
|
|
136
|
+
List<{{TargetObject}}__c> newRecords = new List<{{TargetObject}}__c>();
|
|
137
|
+
|
|
138
|
+
for ({{EventName}}__e event : events) {
|
|
139
|
+
Map<String, Object> payload = parsePayload(event.Payload__c);
|
|
140
|
+
|
|
141
|
+
{{TargetObject}}__c record = new {{TargetObject}}__c();
|
|
142
|
+
// Map fields from payload
|
|
143
|
+
// record.Name = (String) payload.get('name');
|
|
144
|
+
// record.External_Id__c = event.Record_Id__c;
|
|
145
|
+
|
|
146
|
+
newRecords.add(record);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (!newRecords.isEmpty()) {
|
|
150
|
+
// Use Database.insert for partial success handling
|
|
151
|
+
Database.SaveResult[] results = Database.insert(newRecords, false);
|
|
152
|
+
logDmlResults(results, 'CREATE');
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* @description Bulk update handler
|
|
158
|
+
* @param events UPDATE events
|
|
159
|
+
*/
|
|
160
|
+
private static void handleBulkUpdate(List<{{EventName}}__e> events) {
|
|
161
|
+
// Collect external IDs to query
|
|
162
|
+
Set<String> externalIds = new Set<String>();
|
|
163
|
+
Map<String, {{EventName}}__e> eventsByExternalId = new Map<String, {{EventName}}__e>();
|
|
164
|
+
|
|
165
|
+
for ({{EventName}}__e event : events) {
|
|
166
|
+
externalIds.add(event.Record_Id__c);
|
|
167
|
+
eventsByExternalId.put(event.Record_Id__c, event);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Query existing records
|
|
171
|
+
/*
|
|
172
|
+
Map<String, {{TargetObject}}__c> recordsByExternalId = new Map<String, {{TargetObject}}__c>();
|
|
173
|
+
for ({{TargetObject}}__c record : [
|
|
174
|
+
SELECT Id, External_Id__c, Name
|
|
175
|
+
FROM {{TargetObject}}__c
|
|
176
|
+
WHERE External_Id__c IN :externalIds
|
|
177
|
+
WITH USER_MODE
|
|
178
|
+
]) {
|
|
179
|
+
recordsByExternalId.put(record.External_Id__c, record);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Update records
|
|
183
|
+
List<{{TargetObject}}__c> toUpdate = new List<{{TargetObject}}__c>();
|
|
184
|
+
for (String extId : externalIds) {
|
|
185
|
+
if (recordsByExternalId.containsKey(extId)) {
|
|
186
|
+
{{TargetObject}}__c record = recordsByExternalId.get(extId);
|
|
187
|
+
{{EventName}}__e event = eventsByExternalId.get(extId);
|
|
188
|
+
Map<String, Object> payload = parsePayload(event.Payload__c);
|
|
189
|
+
|
|
190
|
+
// Update fields
|
|
191
|
+
// record.Name = (String) payload.get('name');
|
|
192
|
+
toUpdate.add(record);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
if (!toUpdate.isEmpty()) {
|
|
197
|
+
Database.SaveResult[] results = Database.update(toUpdate, false);
|
|
198
|
+
logDmlResults(results, 'UPDATE');
|
|
199
|
+
}
|
|
200
|
+
*/
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* @description Bulk delete handler
|
|
205
|
+
* @param events DELETE events
|
|
206
|
+
*/
|
|
207
|
+
private static void handleBulkDelete(List<{{EventName}}__e> events) {
|
|
208
|
+
Set<String> externalIds = new Set<String>();
|
|
209
|
+
for ({{EventName}}__e event : events) {
|
|
210
|
+
externalIds.add(event.Record_Id__c);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/*
|
|
214
|
+
List<{{TargetObject}}__c> toDelete = [
|
|
215
|
+
SELECT Id
|
|
216
|
+
FROM {{TargetObject}}__c
|
|
217
|
+
WHERE External_Id__c IN :externalIds
|
|
218
|
+
WITH USER_MODE
|
|
219
|
+
];
|
|
220
|
+
|
|
221
|
+
if (!toDelete.isEmpty()) {
|
|
222
|
+
Database.DeleteResult[] results = Database.delete(toDelete, false);
|
|
223
|
+
logDeleteResults(results, 'DELETE');
|
|
224
|
+
}
|
|
225
|
+
*/
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* @description Parse JSON payload to Map
|
|
230
|
+
* @param payloadJson JSON string
|
|
231
|
+
* @return Parsed Map
|
|
232
|
+
*/
|
|
233
|
+
private static Map<String, Object> parsePayload(String payloadJson) {
|
|
234
|
+
if (String.isBlank(payloadJson)) {
|
|
235
|
+
return new Map<String, Object>();
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
try {
|
|
239
|
+
return (Map<String, Object>) JSON.deserializeUntyped(payloadJson);
|
|
240
|
+
} catch (JSONException e) {
|
|
241
|
+
System.debug(LoggingLevel.ERROR, 'Failed to parse payload: ' + e.getMessage());
|
|
242
|
+
return new Map<String, Object>();
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* @description Log DML results for monitoring
|
|
248
|
+
* @param results Database.SaveResult array
|
|
249
|
+
* @param operation Operation name
|
|
250
|
+
*/
|
|
251
|
+
private static void logDmlResults(Database.SaveResult[] results, String operation) {
|
|
252
|
+
Integer successCount = 0;
|
|
253
|
+
Integer failCount = 0;
|
|
254
|
+
|
|
255
|
+
for (Database.SaveResult sr : results) {
|
|
256
|
+
if (sr.isSuccess()) {
|
|
257
|
+
successCount++;
|
|
258
|
+
} else {
|
|
259
|
+
failCount++;
|
|
260
|
+
for (Database.Error err : sr.getErrors()) {
|
|
261
|
+
System.debug(LoggingLevel.ERROR,
|
|
262
|
+
operation + ' failed: ' + err.getStatusCode() + ' - ' + err.getMessage());
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
System.debug(LoggingLevel.INFO,
|
|
268
|
+
operation + ' results - Success: ' + successCount + ', Failed: ' + failCount);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* @description Log delete results for monitoring
|
|
273
|
+
* @param results Database.DeleteResult array
|
|
274
|
+
* @param operation Operation name
|
|
275
|
+
*/
|
|
276
|
+
private static void logDeleteResults(Database.DeleteResult[] results, String operation) {
|
|
277
|
+
Integer successCount = 0;
|
|
278
|
+
Integer failCount = 0;
|
|
279
|
+
|
|
280
|
+
for (Database.DeleteResult dr : results) {
|
|
281
|
+
if (dr.isSuccess()) {
|
|
282
|
+
successCount++;
|
|
283
|
+
} else {
|
|
284
|
+
failCount++;
|
|
285
|
+
for (Database.Error err : dr.getErrors()) {
|
|
286
|
+
System.debug(LoggingLevel.ERROR,
|
|
287
|
+
operation + ' failed: ' + err.getStatusCode() + ' - ' + err.getMessage());
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
System.debug(LoggingLevel.INFO,
|
|
293
|
+
operation + ' results - Success: ' + successCount + ', Failed: ' + failCount);
|
|
294
|
+
}
|
|
295
|
+
}
|