├── scripts ├── 10_debug.apex ├── 05_test_exceptions.apex ├── 06_test_successes.apex ├── logo │ └── logo details.txt ├── 07_install_demo.bat ├── 00_security_scanner.bat ├── apex-tests │ ├── bulk_ingestion.apex │ ├── graph_api.apex │ ├── table-tests.apex │ ├── soql_query.soql │ ├── test_connection.apex │ ├── streaming test.apex │ ├── testIngestionApiStreaming.apex │ └── field_metadata.apex ├── 04_package_test.bat ├── 08_setup_connection.bat ├── 02_package_create_managed.bat ├── 03_package_create_unlocked.bat ├── 09_create_test_data.apex ├── bat │ └── dependency.bat ├── 01_package_dependencies.bat └── scan-results │ ├── graph-result.html │ └── pmd-result.html ├── force-app ├── package │ ├── ui │ │ ├── lwc │ │ │ ├── dataCloudSObjectToYamlUtil │ │ │ │ ├── dataCloudSObjectToYamlUtil.css │ │ │ │ ├── dataCloudSObjectToYamlUtil.js-meta.xml │ │ │ │ ├── dataCloudSObjectToYamlUtil.html │ │ │ │ └── dataCloudSObjectToYamlUtil.js │ │ │ ├── dataCloudAddCsvModal │ │ │ │ ├── dataCloudAddCsvModal.css │ │ │ │ ├── dataCloudAddCsvModal.js-meta.xml │ │ │ │ ├── dataCloudAddCsvModal.html │ │ │ │ └── dataCloudAddCsvModal.js │ │ │ ├── dataCloudBulkIngestionUtil │ │ │ │ ├── dataCloudBulkIngestionUtil.css │ │ │ │ ├── dataCloudBulkIngestionUtil.js-meta.xml │ │ │ │ └── dataCloudBulkIngestionUtil.html │ │ │ ├── dataCloudSObjectToCsvUtil │ │ │ │ ├── dataCloudSObjectToCsvUtil.css │ │ │ │ ├── dataCloudSObjectToCsvUtil.js-meta.xml │ │ │ │ └── dataCloudSObjectToCsvUtil.html │ │ │ ├── dataCloudStreamingIngestionUtil │ │ │ │ ├── dataCloudStreamingIngestionUtil.css │ │ │ │ ├── dataCloudStreamingIngestionUtil.js-meta.xml │ │ │ │ └── dataCloudStreamingIngestionUtil.html │ │ │ ├── dataCloudQueryUtil │ │ │ │ ├── dataCloudQueryUtil.css │ │ │ │ ├── dataCloudQueryUtil.js-meta.xml │ │ │ │ └── dataCloudQueryUtil.html │ │ │ └── dataCloudDataGraphUtil │ │ │ │ ├── dataCloudDataGraphUtil.js-meta.xml │ │ │ │ └── dataCloudDataGraphUtil.html │ │ ├── classes │ │ │ ├── DataCloudUtilLwcCtrl.cls-meta.xml │ │ │ └── DataCloudUtilLwcCtrlTest.cls-meta.xml │ │ ├── tabs │ │ │ ├── Data_Cloud_Query.tab-meta.xml │ │ │ ├── Data_Cloud_Utility.tab-meta.xml │ │ │ ├── Data_Cloud_Ingestion.tab-meta.xml │ │ │ └── Data_Cloud_JSON_Utility.tab-meta.xml │ │ ├── flexipages │ │ │ ├── Data_Cloud_Utility_UtilityBar.flexipage-meta.xml │ │ │ ├── Data_Cloud_JSON_Utility.flexipage-meta.xml │ │ │ ├── Data_Cloud_Utility.flexipage-meta.xml │ │ │ ├── Data_Cloud_Ingestion.flexipage-meta.xml │ │ │ └── Data_Cloud_Query.flexipage-meta.xml │ │ ├── permissionsets │ │ │ └── Lightweight_Data_Cloud_Util_UI.permissionset-meta.xml │ │ └── applications │ │ │ └── Data_Cloud_Util.app-meta.xml │ └── core │ │ ├── contentassets │ │ ├── dc_util_logo_1.asset │ │ └── dc_util_logo_1.asset-meta.xml │ │ ├── classes │ │ ├── Dc.cls-meta.xml │ │ └── DcTest.cls-meta.xml │ │ ├── objects │ │ ├── Data_Cloud_Ingestion_API_Configuration__mdt │ │ │ ├── Data_Cloud_Ingestion_API_Configuration__mdt.object-meta.xml │ │ │ └── fields │ │ │ │ ├── Ingestion_API_Connector_Name__c.field-meta.xml │ │ │ │ ├── Ingestion_API_Target_Object_Name__c.field-meta.xml │ │ │ │ ├── Data_Lake_Object_Name__c.field-meta.xml │ │ │ │ ├── sObject_Name__c.field-meta.xml │ │ │ │ ├── Salesforce_Named_Credential_Name__c.field-meta.xml │ │ │ │ └── Named_Credential_Name__c.field-meta.xml │ │ └── Data_Cloud_Ingestion_API_Field_Mapping__mdt │ │ │ ├── Data_Cloud_Ingestion_API_Field_Mapping__mdt.object-meta.xml │ │ │ ├── fields │ │ │ ├── Is_Primary_Key__c.field-meta.xml │ │ │ ├── Is_Event_Time_Field__c.field-meta.xml │ │ │ ├── Source__c.field-meta.xml │ │ │ ├── Target__c.field-meta.xml │ │ │ ├── Data_Cloud_Ingestion_API_Configuration__c.field-meta.xml │ │ │ └── Data_Cloud_Field_Type__c.field-meta.xml │ │ │ └── listViews │ │ │ └── All.listView-meta.xml │ │ ├── permissionsets │ │ └── Lightweight_Data_Cloud_Util.permissionset-meta.xml │ │ ├── customMetadata │ │ ├── Data_Cloud_Ingestion_API_Field_Mapping.Apex_Unit_Test_Id.md-meta.xml │ │ ├── Data_Cloud_Ingestion_API_Field_Mapping.Apex_Unit_Test_Username.md-meta.xml │ │ └── Data_Cloud_Ingestion_API_Configuration.Apex_Unit_Test.md-meta.xml │ │ └── layouts │ │ ├── Data_Cloud_Ingestion_API_Field_Mapping__mdt-Data Cloud Ingestion API Field Mapping Layout.layout-meta.xml │ │ └── Data_Cloud_Ingestion_API_Configuration__mdt-Data Cloud Ingestion API Configuration Layout.layout-meta.xml └── demo │ ├── package │ ├── classes │ │ ├── SmartDeviceEventDemoLwcCtrl.cls-meta.xml │ │ └── SmartDeviceEventDemoLwcCtrl.cls │ ├── triggers │ │ ├── SmartDeviceEventTrigger.trigger-meta.xml │ │ └── SmartDeviceEventTrigger.trigger │ ├── tabs │ │ ├── Smart_Device_Event_History__c.tab-meta.xml │ │ └── Smart_Device_Home.tab-meta.xml │ ├── objects │ │ ├── Smart_Device_Event__e │ │ │ ├── fields │ │ │ │ ├── Event_Date__c.field-meta.xml │ │ │ │ ├── Timestamp__c.field-meta.xml │ │ │ │ ├── Action__c.field-meta.xml │ │ │ │ ├── Device_Type__c.field-meta.xml │ │ │ │ ├── Status_Reason__c.field-meta.xml │ │ │ │ └── Status_Code__c.field-meta.xml │ │ │ └── Smart_Device_Event__e.object-meta.xml │ │ └── Smart_Device_Event_History__c │ │ │ ├── fields │ │ │ ├── Event_Date__c.field-meta.xml │ │ │ ├── Timestamp__c.field-meta.xml │ │ │ ├── Action__c.field-meta.xml │ │ │ ├── ReplayId__c.field-meta.xml │ │ │ ├── EventUuid__c.field-meta.xml │ │ │ ├── Device_Type__c.field-meta.xml │ │ │ ├── Status_Reason__c.field-meta.xml │ │ │ └── Status_Code__c.field-meta.xml │ │ │ ├── listViews │ │ │ └── All.listView-meta.xml │ │ │ └── Smart_Device_Event_History__c.object-meta.xml │ ├── platformEventSubscriberConfigs │ │ └── SmartDeviceEventTrigger.platformEventSubscriberConfig-meta.xml │ ├── flexipages │ │ ├── Smart_Device_Demo_UtilityBar.flexipage-meta.xml │ │ ├── Smart_Device_Home.flexipage-meta.xml │ │ └── Smart_Device_Event_History_Record_Page.flexipage-meta.xml │ ├── applications │ │ └── Smart_Device_Event_Demo.app-meta.xml │ ├── customMetadata │ │ ├── utl__Data_Cloud_Ingestion_API_Field_Mapping.BM_01.md-meta.xml │ │ ├── utl__Data_Cloud_Ingestion_API_Field_Mapping.SM_01.md-meta.xml │ │ ├── utl__Data_Cloud_Ingestion_API_Field_Mapping.SM_07.md-meta.xml │ │ ├── utl__Data_Cloud_Ingestion_API_Field_Mapping.BM_07.md-meta.xml │ │ ├── utl__Data_Cloud_Ingestion_API_Field_Mapping.SM_06.md-meta.xml │ │ ├── utl__Data_Cloud_Ingestion_API_Field_Mapping.BM_06.md-meta.xml │ │ ├── utl__Data_Cloud_Ingestion_API_Field_Mapping.BM_08.md-meta.xml │ │ ├── utl__Data_Cloud_Ingestion_API_Field_Mapping.SM_08.md-meta.xml │ │ ├── utl__Data_Cloud_Ingestion_API_Field_Mapping.BM_02.md-meta.xml │ │ ├── utl__Data_Cloud_Ingestion_API_Field_Mapping.BM_03.md-meta.xml │ │ ├── utl__Data_Cloud_Ingestion_API_Field_Mapping.BM_05.md-meta.xml │ │ ├── utl__Data_Cloud_Ingestion_API_Field_Mapping.SM_02.md-meta.xml │ │ ├── utl__Data_Cloud_Ingestion_API_Field_Mapping.SM_03.md-meta.xml │ │ ├── utl__Data_Cloud_Ingestion_API_Field_Mapping.SM_05.md-meta.xml │ │ ├── utl__Data_Cloud_Ingestion_API_Field_Mapping.BM_04.md-meta.xml │ │ ├── utl__Data_Cloud_Ingestion_API_Field_Mapping.SM_04.md-meta.xml │ │ ├── utl__Data_Cloud_Ingestion_API_Configuration.Smart_Device_Event_Bulk.md-meta.xml │ │ └── utl__Data_Cloud_Ingestion_API_Configuration.Smart_Device_Event_Streaming.md-meta.xml │ ├── lwc │ │ └── smartDeviceEventDemo │ │ │ ├── smartDeviceEventDemo.js-meta.xml │ │ │ ├── smartDeviceEventDemo.html │ │ │ └── smartDeviceEventDemo.js │ ├── permissionsets │ │ └── Smart_Device_Event_Demo.permissionset-meta.xml │ └── layouts │ │ └── Smart_Device_Event_History__c-Smart Device Event_History Layout.layout-meta.xml │ └── scripts │ └── demo_object.yaml ├── todo.md ├── .forceignore ├── .gitignore ├── LICENSE ├── sfdx-project.json └── config └── project-scratch-def.json /scripts/10_debug.apex: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scripts/05_test_exceptions.apex: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scripts/06_test_successes.apex: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudSObjectToYamlUtil/dataCloudSObjectToYamlUtil.css: -------------------------------------------------------------------------------- 1 | h1 {} -------------------------------------------------------------------------------- /scripts/logo/logo details.txt: -------------------------------------------------------------------------------- 1 | dark circle #301d72 2 | inner top light wave #868aca 3 | inner bottom dark wave #5E62A2 4 | -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudAddCsvModal/dataCloudAddCsvModal.css: -------------------------------------------------------------------------------- 1 | .hideOverflow { 2 | overflow: hidden; 3 | } 4 | 5 | -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudBulkIngestionUtil/dataCloudBulkIngestionUtil.css: -------------------------------------------------------------------------------- 1 | .ta{ 2 | min-height: 220px; 3 | margin-bottom: 40px; 4 | } -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudSObjectToCsvUtil/dataCloudSObjectToCsvUtil.css: -------------------------------------------------------------------------------- 1 | .soql-box{ 2 | padding : 0px !important; 3 | border-color: #747474 !important; 4 | } -------------------------------------------------------------------------------- /force-app/package/core/contentassets/dc_util_logo_1.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jfwberg/lightweight-data-cloud-util/HEAD/force-app/package/core/contentassets/dc_util_logo_1.asset -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudStreamingIngestionUtil/dataCloudStreamingIngestionUtil.css: -------------------------------------------------------------------------------- 1 | .payload-box{ 2 | padding : 0px !important; 3 | border-color: #747474 !important; 4 | } -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudQueryUtil/dataCloudQueryUtil.css: -------------------------------------------------------------------------------- 1 | .query-box{ 2 | 3 | /*margin-top: 22px !important;*/ 4 | padding: 0px !important; 5 | border-color: #747474 !important; 6 | } -------------------------------------------------------------------------------- /force-app/package/core/classes/Dc.cls-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62.0 4 | Active 5 | -------------------------------------------------------------------------------- /force-app/package/core/classes/DcTest.cls-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62.0 4 | Active 5 | -------------------------------------------------------------------------------- /scripts/07_install_demo.bat: -------------------------------------------------------------------------------- 1 | REM Deploy the custom implementation files 2 | sf project deploy start --source-dir force-app/tdx-demo 3 | 4 | REM Assign the permission set 5 | sf org assign permset --name "Data_Cloud_Smart_Demo" 6 | 7 | 8 | -------------------------------------------------------------------------------- /force-app/package/ui/classes/DataCloudUtilLwcCtrl.cls-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62.0 4 | Active 5 | -------------------------------------------------------------------------------- /force-app/package/ui/classes/DataCloudUtilLwcCtrlTest.cls-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62.0 4 | Active 5 | -------------------------------------------------------------------------------- /force-app/demo/package/classes/SmartDeviceEventDemoLwcCtrl.cls-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62.0 4 | Active 5 | -------------------------------------------------------------------------------- /force-app/demo/package/triggers/SmartDeviceEventTrigger.trigger-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62.0 4 | Active 5 | 6 | -------------------------------------------------------------------------------- /force-app/demo/package/tabs/Smart_Device_Event_History__c.tab-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | true 4 | Custom25: Alarm clock 5 | 6 | -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudAddCsvModal/dataCloudAddCsvModal.js-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 62.0 3 | true 4 | Data Cloud Add CSV Modal 5 | -------------------------------------------------------------------------------- /scripts/00_security_scanner.bat: -------------------------------------------------------------------------------- 1 | rem SECURITY SCAN - PMD 2 | sfdx scanner:run -t "../force-app" -f html -o "scan-results/pmd-result.html" --verbose 3 | 4 | rem SECURITY SCAN - GRAPH RULES 5 | sfdx scanner:run:dfa --target "classes\*.cls" --projectdir "../force-app/package" -f html -o "scan-results/graph-result.html" --verbose -------------------------------------------------------------------------------- /force-app/package/ui/tabs/Data_Cloud_Query.tab-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Created by Lightning App Builder 4 | Data_Cloud_Query 5 | Data Cloud Query 6 | Custom64: Compass 7 | 8 | -------------------------------------------------------------------------------- /force-app/demo/package/tabs/Smart_Device_Home.tab-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Created by Lightning App Builder 4 | Smart_Device_Home 5 | Smart Device Home 6 | Custom46: Postage 7 | 8 | -------------------------------------------------------------------------------- /force-app/package/ui/tabs/Data_Cloud_Utility.tab-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Created by Lightning App Builder 4 | Data_Cloud_Utility 5 | Data Cloud Utility 6 | Custom4: Hexagon 7 | 8 | -------------------------------------------------------------------------------- /todo.md: -------------------------------------------------------------------------------- 1 | ## Short term 2 | - Update Blogs with package versions 3 | - Make Sample App part of the public repo 4 | 5 | ## Longer term (v63.0) 6 | - Remove subqueries to avoid 200 field limit bug 7 | - Add API Url in metadata for clarity 8 | - Add XLSX Support 9 | - Create XLSX Template 10 | - Create Metadata Tool to (auto) generate the custom metadata in an easy way 11 | -------------------------------------------------------------------------------- /force-app/package/ui/tabs/Data_Cloud_Ingestion.tab-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Created by Lightning App Builder 4 | Data_Cloud_Ingestion 5 | Data Cloud Ingestion 6 | Custom5: Leaf 7 | 8 | -------------------------------------------------------------------------------- /force-app/package/ui/tabs/Data_Cloud_JSON_Utility.tab-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Created by Lightning App Builder 4 | Data_Cloud_JSON_Utility 5 | Data Cloud JSON Utility 6 | Custom2: Fan 7 | 8 | -------------------------------------------------------------------------------- /force-app/package/core/objects/Data_Cloud_Ingestion_API_Configuration__mdt/Data_Cloud_Ingestion_API_Configuration__mdt.object-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Data Cloud Ingestion API Configuration 4 | Data Cloud Ingestion API Configurations 5 | Public 6 | 7 | -------------------------------------------------------------------------------- /force-app/package/core/objects/Data_Cloud_Ingestion_API_Field_Mapping__mdt/Data_Cloud_Ingestion_API_Field_Mapping__mdt.object-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Data Cloud Ingestion API Field Mapping 4 | Data Cloud Ingestion API Field Mappings 5 | Public 6 | 7 | -------------------------------------------------------------------------------- /force-app/demo/package/objects/Smart_Device_Event__e/fields/Event_Date__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Event_Date__c 4 | false 5 | Event Date 6 | false 7 | false 8 | Date 9 | 10 | -------------------------------------------------------------------------------- /force-app/demo/package/objects/Smart_Device_Event_History__c/fields/Event_Date__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Event_Date__c 4 | false 5 | Event Date 6 | false 7 | false 8 | Date 9 | 10 | -------------------------------------------------------------------------------- /force-app/demo/package/objects/Smart_Device_Event_History__c/fields/Timestamp__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Timestamp__c 4 | false 5 | Timestamp 6 | false 7 | false 8 | DateTime 9 | 10 | -------------------------------------------------------------------------------- /force-app/demo/package/triggers/SmartDeviceEventTrigger.trigger: -------------------------------------------------------------------------------- 1 | trigger SmartDeviceEventTrigger on Smart_Device_Event__e (after insert) { 2 | 3 | // Stream the data to data cloud 4 | utl.Dc.streamRecordsToDataCloudAsync( 5 | 'Smart_Device_Event_Streaming', 6 | JSON.serialize(trigger.new) 7 | ); 8 | 9 | // Create history records 10 | SmartDeviceEventDemoLwcCtrl.createHistoryRecordsFromEvent(trigger.new); 11 | } -------------------------------------------------------------------------------- /force-app/demo/package/objects/Smart_Device_Event_History__c/fields/Action__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Action__c 4 | false 5 | Action 6 | 255 7 | false 8 | false 9 | Text 10 | false 11 | 12 | -------------------------------------------------------------------------------- /force-app/demo/package/objects/Smart_Device_Event_History__c/fields/ReplayId__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ReplayId__c 4 | false 5 | ReplayId 6 | 255 7 | false 8 | false 9 | Text 10 | false 11 | 12 | -------------------------------------------------------------------------------- /force-app/demo/package/objects/Smart_Device_Event_History__c/fields/EventUuid__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | EventUuid__c 4 | false 5 | EventUuid 6 | 36 7 | false 8 | false 9 | Text 10 | false 11 | 12 | -------------------------------------------------------------------------------- /force-app/package/core/objects/Data_Cloud_Ingestion_API_Field_Mapping__mdt/fields/Is_Primary_Key__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Is_Primary_Key__c 4 | false 5 | false 6 | DeveloperControlled 7 | Is Primary Key 8 | Checkbox 9 | 10 | -------------------------------------------------------------------------------- /force-app/demo/package/objects/Smart_Device_Event_History__c/fields/Device_Type__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Device_Type__c 4 | false 5 | Device Type 6 | 255 7 | false 8 | false 9 | Text 10 | false 11 | 12 | -------------------------------------------------------------------------------- /force-app/demo/package/objects/Smart_Device_Event_History__c/fields/Status_Reason__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Status_Reason__c 4 | false 5 | Status Reason 6 | 255 7 | false 8 | false 9 | Text 10 | false 11 | 12 | -------------------------------------------------------------------------------- /force-app/package/core/objects/Data_Cloud_Ingestion_API_Field_Mapping__mdt/fields/Is_Event_Time_Field__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Is_Event_Time_Field__c 4 | false 5 | false 6 | DeveloperControlled 7 | Is Event Time Field 8 | Checkbox 9 | 10 | -------------------------------------------------------------------------------- /force-app/package/core/objects/Data_Cloud_Ingestion_API_Field_Mapping__mdt/fields/Source__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Source__c 4 | false 5 | DeveloperControlled 6 | Source 7 | 255 8 | true 9 | Text 10 | false 11 | 12 | -------------------------------------------------------------------------------- /force-app/package/core/objects/Data_Cloud_Ingestion_API_Field_Mapping__mdt/fields/Target__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Target__c 4 | false 5 | DeveloperControlled 6 | Target 7 | 255 8 | true 9 | Text 10 | false 11 | 12 | -------------------------------------------------------------------------------- /force-app/demo/package/platformEventSubscriberConfigs/SmartDeviceEventTrigger.platformEventSubscriberConfig-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | SmartDeviceEventTrigger 4 | 100 5 | SmartDeviceEventTriggerConfig 6 | test-urqpxduzru2f@example.com 7 | false 8 | -------------------------------------------------------------------------------- /force-app/demo/package/objects/Smart_Device_Event__e/fields/Timestamp__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Timestamp__c 4 | false 5 | false 6 | false 7 | false 8 | Timestamp 9 | false 10 | DateTime 11 | 12 | -------------------------------------------------------------------------------- /force-app/demo/package/objects/Smart_Device_Event__e/Smart_Device_Event__e.object-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Deployed 4 | An event that is send from a connected smart device 5 | HighVolume 6 | Smart Device Event 7 | Smart Device Events 8 | PublishImmediately 9 | 10 | -------------------------------------------------------------------------------- /force-app/demo/package/objects/Smart_Device_Event_History__c/fields/Status_Code__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Status_Code__c 4 | 0 5 | false 6 | Status Code 7 | 18 8 | false 9 | 0 10 | false 11 | Number 12 | false 13 | 14 | -------------------------------------------------------------------------------- /force-app/demo/package/objects/Smart_Device_Event__e/fields/Action__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Action__c 4 | false 5 | false 6 | false 7 | false 8 | Action 9 | 255 10 | false 11 | Text 12 | false 13 | 14 | -------------------------------------------------------------------------------- /force-app/package/core/objects/Data_Cloud_Ingestion_API_Configuration__mdt/fields/Ingestion_API_Connector_Name__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Ingestion_API_Connector_Name__c 4 | false 5 | DeveloperControlled 6 | Ingestion API Connector Name 7 | 255 8 | true 9 | Text 10 | false 11 | 12 | -------------------------------------------------------------------------------- /force-app/demo/package/objects/Smart_Device_Event__e/fields/Device_Type__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Device_Type__c 4 | false 5 | false 6 | false 7 | false 8 | Device Type 9 | 255 10 | true 11 | Text 12 | false 13 | 14 | -------------------------------------------------------------------------------- /force-app/package/core/objects/Data_Cloud_Ingestion_API_Configuration__mdt/fields/Ingestion_API_Target_Object_Name__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Ingestion_API_Target_Object_Name__c 4 | false 5 | DeveloperControlled 6 | Ingestion API Target Object Name 7 | 255 8 | true 9 | Text 10 | false 11 | 12 | -------------------------------------------------------------------------------- /force-app/demo/package/objects/Smart_Device_Event_History__c/listViews/All.listView-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | All 4 | NAME 5 | Action__c 6 | Device_Type__c 7 | Status_Code__c 8 | Status_Reason__c 9 | Timestamp__c 10 | EventUuid__c 11 | ReplayId__c 12 | Everything 13 | All 14 | 15 | -------------------------------------------------------------------------------- /force-app/demo/scripts/demo_object.yaml: -------------------------------------------------------------------------------- 1 | openapi: 3.0.3 2 | components: 3 | schemas: 4 | Smart_Device_Event: 5 | type: object 6 | properties: 7 | ReplayId: 8 | type: string 9 | EventUuid: 10 | type: string 11 | Action: 12 | type: string 13 | Device_Type: 14 | type: string 15 | Status_Code: 16 | type: number 17 | Status_Reason: 18 | type: string 19 | Timestamp: 20 | type: string 21 | format: date-time 22 | Event_Date: 23 | type: string 24 | format: date 25 | -------------------------------------------------------------------------------- /scripts/apex-tests/bulk_ingestion.apex: -------------------------------------------------------------------------------- 1 | // Convert to query table when it works 2 | String csvFile = 'Action,Device_Type,EventUuid,ReplayId,Status_Code,Status_Reason,Timestamp\n'; 3 | csvFile +='"Switch State","Lightbulk","[RANDOM]","45" '; 4 | 5 | try{ 6 | 7 | 8 | utl.Dc.ingestBulkCsvDataInDataCloud( 9 | 'Smart_Device_Event_Configuration', 10 | 'upsert', 11 | new String[]{csvFile} 12 | ); 13 | 14 | 15 | 16 | //utl.Dc.createIngestionBulkJob('Smart_Device_Event_Configuration', '48e45136-67f6-4cfc-bfbf-36f65862456e', 'upsert'); 17 | 18 | 19 | }catch(Exception e){ 20 | System.debug(e.getMessage()); 21 | } -------------------------------------------------------------------------------- /scripts/apex-tests/graph_api.apex: -------------------------------------------------------------------------------- 1 | /* 2 | System.debug( 3 | JSON.serializePretty( 4 | Dc.getAllDataGraphMetadata('UKTA_DC_ORG') 5 | ) 6 | ); 7 | */ 8 | 9 | 10 | System.debug( 11 | JSON.serializePretty( 12 | Dc.getDetailedDataGraphMetadata('UKTA_DC_ORG', 'DG2') 13 | ) 14 | ); 15 | 16 | 17 | /* 18 | System.debug( 19 | JSON.serializePretty( 20 | JSON.deserializeUntyped( 21 | Dc.getDataGraphJsonBlob('UKTA_DC_ORG', 'DG2', '0038d00000fkCwkAAE') 22 | ) 23 | ) 24 | ); 25 | */ 26 | 27 | System.debug(Dc.getDataCloudNamedCredentialPicklistOptions()); 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /force-app/package/core/contentassets/dc_util_logo_1.asset-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | false 4 | en_US 5 | dc_util_logo_1 6 | 7 | 8 | VIEWER 9 | 10 | 11 | 12 | 13 | 1 14 | dc_util_logo (1).png 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /force-app/demo/package/objects/Smart_Device_Event__e/fields/Status_Reason__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Status_Reason__c 4 | Optional info for the reason of the status 5 | false 6 | false 7 | false 8 | false 9 | Status Reason 10 | 255 11 | false 12 | Text 13 | false 14 | 15 | -------------------------------------------------------------------------------- /force-app/package/core/objects/Data_Cloud_Ingestion_API_Configuration__mdt/fields/Data_Lake_Object_Name__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Data_Lake_Object_Name__c 4 | false 5 | DeveloperControlled 6 | Optional name of the Data Lake object that can be used for generating the query 7 | Data Lake Object Name 8 | 255 9 | false 10 | Text 11 | false 12 | 13 | -------------------------------------------------------------------------------- /force-app/demo/package/objects/Smart_Device_Event__e/fields/Status_Code__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Status_Code__c 4 | The status of the smart device 5 | false 6 | false 7 | false 8 | false 9 | Status Code 10 | 18 11 | true 12 | 0 13 | Number 14 | false 15 | 16 | -------------------------------------------------------------------------------- /force-app/package/core/objects/Data_Cloud_Ingestion_API_Field_Mapping__mdt/listViews/All.listView-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | All 4 | DeveloperName 5 | Data_Cloud_Ingestion_API_Configuration__c 6 | MasterLabel 7 | Source__c 8 | Target__c 9 | Data_Cloud_Field_Type__c 10 | Is_Primary_Key__c 11 | Is_Event_Time_Field__c 12 | Everything 13 | All 14 | 15 | -------------------------------------------------------------------------------- /scripts/04_package_test.bat: -------------------------------------------------------------------------------- 1 | REM ***************************** 2 | REM INSTALL ON TEST ORG 3 | REM ***************************** 4 | 5 | REM Config 6 | SET testOrg=orgAlias 7 | SET packageVersionId= 8 | SET dependencyVersionId= 9 | 10 | REM Install the package dependencies 11 | sf package:install -p %dependencyVersionId% --target-org %testOrg% --wait 30 12 | 13 | REM Install the package 14 | sf package:install -p %packageVersionId% --target-org %testOrg% --wait 30 15 | 16 | REM Uninstall the package 17 | sf package uninstall --package %packageVersionId% --target-org %testOrg% --wait 30 18 | 19 | REM Uninstall the dependencies 20 | sf package uninstall --package %packageVersionId% --target-org %testOrg% --wait 30 21 | -------------------------------------------------------------------------------- /force-app/package/core/objects/Data_Cloud_Ingestion_API_Configuration__mdt/fields/sObject_Name__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | sObject_Name__c 4 | false 5 | DeveloperControlled 6 | The related sObject Name in Salesforce. Used to generate default query result based on the mapping. 7 | Not really mandatory, but advised to populate. 8 | sObject Name 9 | 80 10 | false 11 | Text 12 | false 13 | 14 | -------------------------------------------------------------------------------- /force-app/demo/package/flexipages/Smart_Device_Demo_UtilityBar.flexipage-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | utilityItems 5 | Region 6 | 7 | 8 | backgroundComponents 9 | Background 10 | 11 | Smart Device Demo UtilityBar 12 | 13 | one:utilityBarTemplateDesktop 14 | 15 | isLeftAligned 16 | true 17 | 18 | 19 | UtilityBar 20 | 21 | -------------------------------------------------------------------------------- /force-app/package/ui/flexipages/Data_Cloud_Utility_UtilityBar.flexipage-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | utilityItems 5 | Region 6 | 7 | 8 | backgroundComponents 9 | Background 10 | 11 | Data Cloud Utility UtilityBar 12 | 13 | one:utilityBarTemplateDesktop 14 | 15 | isLeftAligned 16 | true 17 | 18 | 19 | UtilityBar 20 | 21 | -------------------------------------------------------------------------------- /.forceignore: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Common test files for connection testing 4 | #**/contentassets/** 5 | **/profiles/** 6 | **/samlssoconfigs/** 7 | **/certs/** 8 | **/appMenus/** 9 | **/objectTranslations/** 10 | **/connectedApps/** 11 | **/flows/** 12 | 13 | 14 | # Project that even on false get automtically deployed, this should stop that 15 | **/force-app/demo/** 16 | **/force-app/tdx-demo/** 17 | **/force-app/connection/** 18 | 19 | # Comment when deploying the connection 20 | **/force-app/connection/** 21 | #**/layouts/** 22 | #**/customMetadata/** 23 | **/namedCredentials/** 24 | **/externalCredentials/** 25 | **/authproviders/** 26 | **/remoteSiteSettings/** 27 | 28 | # LWC configuration files 29 | **/jsconfig.json 30 | **/.eslintrc.json 31 | 32 | # Key Store 33 | **/.jks 34 | 35 | # LWC Jest 36 | **/__tests__/** -------------------------------------------------------------------------------- /force-app/package/core/objects/Data_Cloud_Ingestion_API_Field_Mapping__mdt/fields/Data_Cloud_Ingestion_API_Configuration__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Data_Cloud_Ingestion_API_Configuration__c 4 | false 5 | DeveloperControlled 6 | Data Cloud Ingestion API Configuration 7 | Data_Cloud_Ingestion_API_Configuration__mdt 8 | Data Cloud Ingestion API Field Mappings 9 | Data_Cloud_Ingestion_API_Field_Mappings 10 | true 11 | MetadataRelationship 12 | false 13 | 14 | -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudQueryUtil/dataCloudQueryUtil.js-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 62.0 3 | true 4 | Data Cloud - Query Utility 5 | 6 | lightning__AppPage 7 | lightning__HomePage 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /force-app/package/ui/flexipages/Data_Cloud_JSON_Utility.flexipage-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | jsonTable 7 | utl_jsonTable 8 | 9 | 10 | column1 11 | Region 12 | 13 | 14 | column2 15 | Region 16 | 17 | Data Cloud JSON Utility 18 | 19 | flexipage:appHomeTemplateTwoColumns 20 | 21 | AppPage 22 | 23 | -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudDataGraphUtil/dataCloudDataGraphUtil.js-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 62.0 3 | true 4 | Data Cloud - Data Graph Utility 5 | 6 | lightning__AppPage 7 | lightning__HomePage 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /force-app/demo/package/flexipages/Smart_Device_Home.flexipage-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | smartDeviceEventDemo 7 | utl_smartDeviceEventDemo 8 | 9 | 10 | column1 11 | Region 12 | 13 | 14 | column2 15 | Region 16 | 17 | Smart Device Home 18 | 19 | flexipage:appHomeTemplateTwoColumns 20 | 21 | AppPage 22 | 23 | -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudBulkIngestionUtil/dataCloudBulkIngestionUtil.js-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 62.0 3 | true 4 | Data Cloud - Bulk Ingestion Utility 5 | 6 | lightning__AppPage 7 | lightning__HomePage 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudSObjectToCsvUtil/dataCloudSObjectToCsvUtil.js-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 62.0 3 | true 4 | Data Cloud - SObject to CSV Utility 5 | 6 | lightning__AppPage 7 | lightning__HomePage 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudSObjectToYamlUtil/dataCloudSObjectToYamlUtil.js-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 62.0 3 | true 4 | Data Cloud - sObject To YAML Util 5 | 6 | lightning__AppPage 7 | lightning__HomePage 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /scripts/apex-tests/table-tests.apex: -------------------------------------------------------------------------------- 1 | 2 | //String query = 'SELECT utl__Action__c, utl__Device_Type__c, utl__Status_Code__c, utl__Status_Reason__c, utl__Timestamp__c FROM utl__Smart_Device_Event_History__c LIMIT 100'; 3 | String query = 'SELECT NamedCredential.DeveloperName, NamedCredential.MasterLabel FROM NamedCredentialParameter WHERE ParameterName = \'Url\' ORDER BY ExternalCredential.MasterLabel'; 4 | 5 | 6 | String jsonString = new utl.Rst(true) 7 | .setEndpoint('/tooling/query?q=' + EncodingUtil.urlEncode(query, 'UTF-8')) 8 | .call() 9 | .getResponse() 10 | .getBody(); 11 | 12 | 13 | System.debug( 14 | new utl.JsnTbl() 15 | .setAttributeFilter(new Set{'totalSize','done','attributes','size','queryLocator', 'entityTypeName'}) 16 | .setListNameFilter(new Set{'records'}) 17 | .create(JSON.deserializeUntyped(jsonString)) 18 | .getConsoleString() 19 | ); -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudStreamingIngestionUtil/dataCloudStreamingIngestionUtil.js-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 62.0 3 | true 4 | Data Cloud - Streaming Ingestion Utility 5 | 6 | lightning__AppPage 7 | lightning__HomePage 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /force-app/package/core/permissionsets/Lightweight_Data_Cloud_Util.permissionset-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Dc 5 | true 6 | 7 | 8 | true 9 | Data_Cloud_Ingestion_API_Configuration__mdt 10 | 11 | 12 | true 13 | Data_Cloud_Ingestion_API_Field_Mapping__mdt 14 | 15 | Access required to the "Lightweight - Data Cloud Util" Core functions 16 | false 17 | Lightweight - Data Cloud Util 18 | 19 | -------------------------------------------------------------------------------- /force-app/package/core/objects/Data_Cloud_Ingestion_API_Configuration__mdt/fields/Salesforce_Named_Credential_Name__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Salesforce_Named_Credential_Name__c 4 | The name of the named credential that is used to connect to Salesforce. This is used to allow to connect to the data cloud host org. 5 | false 6 | DeveloperControlled 7 | The name of the named credential that is used to connect to Salesforce. This is used to allow to connect to the data cloud host org. 8 | Salesforce Named Credential Name 9 | 80 10 | false 11 | Text 12 | false 13 | 14 | -------------------------------------------------------------------------------- /force-app/demo/package/applications/Smart_Device_Event_Demo.app-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | #0070D2 5 | false 6 | 7 | Demo to stream smart device events in to Data Cloud 8 | Small 9 | Large 10 | true 11 | true 12 | false 13 | Smart Device Event Demo 14 | Standard 15 | Smart_Device_Home 16 | Smart_Device_Event_History__c 17 | Lightning 18 | Smart_Device_Demo_UtilityBar 19 | 20 | -------------------------------------------------------------------------------- /force-app/demo/package/customMetadata/utl__Data_Cloud_Ingestion_API_Field_Mapping.BM_01.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | utl__Action__c 4 | false 5 | 6 | utl__Data_Cloud_Field_Type__c 7 | textField 8 | 9 | 10 | utl__Data_Cloud_Ingestion_API_Configuration__c 11 | Smart_Device_Event_Bulk 12 | 13 | 14 | utl__Source__c 15 | Action__c 16 | 17 | 18 | utl__Target__c 19 | Action 20 | 21 | 22 | -------------------------------------------------------------------------------- /force-app/demo/package/customMetadata/utl__Data_Cloud_Ingestion_API_Field_Mapping.SM_01.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Action__c 4 | false 5 | 6 | utl__Data_Cloud_Field_Type__c 7 | textField 8 | 9 | 10 | utl__Data_Cloud_Ingestion_API_Configuration__c 11 | Smart_Device_Event_Streaming 12 | 13 | 14 | utl__Source__c 15 | Action__c 16 | 17 | 18 | utl__Target__c 19 | Action 20 | 21 | 22 | -------------------------------------------------------------------------------- /force-app/demo/package/customMetadata/utl__Data_Cloud_Ingestion_API_Field_Mapping.SM_07.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ReplayId 4 | false 5 | 6 | utl__Data_Cloud_Field_Type__c 7 | textField 8 | 9 | 10 | utl__Data_Cloud_Ingestion_API_Configuration__c 11 | Smart_Device_Event_Streaming 12 | 13 | 14 | utl__Source__c 15 | ReplayId 16 | 17 | 18 | utl__Target__c 19 | ReplayId 20 | 21 | 22 | -------------------------------------------------------------------------------- /force-app/demo/package/customMetadata/utl__Data_Cloud_Ingestion_API_Field_Mapping.BM_07.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | utl__ReplayId__c 4 | false 5 | 6 | utl__Data_Cloud_Field_Type__c 7 | textField 8 | 9 | 10 | utl__Data_Cloud_Ingestion_API_Configuration__c 11 | Smart_Device_Event_Bulk 12 | 13 | 14 | utl__Source__c 15 | ReplayId__c 16 | 17 | 18 | utl__Target__c 19 | ReplayId 20 | 21 | 22 | -------------------------------------------------------------------------------- /force-app/demo/package/customMetadata/utl__Data_Cloud_Ingestion_API_Field_Mapping.SM_06.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | EventUuid 4 | false 5 | 6 | utl__Data_Cloud_Field_Type__c 7 | uuidField 8 | 9 | 10 | utl__Data_Cloud_Ingestion_API_Configuration__c 11 | Smart_Device_Event_Streaming 12 | 13 | 14 | utl__Source__c 15 | EventUuid 16 | 17 | 18 | utl__Target__c 19 | EventUuid 20 | 21 | 22 | -------------------------------------------------------------------------------- /force-app/demo/package/customMetadata/utl__Data_Cloud_Ingestion_API_Field_Mapping.BM_06.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | utl__EventUuid__c 4 | false 5 | 6 | utl__Data_Cloud_Field_Type__c 7 | uuidField 8 | 9 | 10 | utl__Data_Cloud_Ingestion_API_Configuration__c 11 | Smart_Device_Event_Bulk 12 | 13 | 14 | utl__Source__c 15 | EventUuid__c 16 | 17 | 18 | utl__Target__c 19 | EventUuid 20 | 21 | 22 | -------------------------------------------------------------------------------- /force-app/demo/package/customMetadata/utl__Data_Cloud_Ingestion_API_Field_Mapping.BM_08.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | utl__Event_Date__c 4 | false 5 | 6 | utl__Data_Cloud_Field_Type__c 7 | dateField 8 | 9 | 10 | utl__Data_Cloud_Ingestion_API_Configuration__c 11 | Smart_Device_Event_Bulk 12 | 13 | 14 | utl__Source__c 15 | Event_Date__c 16 | 17 | 18 | utl__Target__c 19 | Event_Date 20 | 21 | 22 | -------------------------------------------------------------------------------- /force-app/demo/package/customMetadata/utl__Data_Cloud_Ingestion_API_Field_Mapping.SM_08.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Event Date 4 | false 5 | 6 | utl__Data_Cloud_Field_Type__c 7 | dateField 8 | 9 | 10 | utl__Data_Cloud_Ingestion_API_Configuration__c 11 | Smart_Device_Event_Streaming 12 | 13 | 14 | utl__Source__c 15 | Event_Date__c 16 | 17 | 18 | utl__Target__c 19 | Event_Date 20 | 21 | 22 | -------------------------------------------------------------------------------- /scripts/apex-tests/soql_query.soql: -------------------------------------------------------------------------------- 1 | SELECT 2 | Id, Name, Owner.Name, Owner.Profile.Name, 3 | ( 4 | SELECT 5 | Id, AccountId, FirstName, LastName, Owner.Profile.Name 6 | FROM 7 | contacts 8 | LIMIT 10 9 | ), 10 | ( 11 | SELECT 12 | Id, AccountId, Name, StageName, CloseDate, Owner.Profile.Name 13 | FROM 14 | opportunities 15 | LIMIT 10 16 | ) 17 | FROM 18 | Account 19 | LIMIT 10 20 | 21 | 22 | SELECT 23 | ExternalCredential.DeveloperName, 24 | ExternalCredential.MasterLabel, 25 | ExternalCredential.Description, 26 | ExternalCredential.AuthenticationProtocol, 27 | SequenceNumber, 28 | ParameterType, 29 | ParameterName, 30 | ParameterValue, 31 | Description, 32 | Certificate.DeveloperName 33 | FROM 34 | ExternalCredentialParameter 35 | ORDER BY 36 | ExternalCredential.DeveloperName, 37 | SequenceNumber, 38 | ParameterType, 39 | ParameterName -------------------------------------------------------------------------------- /force-app/demo/package/customMetadata/utl__Data_Cloud_Ingestion_API_Field_Mapping.BM_02.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | utl__Device_Type__c 4 | false 5 | 6 | utl__Data_Cloud_Field_Type__c 7 | textField 8 | 9 | 10 | utl__Data_Cloud_Ingestion_API_Configuration__c 11 | Smart_Device_Event_Bulk 12 | 13 | 14 | utl__Source__c 15 | Device_Type__c 16 | 17 | 18 | utl__Target__c 19 | Device_Type 20 | 21 | 22 | -------------------------------------------------------------------------------- /force-app/demo/package/customMetadata/utl__Data_Cloud_Ingestion_API_Field_Mapping.BM_03.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | utl__Status_Code__c 4 | false 5 | 6 | utl__Data_Cloud_Field_Type__c 7 | numberField 8 | 9 | 10 | utl__Data_Cloud_Ingestion_API_Configuration__c 11 | Smart_Device_Event_Bulk 12 | 13 | 14 | utl__Source__c 15 | Status_Code__c 16 | 17 | 18 | utl__Target__c 19 | Status_Code 20 | 21 | 22 | -------------------------------------------------------------------------------- /force-app/demo/package/customMetadata/utl__Data_Cloud_Ingestion_API_Field_Mapping.BM_05.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | utl__Timestamp__c 4 | false 5 | 6 | utl__Data_Cloud_Field_Type__c 7 | dateTimeField 8 | 9 | 10 | utl__Data_Cloud_Ingestion_API_Configuration__c 11 | Smart_Device_Event_Bulk 12 | 13 | 14 | utl__Source__c 15 | Timestamp__c 16 | 17 | 18 | utl__Target__c 19 | Timestamp 20 | 21 | 22 | -------------------------------------------------------------------------------- /force-app/demo/package/customMetadata/utl__Data_Cloud_Ingestion_API_Field_Mapping.SM_02.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Device_Type__c 4 | false 5 | 6 | utl__Data_Cloud_Field_Type__c 7 | textField 8 | 9 | 10 | utl__Data_Cloud_Ingestion_API_Configuration__c 11 | Smart_Device_Event_Streaming 12 | 13 | 14 | utl__Source__c 15 | Device_Type__c 16 | 17 | 18 | utl__Target__c 19 | Device_Type 20 | 21 | 22 | -------------------------------------------------------------------------------- /force-app/demo/package/customMetadata/utl__Data_Cloud_Ingestion_API_Field_Mapping.SM_03.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Status_Code__c 4 | false 5 | 6 | utl__Data_Cloud_Field_Type__c 7 | numberField 8 | 9 | 10 | utl__Data_Cloud_Ingestion_API_Configuration__c 11 | Smart_Device_Event_Streaming 12 | 13 | 14 | utl__Source__c 15 | Status_Code__c 16 | 17 | 18 | utl__Target__c 19 | Status_Code 20 | 21 | 22 | -------------------------------------------------------------------------------- /force-app/demo/package/customMetadata/utl__Data_Cloud_Ingestion_API_Field_Mapping.SM_05.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Timestamp__c 4 | false 5 | 6 | utl__Data_Cloud_Field_Type__c 7 | dateTimeField 8 | 9 | 10 | utl__Data_Cloud_Ingestion_API_Configuration__c 11 | Smart_Device_Event_Streaming 12 | 13 | 14 | utl__Source__c 15 | Timestamp__c 16 | 17 | 18 | utl__Target__c 19 | Timestamp 20 | 21 | 22 | -------------------------------------------------------------------------------- /force-app/demo/package/customMetadata/utl__Data_Cloud_Ingestion_API_Field_Mapping.BM_04.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | utl__Status_Reason__c 4 | false 5 | 6 | utl__Data_Cloud_Field_Type__c 7 | textField 8 | 9 | 10 | utl__Data_Cloud_Ingestion_API_Configuration__c 11 | Smart_Device_Event_Bulk 12 | 13 | 14 | utl__Source__c 15 | Status_Reason__c 16 | 17 | 18 | utl__Target__c 19 | Status_Reason 20 | 21 | 22 | -------------------------------------------------------------------------------- /force-app/demo/package/customMetadata/utl__Data_Cloud_Ingestion_API_Field_Mapping.SM_04.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Status_Reason__c 4 | false 5 | 6 | utl__Data_Cloud_Field_Type__c 7 | textField 8 | 9 | 10 | utl__Data_Cloud_Ingestion_API_Configuration__c 11 | Smart_Device_Event_Streaming 12 | 13 | 14 | utl__Source__c 15 | Status_Reason__c 16 | 17 | 18 | utl__Target__c 19 | Status_Reason 20 | 21 | 22 | -------------------------------------------------------------------------------- /force-app/demo/package/lwc/smartDeviceEventDemo/smartDeviceEventDemo.js-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 62.0 3 | true 4 | Smart Device Event Demo 5 | Demo for the showcasing for sending events directly to Data Cloud 6 | 7 | lightning__AppPage 8 | lightning__RecordPage 9 | lightning__Tab 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # This file is used for Git repositories to specify intentionally untracked files that Git should ignore. 2 | # If you are not using git, you can delete this file. For more information see: https://git-scm.com/docs/gitignore 3 | # For useful gitignore templates see: https://github.com/github/gitignore 4 | 5 | #Demo data for my own tests so api keys wont go public, even though they are dummy ones 6 | force-app/connection/ 7 | force-app/tdx-demo/ 8 | 9 | 10 | # Salesforce cache 11 | .sf/ 12 | .sfdx/ 13 | .vscode/ 14 | .localdevserver/ 15 | deploy-options.json 16 | 17 | # LWC VSCode autocomplete 18 | **/lwc/jsconfig.json 19 | 20 | # LWC Jest coverage reports 21 | coverage/ 22 | 23 | # Logs 24 | logs 25 | *.log 26 | npm-debug.log* 27 | yarn-debug.log* 28 | yarn-error.log* 29 | 30 | # Dependency directories 31 | node_modules/ 32 | 33 | # Eslint cache 34 | .eslintcache 35 | 36 | # MacOS system files 37 | .DS_Store 38 | 39 | # Windows system files 40 | Thumbs.db 41 | ehthumbs.db 42 | [Dd]esktop.ini 43 | $RECYCLE.BIN/ 44 | 45 | # Local environment variables 46 | .env -------------------------------------------------------------------------------- /force-app/package/core/objects/Data_Cloud_Ingestion_API_Configuration__mdt/fields/Named_Credential_Name__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Named_Credential_Name__c 4 | The name of the named credential that is used to connect to Data Cloud. This is used to connect to the Data Cloud API, NOT the Salesforce API. This is a separate named credential and required for any data cloud action. 5 | false 6 | DeveloperControlled 7 | The name of the named credential that is used to connect to Data Cloud. This is used to connect to the Data Cloud API, NOT the Salesforce API. This is a separate named credential and required for any data cloud action. 8 | Named Credential Name 9 | 255 10 | true 11 | Text 12 | false 13 | 14 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2023 Justus van den Berg (jfwberg@gmail.com) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /scripts/08_setup_connection.bat: -------------------------------------------------------------------------------- 1 | REM 00 - Add certificate from the JKS 2 | 3 | REM 01 - Update the executing user 4 | sf org display user 5 | 6 | REM 02 - Update the executing user in the auth provider 7 | 8 | REM 03 - Update the force ignore file (Comment the connection section) 9 | 10 | REM 04 - Potentially remove or add the utl__ namespace in the permission set 11 | 12 | REM 05 - Deploy the custom implementation files 13 | sf project deploy start --source-dir force-app/connection/ukta_dc_org 14 | sf project deploy start --source-dir force-app/connection/tdx_dc_org 15 | sf project deploy start --source-dir force-app/connection/ac2_dc_org 16 | 17 | REM 06 - Assign the permission set 18 | sf org assign permset --name "UKTA_DC_ORG" 19 | sf org assign permset --name "UKTA_SF_ORG" 20 | sf org assign permset --name "TDX_DC_ORG" 21 | sf org assign permset --name "TDX_SF_ORG" 22 | sf org assign permset --name "AC2_DC_ORG" 23 | sf org assign permset --name "AC2_SF_ORG" 24 | 25 | REM 07 - Fix the force ignore again 26 | REM 06 - Connect the external credential in setup 27 | REM 07 - Run test Apex -------------------------------------------------------------------------------- /force-app/package/core/customMetadata/Data_Cloud_Ingestion_API_Field_Mapping.Apex_Unit_Test_Id.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Apex_Unit_Test_Id 4 | true 5 | 6 | Data_Cloud_Field_Type__c 7 | textField 8 | 9 | 10 | Data_Cloud_Ingestion_API_Configuration__c 11 | Apex_Unit_Test 12 | 13 | 14 | Source__c 15 | Id 16 | 17 | 18 | Target__c 19 | Target_Id 20 | 21 | 22 | Is_Primary_Key__c 23 | true 24 | 25 | 26 | -------------------------------------------------------------------------------- /force-app/package/ui/permissionsets/Lightweight_Data_Cloud_Util_UI.permissionset-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Data_Cloud_Util 5 | true 6 | 7 | 8 | DataCloudUtilLwcCtrl 9 | true 10 | 11 | Access required to the "Lightweight - Data Cloud Util" UI functions 12 | false 13 | Lightweight - Data Cloud Util - UI 14 | 15 | Data_Cloud_Ingestion 16 | Visible 17 | 18 | 19 | Data_Cloud_Query 20 | Visible 21 | 22 | 23 | Data_Cloud_Utility 24 | Visible 25 | 26 | 27 | -------------------------------------------------------------------------------- /force-app/package/core/customMetadata/Data_Cloud_Ingestion_API_Field_Mapping.Apex_Unit_Test_Username.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Apex_Unit_Test_Username 4 | true 5 | 6 | Data_Cloud_Field_Type__c 7 | textField 8 | 9 | 10 | Data_Cloud_Ingestion_API_Configuration__c 11 | Apex_Unit_Test 12 | 13 | 14 | Source__c 15 | Username 16 | 17 | 18 | Target__c 19 | Target_Username 20 | 21 | 22 | Is_Event_Time_Field__c 23 | true 24 | 25 | 26 | -------------------------------------------------------------------------------- /scripts/apex-tests/test_connection.apex: -------------------------------------------------------------------------------- 1 | /** 2 | * SIMPLE EXAMPLE 3 | */ 4 | // Query callout to named credential with error handling 5 | utl.Rst callout = new utl.Rst('UKTA_DC_ORG', true) 6 | .setHandleSfEndpoint(false) 7 | .setEndpoint('/api/v2/query') 8 | .setMethod('POST') 9 | .setBody('{"sql" : "SELECT ssot__Id__c, ssot__Name__c, ssot__Number__c, ssot__AccountTypeId__c, ssot__BillContactAddressId__c, ssot__CreatedDate__c, ssot__DataSourceId__c, ssot__DataSourceObjectId__c FROM ssot__Account__dlm LIMIT 1"}') 10 | .call() 11 | ; 12 | 13 | System.debug(callout.getResponse().getBody()); 14 | 15 | // Create a datatable 16 | utl.JsnTbl table = new utl.JsnTbl() 17 | .setAttributeFilter(new Set{'startTime','endTime','rowCount','queryId','done','metadata','nextBatchId'}) 18 | .setListNameFilter(new Set{'data'}) 19 | .create(JSON.deserializeUntyped(callout.getResponse().getBody())) 20 | .updateColumnNames(new Set{'Id','Name','Number','Account Type Id','Billing Address Id','Created Date','Data Source Id','Data Source Object'}) 21 | ; 22 | 23 | // Data table output in the console 24 | System.debug('\n' + table.getConsoleString()); -------------------------------------------------------------------------------- /force-app/package/ui/flexipages/Data_Cloud_Utility.flexipage-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | dataCloudSObjectToCsvUtil 7 | utl_dataCloudSObjectToCsvUtil 8 | 9 | 10 | column1 11 | Region 12 | 13 | 14 | 15 | 16 | dataCloudSObjectToYamlUtil 17 | utl_dataCloudSObjectToYamlUtil 18 | 19 | 20 | column2 21 | Region 22 | 23 | Data Cloud Utilities 24 | 25 | flexipage:appHomeTemplateTwoColumns 26 | 27 | AppPage 28 | 29 | -------------------------------------------------------------------------------- /force-app/demo/package/lwc/smartDeviceEventDemo/smartDeviceEventDemo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Create a new Smart Device Event 5 | 6 | 7 | 8 | 9 | 10 | 15 | 16 | 17 | 24 | 25 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /force-app/package/ui/applications/Data_Cloud_Util.app-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | #301D72 5 | dc_util_logo_1 6 | 1 7 | false 8 | 9 | Lightweight - Data Cloud Util Package 10 | Small 11 | Large 12 | true 13 | true 14 | false 15 | false 16 | Data Cloud Util 17 | Standard 18 | Data_Cloud_Ingestion 19 | Data_Cloud_Query 20 | Data_Cloud_Utility 21 | Data_Cloud_JSON_Utility 22 | Lightning 23 | Data_Cloud_Utility_UtilityBar 24 | 25 | -------------------------------------------------------------------------------- /force-app/package/ui/flexipages/Data_Cloud_Ingestion.flexipage-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | dataCloudBulkIngestionUtil 7 | utl_dataCloudBulkIngestionUtil 8 | 9 | 10 | column1 11 | Region 12 | 13 | 14 | 15 | 16 | dataCloudStreamingIngestionUtil 17 | utl_dataCloudStreamingIngestionUtil 18 | 19 | 20 | column2 21 | Region 22 | 23 | Data Cloud Ingestion 24 | 25 | flexipage:appHomeTemplateTwoColumns 26 | 27 | AppPage 28 | 29 | -------------------------------------------------------------------------------- /force-app/demo/package/customMetadata/utl__Data_Cloud_Ingestion_API_Configuration.Smart_Device_Event_Bulk.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Smart Device Event (Bulk) 4 | false 5 | 6 | utl__Ingestion_API_Connector_Name__c 7 | Smart_Device_Connector 8 | 9 | 10 | utl__Ingestion_API_Target_Object_Name__c 11 | Smart_Device_Event 12 | 13 | 14 | utl__Named_Credential_Name__c 15 | UKTA_DC_ORG 16 | 17 | 18 | utl__Salesforce_Named_Credential_Name__c 19 | UKTA_SF_ORG 20 | 21 | 22 | utl__sObject_Name__c 23 | Smart_Device_Event_History__c 24 | 25 | 26 | -------------------------------------------------------------------------------- /force-app/demo/package/customMetadata/utl__Data_Cloud_Ingestion_API_Configuration.Smart_Device_Event_Streaming.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Smart Device Event (Streaming) 4 | false 5 | 6 | utl__Ingestion_API_Connector_Name__c 7 | Smart_Device_Connector 8 | 9 | 10 | utl__Ingestion_API_Target_Object_Name__c 11 | Smart_Device_Event 12 | 13 | 14 | utl__Named_Credential_Name__c 15 | UKTA_DC_ORG 16 | 17 | 18 | utl__Salesforce_Named_Credential_Name__c 19 | UKTA_SF_ORG 20 | 21 | 22 | utl__sObject_Name__c 23 | Smart_Device_Event__e 24 | 25 | 26 | -------------------------------------------------------------------------------- /force-app/package/ui/flexipages/Data_Cloud_Query.flexipage-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Run Data Cloud Queries and Graph API from a sample LWC component 4 | 5 | 6 | 7 | dataCloudQueryUtil 8 | utl_dataCloudQueryUtil 9 | 10 | 11 | column1 12 | Region 13 | 14 | 15 | 16 | 17 | dataCloudDataGraphUtil 18 | utl_dataCloudDataGraphUtil 19 | 20 | 21 | column2 22 | Region 23 | 24 | Data Cloud Query 25 | 26 | flexipage:appHomeTemplateTwoColumns 27 | 28 | AppPage 29 | 30 | -------------------------------------------------------------------------------- /force-app/package/core/customMetadata/Data_Cloud_Ingestion_API_Configuration.Apex_Unit_Test.md-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Apex Unit Test 4 | true 5 | 6 | Ingestion_API_Connector_Name__c 7 | Apex_Unit_Test 8 | 9 | 10 | Ingestion_API_Target_Object_Name__c 11 | Apex_Unit_Test 12 | 13 | 14 | Named_Credential_Name__c 15 | Apex_Unit_Test 16 | 17 | 18 | Salesforce_Named_Credential_Name__c 19 | Apex_Unit_Test 20 | 21 | 22 | sObject_Name__c 23 | User 24 | 25 | 26 | Data_Lake_Object_Name__c 27 | Data_Lake_Object__dll 28 | 29 | 30 | -------------------------------------------------------------------------------- /scripts/02_package_create_managed.bat: -------------------------------------------------------------------------------- 1 | REM ***************************** 2 | REM PACKAGE CREATION 3 | REM ***************************** 4 | 5 | REM Package Create Config 6 | SET devHub=devHubAlias 7 | SET packageName=Lightweight - Data Cloud Util 8 | SET packageDescription=A lightweight set of Data Cloud API and mapping utilities for streaming and bulk data ingestion. 9 | SET packageType=Managed 10 | SET packagePath=force-app/package 11 | 12 | REM Package Config 13 | SET packageId=0HoP300000000BJKAY 14 | SET packageVersionId=04tP30000012T5NIAU 15 | 16 | REM Create package 17 | sf package create --name "%packageName%" --description "%packageDescription%" --package-type "%packageType%" --path "%packagePath%" --target-dev-hub %devHub% 18 | 19 | REM Create package version 20 | sf package version create --package "%packageName%" --target-dev-hub %devHub% --code-coverage --installation-key-bypass --wait 30 21 | 22 | REM Delete package 23 | sf package:delete -p %packageId% --target-dev-hub %devHub% --no-prompt 24 | 25 | REM Delete package version 26 | sf package:version:delete -p %packageVersionId% --target-dev-hub %devHub% --no-prompt 27 | 28 | REM Promote package version 29 | sf package:version:promote -p %packageVersionId% --target-dev-hub %devHub% --no-prompt 30 | 31 | REM /packaging/installPackage.apexp?p0=04tP30000012T5NIAU -------------------------------------------------------------------------------- /scripts/03_package_create_unlocked.bat: -------------------------------------------------------------------------------- 1 | REM ***************************** 2 | REM PACKAGE CREATION 3 | REM ***************************** 4 | 5 | REM Package Create Config 6 | SET devHub=devHubAlias 7 | SET packageName=Lightweight - Data Cloud Util (Unlocked) 8 | SET packageDescription=A lightweight set of Data Cloud API and mapping utilities for streaming and bulk data ingestion. 9 | SET packageType=Unlocked 10 | SET packagePath=force-app/package 11 | 12 | REM Package Config 13 | SET packageId=0HoP300000000CvKAI 14 | SET packageVersionId=04tP30000012T6zIAE 15 | 16 | REM Create package 17 | sf package create --name "%packageName%" --description "%packageDescription%" --package-type "%packageType%" --path "%packagePath%" --target-dev-hub %devHub% 18 | 19 | REM Create package version 20 | sf package version create --package "%packageName%" --target-dev-hub %devHub% --code-coverage --installation-key-bypass --wait 30 21 | 22 | REM Delete package 23 | sf package:delete -p %packageId% --target-dev-hub %devHub% --no-prompt 24 | 25 | REM Delete package version 26 | sf package:version:delete -p %packageVersionId% --target-dev-hub %devHub% --no-prompt 27 | 28 | REM Promote package version 29 | sf package:version:promote -p %packageVersionId% --target-dev-hub %devHub% --no-prompt 30 | 31 | REM /packaging/installPackage.apexp?p0=04tP30000012T6zIAE -------------------------------------------------------------------------------- /scripts/apex-tests/streaming test.apex: -------------------------------------------------------------------------------- 1 | // Does not send any data, but just tests the payload 2 | Boolean testPayloadFormat = false; 3 | 4 | // Configuration 5 | String namedCredentialName = 'TDX_DC_ORG'; 6 | String ingestionApiName = 'Smart_Bill'; 7 | String ingestionApiObjectName = 'Smart_Bill'; 8 | 9 | // Create a payload 10 | String streamingIngestionPayload = JSON.serializePretty(new Map>>{ 11 | 'data' => new List>{ 12 | new Map{ 13 | 'Amount' => 'id', 14 | 'Id' => utl.Rst.Guid(), 15 | 'UUID' => utl.Rst.Guid(), 16 | 'CreatedDate' => String.valueOf(Datetime.now()), 17 | 'Name' => JSON.serialize([SELECT Id FROM User WHERE Id = :UserInfo.getUserId()]), 18 | 'Invoice_Date' => String.valueOf(Date.today()) 19 | } 20 | } 21 | }); 22 | 23 | // Create the request endpoint based on the NC and Named Credential details 24 | HttpRequest request = new HttpRequest(); 25 | request.setEndPoint(String.format( 26 | 'callout:{0}/api/v1/ingest/sources/{1}/{2}{3}', 27 | new String[]{ 28 | namedCredentialName, 29 | ingestionApiName, 30 | ingestionApiObjectName, 31 | (testPayloadFormat) ? '/actions/test' : '' 32 | } 33 | )); 34 | request.setHeader('Content-Type','application/json'); 35 | request.setMethod('POST'); 36 | request.setBody(streamingIngestionPayload); 37 | 38 | // Execute 39 | HttpResponse res = new HTTP().send(request); 40 | System.debug(res.getStatusCode()); 41 | System.debug(res.getBody()); -------------------------------------------------------------------------------- /scripts/apex-tests/testIngestionApiStreaming.apex: -------------------------------------------------------------------------------- 1 | // Configuration 2 | String namedCredentialName = 'TDX_DC_ORG'; 3 | String ingestionApiName = 'Smart_Bill'; 4 | String ingestionApiObjectName = 'Smart_Bill' 5 | 6 | // Does not send any data, but just tests the payload 7 | Boolean testPayloadFormat = true; 8 | 9 | // Update the body JSON according to your ingestion API objects 10 | // This is the streaming API payload (terrible way of doing it, but you can fix that) 11 | String body = ''; 12 | body += '{'; 13 | body += ' "data" :[ {'; 14 | body += ' "Amount" : 12345,'; 15 | body += ' "Id" : "82aec0cc922017d",'; 16 | body += ' "UUID" : "8bb7cabc-1111-2222-a86a-b701fa2d881b",'; 17 | body += ' "CreatedDate" : "2024-07-06T03:09:27.017Z",'; 18 | body += ' "CreatedDate" : "2024-07-06T03:09:27.017Z",'; 19 | body += ' "Name" : "1dc682a4d2d82f2",'; 20 | body += ' "Invoice_Date": "2024-04-11"'; 21 | body += ' }]'; 22 | body += '}'; 23 | 24 | // Create the request endpoint based on the NC and Named Credential details 25 | HttpRequest request = new HttpRequest(); 26 | request.setEndPoint(String.format( 27 | 'callout:{0}/api/v1/ingest/sources/{1}/{2}{3}', 28 | new String[]{ 29 | namedCredentialName, 30 | ingestionApiName, 31 | ingestionApiObjectName, 32 | (testPayloadFormat) ? '/actions/test' : '' 33 | } 34 | )); 35 | request.setHeader('Content-Type','application/json'); 36 | request.setMethod('POST'); 37 | request.setBody(body); 38 | 39 | // Execute 40 | HttpResponse res = new HTTP().send(request); 41 | System.debug(res.getStatusCode()); 42 | System.debug(res.getBody()); -------------------------------------------------------------------------------- /force-app/demo/package/lwc/smartDeviceEventDemo/smartDeviceEventDemo.js: -------------------------------------------------------------------------------- 1 | import { LightningElement} from "lwc"; 2 | import createSmartEvent from "@salesforce/apex/SmartDeviceEventDemoLwcCtrl.createSmartEvent"; 3 | import LightningAlert from 'lightning/alert'; 4 | 5 | export default class SmartDeviceEventDemo extends LightningElement { 6 | 7 | 8 | device = 'Lightbulb'; 9 | action = 'on'; 10 | 11 | get deviceOptions() { 12 | return [ 13 | { label: 'Lightbulb', value: 'Lightbulb' }, 14 | { label: 'Heating', value: 'Heating'}, 15 | { label: 'Car Charger', value: 'Car Charger'} 16 | ]; 17 | } 18 | 19 | get actionOptions() { 20 | return [ 21 | { label: 'On', value: 'on' }, 22 | { label: 'Off', value: 'off'} 23 | ]; 24 | } 25 | 26 | handleChangeAction(event) { 27 | this.action = event.detail.value; 28 | } 29 | 30 | handleChangeDevice(event) { 31 | this.device = event.detail.value; 32 | } 33 | 34 | handleClickCreate() { 35 | try{ 36 | createSmartEvent({ device: this.device, action:this.action}) 37 | .then((result) => { 38 | LightningAlert.open({ 39 | message: result, 40 | label: 'Success', 41 | theme : 'success' 42 | }); 43 | }) 44 | .catch((error) => { 45 | LightningAlert.open({ 46 | message: 'An unexpected error occurred: ' + error.body.message, 47 | label: 'Error', 48 | theme : 'error' 49 | }); 50 | }); 51 | }catch(error){ 52 | LightningAlert.open({ 53 | message: 'An unexpected error occurred: ' + error.body.message, 54 | label: 'Error', 55 | theme : 'error' 56 | }); 57 | } 58 | } 59 | 60 | 61 | 62 | } -------------------------------------------------------------------------------- /force-app/demo/package/classes/SmartDeviceEventDemoLwcCtrl.cls: -------------------------------------------------------------------------------- 1 | @SuppressWarnings('PMD.ApexDoc') 2 | public with sharing class SmartDeviceEventDemoLwcCtrl { 3 | 4 | @AuraEnabled 5 | public static string createSmartEvent(String device, String action){ 6 | try { 7 | // Create a new platform event 8 | EventBus.publish(new Smart_Device_Event__e( 9 | Action__c = 'Switch State', 10 | Event_Date__c = Date.today(), 11 | Device_Type__c = Device, 12 | Status_Code__c = (action == 'on') ? 1 : 0, 13 | Status_Reason__c = 'Switched device "'+device+'" to state "'+action+'"', 14 | Timestamp__c = Datetime.now() 15 | )); 16 | 17 | // Return the success message 18 | return 'Successfully updated the state for device "'+device+'" to "'+action+'"'; 19 | 20 | } catch (Exception e) { 21 | throw new AuraHandledException(e.getMessage()); 22 | } 23 | } 24 | 25 | @SuppressWarnings('PMD.ApexCRUDViolation') 26 | public static void createHistoryRecordsFromEvent(Smart_Device_Event__e[] records){ 27 | 28 | // This will create a copy in the local table so we can cross check 29 | Smart_Device_Event_History__c[] historyRecords = new Smart_Device_Event_History__c[]{}; 30 | 31 | for(Smart_Device_Event__e record : records){ 32 | historyRecords.add(new Smart_Device_Event_History__c( 33 | Action__c = record.Action__c, 34 | Event_Date__c = record.Event_Date__c, 35 | Device_Type__c = record.Device_Type__c, 36 | Status_Code__c = record.Status_Code__c, 37 | Status_Reason__c= record.Status_Reason__c, 38 | Timestamp__c = record.Timestamp__c, 39 | EventUuid__c = record.EventUuid, 40 | ReplayId__c = record.ReplayId 41 | )); 42 | } 43 | insert historyRecords; 44 | } 45 | } -------------------------------------------------------------------------------- /scripts/apex-tests/field_metadata.apex: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | // Cast the response as an object so we can get both the data and metadata 5 | Map response = (Map) JSON.deserializeUntyped( 6 | Dc.executeQuery( 7 | 'TDX_DC_ORG', 8 | 'SELECT DateField__c, EmailField__c, TextField__c, BooleanField__c, UrlField__c, Name__c, PercentField__c, Id__c, PhoneField__c, UUID__c, CreatedDate__c, DateTimeField__c, NumberField__c FROM Smart_Bill_02_Smart_Bill_3FCF6D01__dll LIMIT 10' 9 | ) 10 | .getResponse() 11 | .getBody() 12 | ); 13 | 14 | 15 | System.debug(JSON.serializePretty( 16 | Dc.getFieldMetadata(utl.Jsn.getObjectMap('metadata', response), false) 17 | )); 18 | 19 | /* 20 | [ { 21 | "typeCode" : 3, 22 | "type" : "DECIMAL", 23 | "placeInOrder" : 12, 24 | "name" : "NumberField__c" 25 | }, { 26 | "typeCode" : 12, 27 | "type" : "VARCHAR", 28 | "placeInOrder" : 5, 29 | "name" : "Name__c" 30 | }, { 31 | "typeCode" : 12, 32 | "type" : "VARCHAR", 33 | "placeInOrder" : 4, 34 | "name" : "UrlField__c" 35 | }, { 36 | "typeCode" : 12, 37 | "type" : "VARCHAR", 38 | "placeInOrder" : 9, 39 | "name" : "UUID__c" 40 | }, { 41 | "typeCode" : 3, 42 | "type" : "DECIMAL", 43 | "placeInOrder" : 6, 44 | "name" : "PercentField__c" 45 | }, { 46 | "typeCode" : 91, 47 | "type" : "DATE", 48 | "placeInOrder" : 0, 49 | "name" : "DateField__c" 50 | }, { 51 | "typeCode" : 2014, 52 | "type" : "TIMESTAMP WITH TIME ZONE", 53 | "placeInOrder" : 11, 54 | "name" : "DateTimeField__c" 55 | }, { 56 | "typeCode" : 12, 57 | "type" : "VARCHAR", 58 | "placeInOrder" : 1, 59 | "name" : "EmailField__c" 60 | }, { 61 | "typeCode" : 2014, 62 | "type" : "TIMESTAMP WITH TIME ZONE", 63 | "placeInOrder" : 10, 64 | "name" : "CreatedDate__c" 65 | }, { 66 | "typeCode" : 12, 67 | "type" : "VARCHAR", 68 | "placeInOrder" : 2, 69 | "name" : "TextField__c" 70 | }, { 71 | "typeCode" : 12, 72 | "type" : "VARCHAR", 73 | "placeInOrder" : 8, 74 | "name" : "PhoneField__c" 75 | }, { 76 | "typeCode" : 12, 77 | "type" : "VARCHAR", 78 | "placeInOrder" : 7, 79 | "name" : "Id__c" 80 | }, { 81 | "typeCode" : 12, 82 | "type" : "VARCHAR", 83 | "placeInOrder" : 3, 84 | "name" : "BooleanField__c" 85 | } ] 86 | */ -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudAddCsvModal/dataCloudAddCsvModal.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | 13 | 14 | 24 | 25 | 26 | 27 | 28 | 35 | 36 | 37 | Document Id: {document.id} 38 | Document Name: {document.name} 39 | Document Status: {document.status} 40 | Document Content Body Id: {document.contentBodyId} 41 | Document Content Version Id: {document.contentVersionId} 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /scripts/09_create_test_data.apex: -------------------------------------------------------------------------------- 1 | /** 2 | * Run 1 by 1 to prevent govenor limits 3 | */ 4 | insertAccounts(); 5 | insertContacts(); 6 | insertOpportunities(); 7 | 8 | public void insertAccounts(){ 9 | 10 | Account[] accounts = new Account[]{}; 11 | 12 | for (Integer i = 0; i < 4; i++) { 13 | 14 | // A postfix to keep track of what item we're dealing with 15 | String postfix = String.valueOf(i+1).leftPad(4,'0'); 16 | 17 | // Create a new account 18 | accounts.add(new Account( 19 | Name = 'Demo Account - ' + postfix 20 | )); 21 | } 22 | 23 | insert accounts; 24 | } 25 | 26 | 27 | public void insertContacts(){ 28 | Account[] accounts = [SELECT Id FROM Account WHERE Name LIKE 'Demo Account - %' ORDER BY Name ASC LIMIT 10]; 29 | Contact[] contacts = new Contact[]{}; 30 | 31 | 32 | for(integer i=0, max=accounts.size(); i 2 | 3 | 4 | 5 | 6 | 7 | collapsed 8 | false 9 | 10 | 11 | enableActionsConfiguration 12 | false 13 | 14 | 15 | enableActionsInNative 16 | false 17 | 18 | 19 | hideChatterActions 20 | false 21 | 22 | 23 | numVisibleActions 24 | 3 25 | 26 | force:highlightsPanel 27 | force_highlightsPanel 28 | 29 | 30 | Replace 31 | header 32 | Region 33 | 34 | 35 | 36 | 37 | force:detailPanel 38 | force_detailPanel 39 | 40 | 41 | Replace 42 | main 43 | Region 44 | 45 | 46 | Replace 47 | sidebar 48 | Region 49 | 50 | Smart Device Event History Record Page 51 | flexipage__default_rec_L 52 | Smart_Device_Event_History__c 53 | 54 | flexipage:recordHomeTemplateDesktop 55 | 56 | RecordPage 57 | 58 | -------------------------------------------------------------------------------- /force-app/package/core/objects/Data_Cloud_Ingestion_API_Field_Mapping__mdt/fields/Data_Cloud_Field_Type__c.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Data_Cloud_Field_Type__c 4 | 'textField' 5 | Indicator of the target field type 6 | false 7 | DeveloperControlled 8 | Data Cloud Field Type 9 | true 10 | Picklist 11 | 12 | true 13 | 14 | false 15 | 16 | textField 17 | true 18 | textField 19 | 20 | 21 | numberField 22 | false 23 | numberField 24 | 25 | 26 | dateTimeField 27 | false 28 | dateTimeField 29 | 30 | 31 | dateField 32 | false 33 | dateField 34 | 35 | 36 | uuidField 37 | false 38 | uuidField 39 | 40 | 41 | 42 | emailField 43 | false 44 | emailField 45 | 46 | 47 | urlField 48 | false 49 | urlField 50 | 51 | 52 | phoneField 53 | false 54 | phoneField 55 | 56 | 57 | percentField 58 | false 59 | percentField 60 | 61 | 62 | booleanField 63 | false 64 | booleanField 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudSObjectToYamlUtil/dataCloudSObjectToYamlUtil.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | Data Cloud - Create Ingestion API YAML from sObject 13 | 14 | 15 | 16 | 17 | 18 | 24 | 25 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 52 | 53 | 54 | 63 | 64 | 65 | 66 | 67 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /force-app/demo/package/permissionsets/Smart_Device_Event_Demo.permissionset-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Smart_Device_Event_Demo 5 | true 6 | 7 | 8 | true 9 | Smart_Device_Event_History__c.Action__c 10 | true 11 | 12 | 13 | true 14 | Smart_Device_Event_History__c.Device_Type__c 15 | true 16 | 17 | 18 | true 19 | Smart_Device_Event_History__c.EventUuid__c 20 | true 21 | 22 | 23 | true 24 | Smart_Device_Event_History__c.Event_Date__c 25 | true 26 | 27 | 28 | true 29 | Smart_Device_Event_History__c.ReplayId__c 30 | true 31 | 32 | 33 | true 34 | Smart_Device_Event_History__c.Status_Code__c 35 | true 36 | 37 | 38 | true 39 | Smart_Device_Event_History__c.Status_Reason__c 40 | true 41 | 42 | 43 | true 44 | Smart_Device_Event_History__c.Timestamp__c 45 | true 46 | 47 | false 48 | Smart Device Event Demo 49 | 50 | true 51 | true 52 | true 53 | true 54 | true 55 | Smart_Device_Event_History__c 56 | true 57 | 58 | 59 | true 60 | false 61 | false 62 | true 63 | false 64 | Smart_Device_Event__e 65 | false 66 | 67 | 68 | Smart_Device_Event_History__c 69 | Visible 70 | 71 | 72 | Smart_Device_Home 73 | Visible 74 | 75 | 76 | -------------------------------------------------------------------------------- /scripts/01_package_dependencies.bat: -------------------------------------------------------------------------------- 1 | REM -------------------------------------------------------- 2 | REM MANGED DEPENDENCIES (PICK EITHER MANAGED OR UNLOCKED) - 3 | REM -------------------------------------------------------- 4 | rem Lightweight - Apex Unit Test Util v2@2.5.0-2 5 | sf package install -p "04tP3000000rUmLIAU" -w 30 6 | 7 | REM Lightweight - Apex LWC Util@0.9.0-1 8 | sf package install --package "04tP30000012SvhIAE" -w 30 9 | 10 | rem Lightweight - REST Util@0.13.0-1 11 | sf package install -p "04tP3000000wMhhIAE" -w 30 12 | 13 | rem Lightweight - JSON Util@0.8.0-1 14 | sf package install -p "04tP3000000tDMPIA2" -w 30 15 | 16 | REM ----------------- OPTIONAL BUT ADVICED ----------------- 17 | rem Lightweight - Auth Provider Util v2@0.12.0-1 18 | sf package install -p "04tP3000000MVUzIAO" -w 30 19 | 20 | REM Lightweight - Data Cloud Auth Provider@0.6.0-1 21 | sf package install --package "04tP30000012U9VIAU" -w 30 22 | 23 | REM Lightweight - Salesforce Auth Provider@0.3.0-1 24 | sf package install --package "04tP3000000MCLtIAO" -w 30 25 | 26 | 27 | REM ------------------------------------------------------------------------------------------- 28 | REM UNLOCKED DEPENDENCIES (PICK EITHER MANAGED OR UNLOCKED) - 29 | REM ------------------------------------------------------------------------------------------- 30 | rem Lightweight - Apex Unit Test Util v2 (Unlocked)@2.5.0-2 31 | sf package install -p "04tP3000000rUpZIAU" -w 30 32 | 33 | REM Lightweight - Apex LWC Util@0.8.0-1 (Unlocked) 34 | sf package install --package "04tP3000000wL2TIAU" -w 30 35 | 36 | rem Lightweight - REST Util (Unlocked)@0.13.0-1 37 | sf package install -p "04tP3000000wMkvIAE" -w 30 38 | 39 | rem Lightweight - JSON Util (Unlocked)@0.9.0-1 40 | sf package install -p "04tP30000012SxJIAU" -w 30 41 | 42 | REM ----------------- OPTIONAL BUT ADVICED ----------------- 43 | rem Lightweight - Auth Provider Util v2 (Unlocked)@0.12.0-1 44 | sf package install -p "04tP3000000MW1FIAW" -w 30 45 | 46 | REM Lightweight - Data Cloud Auth Provider (Unlocked)@0.6.0-1 47 | sf package install --package "04tP30000012TuzIAE" -w 30 48 | 49 | REM Lightweight - Salesforce Auth Provider (Unlocked)@0.3.0-1 50 | sf package install --package "04tP3000000MCNVIA4" -w 30 51 | 52 | 53 | REM -------------------------------------------------------- 54 | REM ASSIGN PERMISSION SETS - 55 | REM -------------------------------------------------------- 56 | REM DEPENDENCIES 57 | sf org assign permset --name "Lightweight_Apex_Unit_Test_Util_v2" 58 | sf org assign permset --name "Lightweight_LWC_Util" 59 | sf org assign permset --name "Lightweight_JSON_Util" 60 | sf org assign permset --name "Lightweight_REST_Util" 61 | REM #sf org assign permset --name "Lightweight_SOAP_Util" 62 | 63 | REM OPTIONAL PACKAGES 64 | sf org assign permset --name "Lightweight_Auth_Provider_Util" 65 | sf org assign permset --name "Lightweight_Data_Cloud_Auth_Provider" 66 | sf org assign permset --name "Lightweight_Salesforce_Auth_Provider" 67 | 68 | REM POST CODE DEPLOYMENT 69 | sf org assign permset --name "Lightweight_Data_Cloud_Util" 70 | sf org assign permset --name "Lightweight_Data_Cloud_Util_UI" 71 | 72 | -------------------------------------------------------------------------------- /force-app/demo/package/layouts/Smart_Device_Event_History__c-Smart Device Event_History Layout.layout-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Submit 4 | 5 | false 6 | true 7 | true 8 | Information 9 | 10 | 11 | Edit 12 | Action__c 13 | 14 | 15 | Edit 16 | Device_Type__c 17 | 18 | 19 | Edit 20 | Status_Code__c 21 | 22 | 23 | Edit 24 | Status_Reason__c 25 | 26 | 27 | Edit 28 | Timestamp__c 29 | 30 | 31 | Edit 32 | Event_Date__c 33 | 34 | 35 | 36 | 37 | Edit 38 | EventUuid__c 39 | 40 | 41 | Edit 42 | ReplayId__c 43 | 44 | 45 | 46 | 47 | 48 | false 49 | true 50 | true 51 | System Information 52 | 53 | 54 | Readonly 55 | Name 56 | 57 | 58 | Readonly 59 | CreatedById 60 | 61 | 62 | 63 | 64 | Edit 65 | OwnerId 66 | 67 | 68 | Readonly 69 | LastModifiedById 70 | 71 | 72 | 73 | 74 | 75 | true 76 | false 77 | true 78 | Custom Links 79 | 80 | 81 | 82 | 83 | 84 | false 85 | false 86 | false 87 | false 88 | false 89 | 90 | 00hPv000000BiKH 91 | 4 92 | 0 93 | Default 94 | 95 | 96 | -------------------------------------------------------------------------------- /sfdx-project.json: -------------------------------------------------------------------------------- 1 | { 2 | "packageDirectories": [ 3 | { 4 | "path": "force-app/package", 5 | "default": true, 6 | "package": "Lightweight - Data Cloud Util", 7 | "versionName": "v62.0 - 0.11", 8 | "versionNumber": "0.11.0.NEXT", 9 | "ancestorVersion": "HIGHEST", 10 | "versionDescription": "A lightweight set of Data Cloud API and mapping utilities for streaming and bulk data ingestion.", 11 | "dependencies": [ 12 | { 13 | "package": "Lightweight - Apex Unit Test Util v2@2.5.0-1" 14 | }, 15 | { 16 | "package": "Lightweight - Apex LWC Util@0.9.0-1" 17 | }, 18 | { 19 | "package": "Lightweight - REST Util@0.13.0-1" 20 | }, 21 | { 22 | "package": "Lightweight - JSON Util@0.8.0-1" 23 | } 24 | ] 25 | }, 26 | { 27 | "path": "force-app/package", 28 | "default": false, 29 | "package": "Lightweight - Data Cloud Util (Unlocked)", 30 | "versionName": "v62.0 - 0.11", 31 | "versionNumber": "0.11.0.NEXT", 32 | "versionDescription": "A lightweight set of Data Cloud API and mapping utilities for streaming and bulk data ingestion.", 33 | "dependencies": [ 34 | { 35 | "package": "Lightweight - Apex Unit Test Util v2 (Unlocked)@2.5.0-1" 36 | }, 37 | { 38 | "package": "Lightweight - Apex LWC Util (Unlocked)@0.9.0-1" 39 | }, 40 | { 41 | "package": "Lightweight - REST Util (Unlocked)@0.13.0-1" 42 | }, 43 | { 44 | "package": "Lightweight - JSON Util (Unlocked)@0.8.0-1" 45 | } 46 | ] 47 | } 48 | ], 49 | "name": "lightweight-data-cloud-util", 50 | "namespace": "utl", 51 | "sfdcLoginUrl": "https://login.salesforce.com", 52 | "sourceApiVersion": "62.0", 53 | "packageAliases": { 54 | "Lightweight - Apex Unit Test Util v2@2.5.0-1": "04tP3000000rUmLIAU", 55 | "Lightweight - Apex Unit Test Util v2 (Unlocked)@2.5.0-1": "04tP3000000rUpZIAU", 56 | "Lightweight - Apex LWC Util@0.9.0-1": "04tP30000012SvhIAE", 57 | "Lightweight - Apex LWC Util (Unlocked)@0.9.0-1": "04tP30000012SxJIAU", 58 | "Lightweight - REST Util@0.13.0-1": "04tP3000000wMhhIAE", 59 | "Lightweight - REST Util (Unlocked)@0.13.0-1": "04tP3000000wMkvIAE", 60 | "Lightweight - JSON Util@0.8.0-1": "04tP3000000tDMPIA2", 61 | "Lightweight - JSON Util (Unlocked)@0.8.0-1": "04tP3000000tDRFIA2", 62 | "Lightweight - Data Cloud Util": "0HoP300000000BJKAY", 63 | "Lightweight - Data Cloud Util@0.1.0-1": "04tP3000000AIoTIAW", 64 | "Lightweight - Data Cloud Util@0.2.0-1": "04tP3000000LqrdIAC", 65 | "Lightweight - Data Cloud Util@0.3.0-1": "04tP3000000M7Z7IAK", 66 | "Lightweight - Data Cloud Util@0.4.0-1": "04tP3000000OPmrIAG", 67 | "Lightweight - Data Cloud Util@0.5.0-1": "04tP3000000RIFNIA4", 68 | "Lightweight - Data Cloud Util@0.6.0-1": "04tP3000000RIgnIAG", 69 | "Lightweight - Data Cloud Util@0.7.0-1": "04tP3000000RIthIAG", 70 | "Lightweight - Data Cloud Util@0.8.0-1": "04tP3000000TKD3IAO", 71 | "Lightweight - Data Cloud Util@0.9.0-1": "04tP3000000tEOvIAM", 72 | "Lightweight - Data Cloud Util (Unlocked)": "0HoP300000000CvKAI", 73 | "Lightweight - Data Cloud Util (Unlocked)@0.1.0-1": "04tP3000000AIq5IAG", 74 | "Lightweight - Data Cloud Util (Unlocked)@0.2.0-1": "04tP3000000LsBtIAK", 75 | "Lightweight - Data Cloud Util (Unlocked)@0.3.0-1": "04tP3000000M7ajIAC", 76 | "Lightweight - Data Cloud Util (Unlocked)@0.4.0-1": "04tP3000000OPeoIAG", 77 | "Lightweight - Data Cloud Util (Unlocked)@0.5.0-1": "04tP3000000RISHIA4", 78 | "Lightweight - Data Cloud Util (Unlocked)@0.6.0-1": "04tP3000000RIfBIAW", 79 | "Lightweight - Data Cloud Util (Unlocked)@0.7.0-1": "04tP3000000RIvJIAW", 80 | "Lightweight - Data Cloud Util (Unlocked)@0.9.0-1": "04tP3000000tEQXIA2", 81 | "Lightweight - Data Cloud Util (Unlocked)@0.10.0-1": "04tP3000000wN13IAE", 82 | "Lightweight - Data Cloud Util (Unlocked)@0.11.0-1": "04tP30000012T6zIAE" 83 | } 84 | } -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudBulkIngestionUtil/dataCloudBulkIngestionUtil.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | Data Cloud - Bulk Ingestion Utility 13 | 14 | 15 | 16 | 17 | 18 | 24 | 25 | 31 | 32 | 40 | 41 | 48 | 49 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 74 | 75 | 85 | 86 | 87 | 88 | 89 | 90 | 99 | 100 | 101 | 102 | 103 | -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudDataGraphUtil/dataCloudDataGraphUtil.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | Data Cloud - Data Graph Utility 13 | 14 | 15 | 16 | 17 | 18 | 25 | 26 | 33 | 34 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 63 | 64 | 73 | 74 | 83 | 84 | 91 | 92 | 93 | 94 | 95 | 96 | 105 | 106 | 107 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /force-app/package/core/layouts/Data_Cloud_Ingestion_API_Field_Mapping__mdt-Data Cloud Ingestion API Field Mapping Layout.layout-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | false 5 | true 6 | true 7 | Information 8 | 9 | 10 | Required 11 | Data_Cloud_Ingestion_API_Configuration__c 12 | 13 | 14 | 15 | 16 | Required 17 | DeveloperName 18 | 19 | 20 | Required 21 | MasterLabel 22 | 23 | 24 | Edit 25 | IsProtected 26 | 27 | 28 | Required 29 | NamespacePrefix 30 | 31 | 32 | 33 | 34 | 35 | true 36 | true 37 | true 38 | Mapping 39 | 40 | 41 | Required 42 | Source__c 43 | 44 | 45 | 46 | 47 | Required 48 | Target__c 49 | 50 | 51 | 52 | 53 | 54 | true 55 | true 56 | true 57 | Field Info 58 | 59 | 60 | Required 61 | Data_Cloud_Field_Type__c 62 | 63 | 64 | 65 | 66 | Edit 67 | Is_Primary_Key__c 68 | 69 | 70 | Edit 71 | Is_Event_Time_Field__c 72 | 73 | 74 | 75 | 76 | 77 | false 78 | true 79 | true 80 | System Information 81 | 82 | 83 | Readonly 84 | CreatedById 85 | 86 | 87 | 88 | 89 | Readonly 90 | LastModifiedById 91 | 92 | 93 | 94 | 95 | 96 | true 97 | true 98 | false 99 | Custom Links 100 | 101 | 102 | 103 | 104 | 105 | false 106 | false 107 | false 108 | false 109 | false 110 | 111 | 00hAe000004HFWg 112 | 4 113 | 0 114 | Default 115 | 116 | 117 | -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudStreamingIngestionUtil/dataCloudStreamingIngestionUtil.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | Data Cloud - Streaming Ingestion Utility 13 | 14 | 15 | 16 | 17 | 18 | 24 | 25 | 31 | 32 | 40 | 41 | 48 | 49 | 55 | 56 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 83 | 84 | 93 | 94 | 95 | 96 | 97 | Streaming API Payload 98 | 99 | 100 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /force-app/package/core/layouts/Data_Cloud_Ingestion_API_Configuration__mdt-Data Cloud Ingestion API Configuration Layout.layout-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | false 5 | true 6 | true 7 | Information 8 | 9 | 10 | Required 11 | Named_Credential_Name__c 12 | 13 | 14 | Required 15 | Ingestion_API_Connector_Name__c 16 | 17 | 18 | Required 19 | Ingestion_API_Target_Object_Name__c 20 | 21 | 22 | 23 | 24 | Required 25 | DeveloperName 26 | 27 | 28 | Required 29 | MasterLabel 30 | 31 | 32 | Edit 33 | IsProtected 34 | 35 | 36 | Required 37 | NamespacePrefix 38 | 39 | 40 | 41 | 42 | 43 | true 44 | true 45 | true 46 | Optional Info For Query Generation 47 | 48 | 49 | Edit 50 | sObject_Name__c 51 | 52 | 53 | Edit 54 | Data_Lake_Object_Name__c 55 | 56 | 57 | 58 | 59 | 60 | 61 | true 62 | true 63 | true 64 | Optional for future purposes 65 | 66 | 67 | Edit 68 | Salesforce_Named_Credential_Name__c 69 | 70 | 71 | 72 | 73 | 74 | 75 | false 76 | true 77 | true 78 | System Information 79 | 80 | 81 | Readonly 82 | CreatedById 83 | 84 | 85 | 86 | 87 | Readonly 88 | LastModifiedById 89 | 90 | 91 | 92 | 93 | 94 | true 95 | true 96 | false 97 | Custom Links 98 | 99 | 100 | 101 | 102 | 103 | 104 | DeveloperName 105 | Source__c 106 | Target__c 107 | Data_Cloud_Field_Type__c 108 | Is_Primary_Key__c 109 | Is_Event_Time_Field__c 110 | Data_Cloud_Ingestion_API_Field_Mapping__mdt.Data_Cloud_Ingestion_API_Configuration__c 111 | 112 | false 113 | false 114 | false 115 | false 116 | false 117 | 118 | 00hAe000004HFWf 119 | 4 120 | 0 121 | Default 122 | 123 | 124 | -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudSObjectToCsvUtil/dataCloudSObjectToCsvUtil.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | Data Cloud - sObject to CSV Utility 13 | 14 | 15 | 16 | 17 | 22 | 23 | 31 | 32 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 58 | 59 | 68 | 69 | 76 | 77 | 78 | SOQL Query 79 | 80 | 81 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudQueryUtil/dataCloudQueryUtil.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | Data Cloud - Query Utility 13 | 14 | 15 | 16 | 17 | 18 | 24 | 25 | 33 | 34 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 61 | 62 | 71 | 72 | 81 | 82 | 83 | 84 | 85 | SQL Query 86 | 87 | 88 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 114 | 115 | 124 | 125 | 126 | 127 | 128 | 129 | -------------------------------------------------------------------------------- /force-app/demo/package/objects/Smart_Device_Event_History__c/Smart_Device_Event_History__c.object-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Accept 5 | Default 6 | 7 | 8 | Accept 9 | Large 10 | Default 11 | 12 | 13 | Accept 14 | Small 15 | Default 16 | 17 | 18 | CancelEdit 19 | Default 20 | 21 | 22 | CancelEdit 23 | Large 24 | Default 25 | 26 | 27 | CancelEdit 28 | Small 29 | Default 30 | 31 | 32 | Clone 33 | Default 34 | 35 | 36 | Clone 37 | Large 38 | Default 39 | 40 | 41 | Clone 42 | Small 43 | Default 44 | 45 | 46 | Delete 47 | Default 48 | 49 | 50 | Delete 51 | Large 52 | Default 53 | 54 | 55 | Delete 56 | Small 57 | Default 58 | 59 | 60 | Edit 61 | Default 62 | 63 | 64 | Edit 65 | Large 66 | Default 67 | 68 | 69 | Edit 70 | Small 71 | Default 72 | 73 | 74 | List 75 | Default 76 | 77 | 78 | List 79 | Large 80 | Default 81 | 82 | 83 | List 84 | Small 85 | Default 86 | 87 | 88 | New 89 | Default 90 | 91 | 92 | New 93 | Large 94 | Default 95 | 96 | 97 | New 98 | Small 99 | Default 100 | 101 | 102 | SaveEdit 103 | Default 104 | 105 | 106 | SaveEdit 107 | Large 108 | Default 109 | 110 | 111 | SaveEdit 112 | Small 113 | Default 114 | 115 | 116 | Tab 117 | Default 118 | 119 | 120 | Tab 121 | Large 122 | Default 123 | 124 | 125 | Tab 126 | Small 127 | Default 128 | 129 | 130 | View 131 | Action override created by Lightning App Builder during activation. 132 | Smart_Device_Event_History_Record_Page 133 | Large 134 | false 135 | Flexipage 136 | 137 | 138 | View 139 | Action override created by Lightning App Builder during activation. 140 | Smart_Device_Event_History_Record_Page 141 | Small 142 | false 143 | Flexipage 144 | 145 | 146 | View 147 | Default 148 | 149 | false 150 | SYSTEM 151 | Deployed 152 | false 153 | false 154 | false 155 | false 156 | false 157 | false 158 | true 159 | false 160 | false 161 | Private 162 | Smart Device Event History 163 | 164 | EVT-{000000} 165 | Name 166 | AutoNumber 167 | 168 | Smart Device Event History 169 | 170 | ReadWrite 171 | Public 172 | 173 | -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudAddCsvModal/dataCloudAddCsvModal.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Justus van den Berg (jfwberg@gmail.com) 3 | * @date October 2023 4 | * @copyright (c) 2023 Justus van den Berg 5 | * @license MIT (See LICENSE file in the project root) 6 | * @description LWC JS Class 7 | */ 8 | // Lightning stuff 9 | import { api, track } from 'lwc'; 10 | import LightningAlert from 'lightning/alert'; 11 | import LightningModal from 'lightning/modal'; 12 | 13 | // Custom Utils 14 | import {handleError} from 'c/util'; 15 | 16 | // Apex methods 17 | import addCsv from "@salesforce/apex/DataCloudUtilLwcCtrl.addCsv"; 18 | import addCsvFromFile from "@salesforce/apex/DataCloudUtilLwcCtrl.addCsvFromFile"; 19 | import deleteDocument from "@salesforce/apex/DataCloudUtilLwcCtrl.deleteDocument"; 20 | import getCsvPlaceholder from "@salesforce/apex/DataCloudUtilLwcCtrl.getCsvPlaceholder"; 21 | 22 | // Status variables 23 | const STATUS_UPLOAD_COMPLETE = 'Upload Complete'; 24 | 25 | // Data cloud action statusses 26 | const STATUS_SEND_TO_DC = 'Sending data to Data Cloud'; 27 | const STATUS_SEND_TO_DC_SUCCESS = 'CSV File Successfully sent to Data Cloud'; 28 | const STATUS_SEND_TO_DC_ERROR = 'An error occurred whilst sending the CSV File to Data Cloud. Please try again.'; 29 | 30 | // Document deletion action statusses 31 | // Data cloud action statusses 32 | const STATUS_DELETE_DOCUMENT = 'Deleting input document'; 33 | const STATUS_DELETE_DOCUMENT_SUCCESS = 'CSV File Successfully sent to Data Cloud and succesfully deleted'; 34 | const STATUS_DELETE_DOCUMENT_ERROR = 'An error occurred whilst deleting the CSV File. Please delete the uploaded file manually.'; 35 | 36 | 37 | // Main class 38 | export default class DataCloudAddCsvModal extends LightningModal { 39 | 40 | // Configuration received from parent object 41 | @api config; 42 | 43 | // Loading indicator for the spinner 44 | loading = false; 45 | 46 | // Add CSV button variant 47 | variant = 'brand'; 48 | 49 | // The CSV string that will be loaded 50 | csvData; 51 | 52 | // Local class codemirror options 53 | codemirrorLoaded = false; 54 | 55 | // CodeMirror configuration 56 | codemirrorTheme = 'default'; 57 | codemirrorMode = 'csv'; 58 | codemirrorValue = ''; 59 | codemirrorSize = {width : '100%', height: 250}; 60 | codemirrorDisabled = false; 61 | codemirrorClass = "cm"; 62 | codemirrorSave = () => { 63 | this.handleAddCsv(); 64 | }; 65 | codemirrorLoadingComplete = () => { 66 | this.codemirrorLoaded = true; 67 | this.getCmTa().size = {width : '100%', height: 500}; 68 | } 69 | 70 | // Document details used for uploading 71 | @track document = { 72 | id : null, 73 | name : null, 74 | status : null, 75 | contentBodyId : null, 76 | contentVersionId : null 77 | }; 78 | 79 | // Upload formats 80 | get acceptedFormats() { 81 | return ['.txt', '.csv']; 82 | } 83 | 84 | // Indicator if this is an upload or data as plain text 85 | get isUpload(){ 86 | return this.config.isUpload == true; 87 | } 88 | 89 | get fileUploadDisabled(){ 90 | return (this.document.status == STATUS_UPLOAD_COMPLETE || this.document.status == STATUS_SEND_TO_DC); 91 | } 92 | 93 | // Indicator if the document table should be visible 94 | get documentInfoVisible(){ 95 | return this.document.status != null; 96 | } 97 | 98 | // Method to get the CodeMirror Textarea Child component 99 | getCmTa(){ 100 | return this.template.querySelector('c-cm-textarea'); 101 | } 102 | 103 | 104 | /** **************************************************************************************************** ** 105 | ** LIFECYCLE HANDLERS ** 106 | ** **************************************************************************************************** **/ 107 | connectedCallback() { 108 | try{ 109 | // Generate sample data if a config record has been selected 110 | if(this.config.mdtConfigRecord){ 111 | 112 | this.loading = true; 113 | getCsvPlaceholder({ 114 | mdtConfigName : this.config.mdtConfigRecord 115 | }) 116 | .then((apexResponse) => { 117 | this.codemirrorValue = apexResponse; 118 | }) 119 | .catch((error) => { 120 | handleError(error); 121 | }) 122 | .finally(()=>{ 123 | this.loading = false; 124 | }); 125 | }else{ 126 | this.codemirrorValue = 'Select a metadata configuration to generate a sample payload based on the confugred mapping fields'; 127 | } 128 | }catch(error){ 129 | handleError(error); 130 | this.loading = false; 131 | } 132 | } 133 | 134 | 135 | /** **************************************************************************************************** ** 136 | ** INPUT CHANGE HANDLERS ** 137 | ** **************************************************************************************************** **/ 138 | 139 | 140 | handleUploadFinished(event) { 141 | try{ 142 | // Get the list of uploaded files 143 | const uploadedFiles = event.detail.files; 144 | 145 | // Update the status 146 | this.document.status = STATUS_UPLOAD_COMPLETE; 147 | 148 | // Last uploaded document Id 149 | this.document.id = uploadedFiles[0].documentId; 150 | this.document.name = uploadedFiles[0].name; 151 | this.document.contentBodyId = uploadedFiles[0].contentBodyId; 152 | this.document.contentVersionId = uploadedFiles[0].contentVersionId; 153 | 154 | // Handle the upload 155 | this.handleAddCsvFromFile(); 156 | 157 | }catch(error){ 158 | handleError(error); 159 | } 160 | } 161 | 162 | 163 | /** **************************************************************************************************** ** 164 | ** APEX HANDLERS ** 165 | ** **************************************************************************************************** **/ 166 | handleAddCsv() { 167 | try{ 168 | this.loading = true; 169 | 170 | addCsv({ 171 | namedCredentialName : this.config.namedCredentialName, 172 | jobId : this.config.jobId, 173 | csvData : this.codemirrorValue 174 | }) 175 | .then(() => { 176 | this.close('ok'); 177 | }) 178 | .catch((error) => { 179 | handleError(error); 180 | }) 181 | .finally(()=>{ 182 | this.loading = false; 183 | }); 184 | 185 | }catch(error){ 186 | handleError(error); 187 | this.loading = false; 188 | } 189 | } 190 | 191 | 192 | handleAddCsvFromFile() { 193 | try{ 194 | this.loading = true; 195 | 196 | // Update the status 197 | this.document.status = STATUS_SEND_TO_DC; 198 | 199 | addCsvFromFile({ 200 | namedCredentialName : this.config.namedCredentialName, 201 | jobId : this.config.jobId, 202 | documentId : this.document.id, 203 | contentVersionId : this.document.contentVersionId 204 | }) 205 | .then((event) => { 206 | if(event === true){ 207 | 208 | // Update the status 209 | this.document.status = STATUS_SEND_TO_DC_SUCCESS; 210 | 211 | // User friendly popup 212 | LightningAlert.open({ 213 | message: 'Succesfully added the CSV File "' + this.document.name +'" to the Bulk Ingestion Job', 214 | label : 'Success', 215 | theme : 'success' 216 | }); 217 | 218 | } 219 | }) 220 | .catch((error) => { 221 | handleError(error); 222 | this.document.status = STATUS_SEND_TO_DC_ERROR; 223 | }) 224 | .finally(()=>{ 225 | this.loading = false; 226 | }); 227 | }catch(error){ 228 | handleError(error); 229 | this.loading = false; 230 | this.document.status = STATUS_SEND_TO_DC_ERROR; 231 | }finally{ 232 | this.handleDeleteDocument(); 233 | } 234 | } 235 | 236 | 237 | handleDeleteDocument() { 238 | try{ 239 | this.loading = true; 240 | 241 | // Update the status 242 | this.document.status = STATUS_DELETE_DOCUMENT; 243 | 244 | deleteDocument({ 245 | documentId : this.document.id, 246 | }) 247 | .then(() => { 248 | // Update the status 249 | this.document.status = STATUS_DELETE_DOCUMENT_SUCCESS; 250 | }) 251 | .catch((error) => { 252 | handleError(error); 253 | this.document.status = STATUS_DELETE_DOCUMENT_ERROR; 254 | }) 255 | .finally(()=>{ 256 | this.loading = false; 257 | }); 258 | }catch(error){ 259 | handleError(error); 260 | this.loading = false; 261 | this.document.status = STATUS_DELETE_DOCUMENT_ERROR; 262 | } 263 | } 264 | 265 | 266 | /** **************************************************************************************************** ** 267 | ** CLICK BUTTON HANDLERS ** 268 | ** **************************************************************************************************** **/ 269 | handleClickAddCsv() { 270 | this.handleAddCsv(); 271 | } 272 | 273 | handleClickClose() { 274 | this.close(); 275 | } 276 | } -------------------------------------------------------------------------------- /scripts/scan-results/graph-result.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 64 | 65 | 67 | 68 | 69 | 297 | 298 | 299 | 300 | Salesforce Code Analyzer Report 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | File Name 311 | Sev 312 | Engine 313 | Category 314 | Rule Name 315 | Message 316 | Line 317 | Column 318 | End Line 319 | End Column 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | -------------------------------------------------------------------------------- /scripts/scan-results/pmd-result.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 64 | 65 | 67 | 68 | 69 | 297 | 298 | 299 | 300 | Salesforce Code Analyzer Report 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | File Name 311 | Sev 312 | Engine 313 | Category 314 | Rule Name 315 | Message 316 | Line 317 | Column 318 | End Line 319 | End Column 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | -------------------------------------------------------------------------------- /force-app/package/ui/lwc/dataCloudSObjectToYamlUtil/dataCloudSObjectToYamlUtil.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Justus van den Berg (jfwberg@gmail.com) 3 | * @date October 2023 4 | * @copyright (c) 2023 Justus van den Berg 5 | * @license MIT (See LICENSE file in the project root) 6 | * @description LWC JS Class 7 | */ 8 | // Lightning stuff 9 | import { LightningElement } from "lwc"; 10 | 11 | // Custom Utils 12 | import {handleError} from 'c/util'; 13 | import {removePreAndPostFix} from 'c/util'; 14 | 15 | // Modals 16 | import cmModal from 'c/cmModal'; 17 | import textModal from 'c/textModal'; 18 | 19 | // Apex methods 20 | import getSObjectOptions from "@salesforce/apex/DataCloudUtilLwcCtrl.getSObjectOptions"; 21 | import getSObjectFieldInfo from "@salesforce/apex/DataCloudUtilLwcCtrl.getSObjectFieldInfo"; 22 | 23 | // Mapping for the YAML 24 | const FIELD_TYPE_MAPPING = { 25 | "booleanField" : "boolean", 26 | "dateField" : "string\n format: date", 27 | "dateTimeField" : "string\n format: date-time", 28 | "emailField" : "string\n format: email", 29 | "numberField" : "number", 30 | "phoneField" : "string\n format: phone", 31 | "percentField" : "string\n format: percent", 32 | "textField" : "string", 33 | "urlField" : "string\n format: url", 34 | }; 35 | 36 | // Main class 37 | export default class DataCloudSObjectToYamlUtil extends LightningElement { 38 | 39 | // Loading indicator for the spinner 40 | loading = false; 41 | 42 | // The yaml file that is to be generated 43 | yamlData = ''; 44 | 45 | // Result modal codemirror theme 46 | codemirrorResultTheme = 'default'; 47 | 48 | // Lightning output table, set default to prevent error message 49 | ldt = {keyField : 'source'}; 50 | 51 | // If set to true the labels and api names are inverted 52 | invertLabel = true 53 | 54 | // True when the options have been loaded on init 55 | optionsLoaded = false; 56 | 57 | // True when an sOject has been selected from the picklist 58 | sObjectSelected = false; 59 | 60 | // Config record picklist details 61 | sObjectName; 62 | sObjectOptions = []; 63 | 64 | // Rows that are selected for a specific object (All objects) 65 | // Contains only the records keys 66 | selectedRows = {}; 67 | 68 | // All selected rows for all objects + data, YAML is created based on this 69 | currentlySelectedRows = {}; 70 | 71 | // List of selected rows in the current visible object only, not all data 72 | visibleSelectedRows = []; 73 | 74 | // Disable buttons 75 | get inputsEnabled(){ 76 | return !this.optionsLoaded; 77 | } 78 | 79 | // Disable buttons 80 | get actionsEnabled(){ 81 | return !this.sObjectSelected; 82 | } 83 | 84 | // create object 85 | get sObjectInputLabel(){ 86 | return (this.invertLabel) ? 'sObject API Name' : 'sObject Label'; 87 | } 88 | 89 | 90 | /** **************************************************************************************************** ** 91 | ** LIFECYCLE HANDLERS ** 92 | ** **************************************************************************************************** **/ 93 | connectedCallback(){ 94 | this.handleGetSObjectOptions(); 95 | } 96 | 97 | 98 | /** **************************************************************************************************** ** 99 | ** APEX HANDLERS ** 100 | ** **************************************************************************************************** **/ 101 | handleGetSObjectOptions(){ 102 | try{ 103 | this.loading = true; 104 | getSObjectOptions({invertLabel : this.invertLabel}) 105 | .then((apexResponse) => { 106 | 107 | // Clone array 108 | let ar = JSON.parse(JSON.stringify(apexResponse)); 109 | 110 | // Sort the result by label in JS, 111 | // The results are an unsorted mess that come back from apex for some reason 112 | this.sObjectOptions = ar.sort(this.compare); 113 | 114 | // Options loaded is true 115 | this.optionsLoaded = true; 116 | }) 117 | .catch((error) => { 118 | handleError(error); 119 | }) 120 | .finally(()=>{ 121 | this.loading=false; 122 | }); 123 | }catch(error){ 124 | handleError(error); 125 | this.loading=false; 126 | } 127 | } 128 | 129 | 130 | handleGetSObjectFieldInfo(){ 131 | try{ 132 | this.loading = true; 133 | getSObjectFieldInfo({sObjectName : this.sObjectName}) 134 | .then((apexResponse) => { 135 | // Update the data table 136 | this.ldt = apexResponse; 137 | 138 | // Pre-populate the data table for different objects, needs to run after the data table has been refreshed 139 | // Reset view when you move to an object that has not been added yet 140 | this.visibleSelectedRows = this.selectedRows.hasOwnProperty(this.sObjectName) ? JSON.parse(JSON.stringify(this.selectedRows[this.sObjectName])) : []; 141 | }) 142 | .catch((error) => { 143 | handleError(error); 144 | }) 145 | .finally(()=>{ 146 | this.loading=false; 147 | }); 148 | }catch(error){ 149 | handleError(error); 150 | this.loading=false; 151 | } 152 | } 153 | 154 | 155 | /** **************************************************************************************************** ** 156 | ** INPUT CHANGE HANDLERS ** 157 | ** **************************************************************************************************** **/ 158 | // Set the config record name and update the table 159 | handleChangeSObject(event) { 160 | try{ 161 | this.data = []; 162 | this.sObjectName = event.detail.value; 163 | this.sObjectSelected = true; 164 | this.handleGetSObjectFieldInfo(); 165 | }catch(error){ 166 | handleError(error); 167 | } 168 | } 169 | 170 | 171 | handleChangeInvertLabel(event){ 172 | this.invertLabel = event.detail.checked; 173 | this.handleGetSObjectOptions(); 174 | } 175 | 176 | 177 | handleRowSelection(event) { 178 | // Add the records to the currently selected data 179 | this.currentlySelectedRows[this.sObjectName] = JSON.parse(JSON.stringify(event.detail.selectedRows)); 180 | 181 | // Add ids to the selected rows 182 | this.selectedRows[this.sObjectName] = JSON.parse(JSON.stringify(event.detail.selectedRows)).map(a => a.source); 183 | } 184 | 185 | 186 | /** **************************************************************************************************** ** 187 | ** CLICK BUTTON HANDLERS ** 188 | ** **************************************************************************************************** **/ 189 | handleClickCreateYaml(){ 190 | this.handleOpenYamlModal(); 191 | } 192 | 193 | handleClickHelp(){ 194 | this.handleOpenHelpModal() ; 195 | } 196 | 197 | 198 | /** **************************************************************************************************** ** 199 | ** MODAL METHODS ** 200 | ** **************************************************************************************************** **/ 201 | /** 202 | * Open the Mapping Modal 203 | */ 204 | handleOpenYamlModal(){ 205 | try{ 206 | // Generate the YAML 207 | this.generateYaml(); 208 | 209 | // Open the generated YAML in a modal 210 | cmModal.open({ 211 | 212 | // Modal info 213 | size : "small", 214 | header : "YAML Creation Result", 215 | value : this.yamlData, 216 | mode : "text/x-yaml", 217 | theme : this.codemirrorResultTheme, 218 | disabled : false, 219 | 220 | // Download info 221 | fileName : 'YAML', 222 | fileExtension : '.yaml', 223 | fileMimeType : 'text/x-yaml; charset=utf-8;', 224 | includeTimestamp : true, 225 | 226 | // Button visibillity 227 | copyButton : true, 228 | downloadButton : true, 229 | prettifyButton : false, 230 | closeButton : true 231 | }); 232 | }catch(error){ 233 | handleError(error); 234 | } 235 | } 236 | 237 | 238 | /** 239 | * Open the help modal 240 | */ 241 | handleOpenHelpModal(){ 242 | try{ 243 | textModal.open({ 244 | header : "Data Cloud - sObject to YAML Utility - Help", 245 | content : "Tool to generate a YAML file based on one or multiple sObjects and their selected fields. This YAML can be used to create a new Ingestion API Connector in the Data Cloud Setup. Note that namespace prefixs and any postfixes like __c or __mdt will be removed from object and field names and there is no duplicate check. So if you have Name and Name__c you're going to have to update the YAML manually.", 246 | size : 'small' 247 | }); 248 | }catch(error){ 249 | handleError(error); 250 | } 251 | } 252 | 253 | 254 | /** **************************************************************************************************** ** 255 | ** SUPPORT METHODS ** 256 | ** **************************************************************************************************** **/ 257 | /** 258 | * Method to generate a YAML for a object/field list mapping 259 | */ 260 | generateYaml(){ 261 | try{ 262 | // Set the base string for the yaml data 263 | this.yamlData='openapi: 3.0.3\ncomponents:\n schemas:\n'; 264 | 265 | // Add objects 266 | for (let sObjectName in this.currentlySelectedRows){ 267 | 268 | // Remove objects without any fields 269 | if(this.currentlySelectedRows[sObjectName].length > 0){ 270 | 271 | // Clean object name from pre and postfixes 272 | this.yamlData += ' ' + removePreAndPostFix(sObjectName) + ':\n type: object\n properties:\n'; 273 | 274 | // Create the field info 275 | for (let index = 0; index < this.currentlySelectedRows[sObjectName].length; index++) { 276 | const element = this.currentlySelectedRows[sObjectName][index]; 277 | this.yamlData += ' ' + removePreAndPostFix(element.target) + ':\n'; 278 | this.yamlData += ' type: ' + FIELD_TYPE_MAPPING[element.dcFtype] + '\n'; 279 | } 280 | } 281 | } 282 | }catch(error){ 283 | handleError(error); 284 | } 285 | } 286 | 287 | 288 | /** 289 | * Method to sort an array by label 290 | */ 291 | compare(a,b){ 292 | try{ 293 | if (a.label < b.label){ 294 | return -1; 295 | } 296 | if (a.label > b.label){ 297 | return 1; 298 | } 299 | return 0; 300 | }catch(error){ 301 | handleError(error); 302 | } 303 | } 304 | } -------------------------------------------------------------------------------- /config/project-scratch-def.json: -------------------------------------------------------------------------------- 1 | { 2 | "orgName": "Lightweight - Data Cloud Util - Scratch Org", 3 | "edition": "Enterprise", 4 | "features": [ 5 | "EnableSetPasswordInApi", 6 | "PersonAccounts", 7 | "PlatformCache", 8 | "PlatformEncryption", 9 | "EinsteinGPTForDevelopers" 10 | ], 11 | "language": "en_US", 12 | "country": "GB", 13 | "settings": { 14 | "lightningExperienceSettings": { 15 | "enableS1DesktopEnabled": true 16 | }, 17 | "mobileSettings": { 18 | "enableS1EncryptedStoragePref2": false 19 | }, 20 | "securitySettings": { 21 | "canUsersGrantLoginAccess": false, 22 | "enableAdminLoginAsAnyUser": false, 23 | "sessionSettings": { 24 | "sessionTimeout": "TwentyFourHours" 25 | }, 26 | "passwordPolicies": { 27 | "expiration": "Never", 28 | "historyRestriction": "0" 29 | }, 30 | "singleSignOnSettings": { 31 | "enableSamlLogin": true 32 | }, 33 | "networkAccess": { 34 | "ipRanges": [ 35 | { 36 | "end": "255.255.255.255", 37 | "start": "254.0.0.0" 38 | }, 39 | { 40 | "end": "253.255.255.255", 41 | "start": "252.0.0.0" 42 | }, 43 | { 44 | "end": "251.255.255.255", 45 | "start": "250.0.0.0" 46 | }, 47 | { 48 | "end": "249.255.255.255", 49 | "start": "248.0.0.0" 50 | }, 51 | { 52 | "end": "247.255.255.255", 53 | "start": "246.0.0.0" 54 | }, 55 | { 56 | "end": "245.255.255.255", 57 | "start": "244.0.0.0" 58 | }, 59 | { 60 | "end": "243.255.255.255", 61 | "start": "242.0.0.0" 62 | }, 63 | { 64 | "end": "241.255.255.255", 65 | "start": "240.0.0.0" 66 | }, 67 | { 68 | "end": "239.255.255.255", 69 | "start": "238.0.0.0" 70 | }, 71 | { 72 | "end": "237.255.255.255", 73 | "start": "236.0.0.0" 74 | }, 75 | { 76 | "end": "235.255.255.255", 77 | "start": "234.0.0.0" 78 | }, 79 | { 80 | "end": "233.255.255.255", 81 | "start": "232.0.0.0" 82 | }, 83 | { 84 | "end": "231.255.255.255", 85 | "start": "230.0.0.0" 86 | }, 87 | { 88 | "end": "229.255.255.255", 89 | "start": "228.0.0.0" 90 | }, 91 | { 92 | "end": "227.255.255.255", 93 | "start": "226.0.0.0" 94 | }, 95 | { 96 | "end": "225.255.255.255", 97 | "start": "224.0.0.0" 98 | }, 99 | { 100 | "end": "223.255.255.255", 101 | "start": "222.0.0.0" 102 | }, 103 | { 104 | "end": "221.255.255.255", 105 | "start": "220.0.0.0" 106 | }, 107 | { 108 | "end": "219.255.255.255", 109 | "start": "218.0.0.0" 110 | }, 111 | { 112 | "end": "217.255.255.255", 113 | "start": "216.0.0.0" 114 | }, 115 | { 116 | "end": "215.255.255.255", 117 | "start": "214.0.0.0" 118 | }, 119 | { 120 | "end": "213.255.255.255", 121 | "start": "212.0.0.0" 122 | }, 123 | { 124 | "end": "211.255.255.255", 125 | "start": "210.0.0.0" 126 | }, 127 | { 128 | "end": "209.255.255.255", 129 | "start": "208.0.0.0" 130 | }, 131 | { 132 | "end": "207.255.255.255", 133 | "start": "206.0.0.0" 134 | }, 135 | { 136 | "end": "205.255.255.255", 137 | "start": "204.0.0.0" 138 | }, 139 | { 140 | "end": "203.255.255.255", 141 | "start": "202.0.0.0" 142 | }, 143 | { 144 | "end": "201.255.255.255", 145 | "start": "200.0.0.0" 146 | }, 147 | { 148 | "end": "199.255.255.255", 149 | "start": "198.0.0.0" 150 | }, 151 | { 152 | "end": "197.255.255.255", 153 | "start": "196.0.0.0" 154 | }, 155 | { 156 | "end": "195.255.255.255", 157 | "start": "194.0.0.0" 158 | }, 159 | { 160 | "end": "193.255.255.255", 161 | "start": "192.0.0.0" 162 | }, 163 | { 164 | "end": "191.255.255.255", 165 | "start": "190.0.0.0" 166 | }, 167 | { 168 | "end": "189.255.255.255", 169 | "start": "188.0.0.0" 170 | }, 171 | { 172 | "end": "187.255.255.255", 173 | "start": "186.0.0.0" 174 | }, 175 | { 176 | "end": "185.255.255.255", 177 | "start": "184.0.0.0" 178 | }, 179 | { 180 | "end": "183.255.255.255", 181 | "start": "182.0.0.0" 182 | }, 183 | { 184 | "end": "181.255.255.255", 185 | "start": "180.0.0.0" 186 | }, 187 | { 188 | "end": "179.255.255.255", 189 | "start": "178.0.0.0" 190 | }, 191 | { 192 | "end": "177.255.255.255", 193 | "start": "176.0.0.0" 194 | }, 195 | { 196 | "end": "175.255.255.255", 197 | "start": "174.0.0.0" 198 | }, 199 | { 200 | "end": "173.255.255.255", 201 | "start": "172.0.0.0" 202 | }, 203 | { 204 | "end": "171.255.255.255", 205 | "start": "170.0.0.0" 206 | }, 207 | { 208 | "end": "169.255.255.255", 209 | "start": "168.0.0.0" 210 | }, 211 | { 212 | "end": "167.255.255.255", 213 | "start": "166.0.0.0" 214 | }, 215 | { 216 | "end": "165.255.255.255", 217 | "start": "164.0.0.0" 218 | }, 219 | { 220 | "end": "163.255.255.255", 221 | "start": "162.0.0.0" 222 | }, 223 | { 224 | "end": "161.255.255.255", 225 | "start": "160.0.0.0" 226 | }, 227 | { 228 | "end": "159.255.255.255", 229 | "start": "158.0.0.0" 230 | }, 231 | { 232 | "end": "157.255.255.255", 233 | "start": "156.0.0.0" 234 | }, 235 | { 236 | "end": "155.255.255.255", 237 | "start": "154.0.0.0" 238 | }, 239 | { 240 | "end": "153.255.255.255", 241 | "start": "152.0.0.0" 242 | }, 243 | { 244 | "end": "151.255.255.255", 245 | "start": "150.0.0.0" 246 | }, 247 | { 248 | "end": "149.255.255.255", 249 | "start": "148.0.0.0" 250 | }, 251 | { 252 | "end": "147.255.255.255", 253 | "start": "146.0.0.0" 254 | }, 255 | { 256 | "end": "145.255.255.255", 257 | "start": "144.0.0.0" 258 | }, 259 | { 260 | "end": "143.255.255.255", 261 | "start": "142.0.0.0" 262 | }, 263 | { 264 | "end": "141.255.255.255", 265 | "start": "140.0.0.0" 266 | }, 267 | { 268 | "end": "139.255.255.255", 269 | "start": "138.0.0.0" 270 | }, 271 | { 272 | "end": "137.255.255.255", 273 | "start": "136.0.0.0" 274 | }, 275 | { 276 | "end": "135.255.255.255", 277 | "start": "134.0.0.0" 278 | }, 279 | { 280 | "end": "133.255.255.255", 281 | "start": "132.0.0.0" 282 | }, 283 | { 284 | "end": "131.255.255.255", 285 | "start": "130.0.0.0" 286 | }, 287 | { 288 | "end": "129.255.255.255", 289 | "start": "128.0.0.0" 290 | }, 291 | { 292 | "end": "127.255.255.255", 293 | "start": "126.0.0.0" 294 | }, 295 | { 296 | "end": "125.255.255.255", 297 | "start": "124.0.0.0" 298 | }, 299 | { 300 | "end": "123.255.255.255", 301 | "start": "122.0.0.0" 302 | }, 303 | { 304 | "end": "121.255.255.255", 305 | "start": "120.0.0.0" 306 | }, 307 | { 308 | "end": "119.255.255.255", 309 | "start": "118.0.0.0" 310 | }, 311 | { 312 | "end": "117.255.255.255", 313 | "start": "116.0.0.0" 314 | }, 315 | { 316 | "end": "115.255.255.255", 317 | "start": "114.0.0.0" 318 | }, 319 | { 320 | "end": "113.255.255.255", 321 | "start": "112.0.0.0" 322 | }, 323 | { 324 | "end": "111.255.255.255", 325 | "start": "110.0.0.0" 326 | }, 327 | { 328 | "end": "109.255.255.255", 329 | "start": "108.0.0.0" 330 | }, 331 | { 332 | "end": "107.255.255.255", 333 | "start": "106.0.0.0" 334 | }, 335 | { 336 | "end": "105.255.255.255", 337 | "start": "104.0.0.0" 338 | }, 339 | { 340 | "end": "103.255.255.255", 341 | "start": "102.0.0.0" 342 | }, 343 | { 344 | "end": "101.255.255.255", 345 | "start": "100.0.0.0" 346 | }, 347 | { 348 | "end": "99.255.255.255", 349 | "start": "98.0.0.0" 350 | }, 351 | { 352 | "end": "97.255.255.255", 353 | "start": "96.0.0.0" 354 | }, 355 | { 356 | "end": "95.255.255.255", 357 | "start": "94.0.0.0" 358 | }, 359 | { 360 | "end": "93.255.255.255", 361 | "start": "92.0.0.0" 362 | }, 363 | { 364 | "end": "91.255.255.255", 365 | "start": "90.0.0.0" 366 | }, 367 | { 368 | "end": "89.255.255.255", 369 | "start": "88.0.0.0" 370 | }, 371 | { 372 | "end": "87.255.255.255", 373 | "start": "86.0.0.0" 374 | }, 375 | { 376 | "end": "85.255.255.255", 377 | "start": "84.0.0.0" 378 | }, 379 | { 380 | "end": "83.255.255.255", 381 | "start": "82.0.0.0" 382 | }, 383 | { 384 | "end": "81.255.255.255", 385 | "start": "80.0.0.0" 386 | }, 387 | { 388 | "end": "79.255.255.255", 389 | "start": "78.0.0.0" 390 | }, 391 | { 392 | "end": "77.255.255.255", 393 | "start": "76.0.0.0" 394 | }, 395 | { 396 | "end": "75.255.255.255", 397 | "start": "74.0.0.0" 398 | }, 399 | { 400 | "end": "73.255.255.255", 401 | "start": "72.0.0.0" 402 | }, 403 | { 404 | "end": "71.255.255.255", 405 | "start": "70.0.0.0" 406 | }, 407 | { 408 | "end": "69.255.255.255", 409 | "start": "68.0.0.0" 410 | }, 411 | { 412 | "end": "67.255.255.255", 413 | "start": "66.0.0.0" 414 | }, 415 | { 416 | "end": "65.255.255.255", 417 | "start": "64.0.0.0" 418 | }, 419 | { 420 | "end": "63.255.255.255", 421 | "start": "62.0.0.0" 422 | }, 423 | { 424 | "end": "61.255.255.255", 425 | "start": "60.0.0.0" 426 | }, 427 | { 428 | "end": "59.255.255.255", 429 | "start": "58.0.0.0" 430 | }, 431 | { 432 | "end": "57.255.255.255", 433 | "start": "56.0.0.0" 434 | }, 435 | { 436 | "end": "55.255.255.255", 437 | "start": "54.0.0.0" 438 | }, 439 | { 440 | "end": "53.255.255.255", 441 | "start": "52.0.0.0" 442 | }, 443 | { 444 | "end": "51.255.255.255", 445 | "start": "50.0.0.0" 446 | }, 447 | { 448 | "end": "49.255.255.255", 449 | "start": "48.0.0.0" 450 | }, 451 | { 452 | "end": "47.255.255.255", 453 | "start": "46.0.0.0" 454 | }, 455 | { 456 | "end": "45.255.255.255", 457 | "start": "44.0.0.0" 458 | }, 459 | { 460 | "end": "43.255.255.255", 461 | "start": "42.0.0.0" 462 | }, 463 | { 464 | "end": "41.255.255.255", 465 | "start": "40.0.0.0" 466 | }, 467 | { 468 | "end": "39.255.255.255", 469 | "start": "38.0.0.0" 470 | }, 471 | { 472 | "end": "37.255.255.255", 473 | "start": "36.0.0.0" 474 | }, 475 | { 476 | "end": "35.255.255.255", 477 | "start": "34.0.0.0" 478 | }, 479 | { 480 | "end": "33.255.255.255", 481 | "start": "32.0.0.0" 482 | }, 483 | { 484 | "end": "31.255.255.255", 485 | "start": "30.0.0.0" 486 | }, 487 | { 488 | "end": "29.255.255.255", 489 | "start": "28.0.0.0" 490 | }, 491 | { 492 | "end": "27.255.255.255", 493 | "start": "26.0.0.0" 494 | }, 495 | { 496 | "end": "25.255.255.255", 497 | "start": "24.0.0.0" 498 | }, 499 | { 500 | "end": "23.255.255.255", 501 | "start": "22.0.0.0" 502 | }, 503 | { 504 | "end": "21.255.255.255", 505 | "start": "20.0.0.0" 506 | }, 507 | { 508 | "end": "19.255.255.255", 509 | "start": "18.0.0.0" 510 | }, 511 | { 512 | "end": "17.255.255.255", 513 | "start": "16.0.0.0" 514 | }, 515 | { 516 | "end": "15.255.255.255", 517 | "start": "14.0.0.0" 518 | }, 519 | { 520 | "end": "13.255.255.255", 521 | "start": "12.0.0.0" 522 | }, 523 | { 524 | "end": "11.255.255.255", 525 | "start": "10.0.0.0" 526 | }, 527 | { 528 | "end": "9.255.255.255", 529 | "start": "8.0.0.0" 530 | }, 531 | { 532 | "end": "7.255.255.255", 533 | "start": "6.0.0.0" 534 | }, 535 | { 536 | "end": "5.255.255.255", 537 | "start": "4.0.0.0" 538 | }, 539 | { 540 | "end": "3.255.255.255", 541 | "start": "2.0.0.0" 542 | }, 543 | { 544 | "end": "1.255.255.255", 545 | "start": "0.0.0.0" 546 | } 547 | ] 548 | } 549 | } 550 | } 551 | } --------------------------------------------------------------------------------