@RestResource(urlMapping='/APIWebservice/*') global class APIWebservice { // This method is invoked via an HTTP POST request @HttpPost global static void postAPIWebService() { // Get the incoming REST request RestRequest request = RestContext.request; Map params = request.params; // Extract the store name and Shopify object name from the parameters String storeName = params.get('store'); String ShopifyObjName = params.get('objectname'); // Trim and deserialize the request body to a map String requestBody = request.requestBody.toString().trim(); Map responseMap = (Map) JSON.deserializeUntyped(requestBody); // Set default store name if not provided if (storeName == null || storeName == '') { storeName = 'Default'; } String companyTimeZone = [SELECT Id, TimeZoneSidKey FROM Organization Limit 1][0].TimeZoneSidKey; // Retrieve a list of related webhook objects for the specified Shopify object List objectMappings = [ SELECT Id, Name, HIC_ShopifySync__Resource__c, HIC_ShopifySync__Json_Nested__c, HIC_ShopifySync__Default__c, HIC_ShopifySync__Store__c, HIC_ShopifySync__Preference__c, HIC_ShopifySync__sObject_Name__c, (SELECT Id, HIC_ShopifySync__Default__c, HIC_ShopifySync__Key__c, HIC_ShopifySync__Value_Of__c FROM HIC_ShopifySync__Data_Mappings__r LIMIT 200) FROM HIC_ShopifySync__Object_Mapping__c WHERE Name = :ShopifyObjName AND HIC_ShopifySync__Store__c = :storeName ORDER BY HIC_ShopifySync__Preference__c ]; // Iterate over the list of related webhook objects and upsert Salesforce records for (HIC_ShopifySync__Object_Mapping__c objectMapping : objectMappings) { Map bodyMap = responseMap; List dataList = new List(); String query2 = GenericAPIWebUtility.generateFieldMappingQuery(objectMapping.id); List listOfFiledMapping = database.query(query2); if (objectMapping.HIC_ShopifySync__JSON_Nested__c != null && objectMapping.HIC_ShopifySync__JSON_Nested__c.contains('.')) { String[] nestedKeys = objectMapping.HIC_ShopifySync__JSON_Nested__c.split('\\.'); Object nestedValue = bodyMap.get(nestedKeys[0]); if (nestedValue instanceof Map) { bodyMap = (Map) nestedValue; } else if (nestedValue instanceof List) { List nestedList = (List) nestedValue; if (!nestedList.isEmpty() && nestedList[0] instanceof Map) { bodyMap = (Map) nestedList[0]; } else { return; } } else { return; // Exit or handle the error } objectMapping.HIC_ShopifySync__JSON_Nested__c = nestedKeys[1]; } dataList = GenericAPIWebUtility.processDataMapping(objectMapping.HIC_ShopifySync__JSON_Nested__c, objectMapping.Data_Mappings__r, bodyMap); // Create a list for upserting records String listType = 'List<' + objectMapping.HIC_ShopifySync__sObject_Name__c + '>'; List listOfSobjToUpsert = (List)Type.forName(listType).newInstance(); for(Object dataRecord : dataList){ SObject sobjRecord = GenericAPIWebUtility.processFieldTypeAndMapping(listOfFiledMapping, String.valueOf(objectMapping.HIC_ShopifySync__sObject_Name__c), (Map)dataRecord, companyTimeZone, storeName); if (sobjRecord != null) { listOfSobjToUpsert.add(sobjRecord); } else { system.debug('SObject record is null. Not adding to upsert list.'); } } // Schema.SObjectType SfObject = Schema.getGlobalDescribe().get(objectMapping.HIC_ShopifySync__sObject_Name__c); Schema.SObjectType SfObject = ((SObject)Type.forName(objectMapping.HIC_ShopifySync__sObject_Name__c).newInstance()).getSObjectType(); Map sfFieldsMap = SfObject.getDescribe().fields.getMap(); Schema.SObjectField ShopifyId = sfFieldsMap.get('HIC_ShopifySync__Shopify_Id__c'); List updateResult = new List(); try { if (CheckAccessibility.isUpsertable(String.valueOf(ShopifyId), objectMapping.HIC_ShopifySync__sObject_Name__c)) { Map mapToRestricDuplicateRecord = new Map(); for (SObject record: listOfSobjToUpsert) { if (record.get('HIC_ShopifySync__Shopify_Id__c') != null) { mapToRestricDuplicateRecord.put(record.get('HIC_ShopifySync__Shopify_Id__c'), record); } else { system.debug('Record does not have Shopify ID: ' + record); } } updateResult = Database.upsert(mapToRestricDuplicateRecord.values(), ShopifyId, false); SyncBatchUtility.updateErrorMassage(updateResult, objectMapping.HIC_ShopifySync__sObject_Name__c, mapToRestricDuplicateRecord.values(), ShopifyId, true, storeName); } else { system.debug('Not upserting due to accessibility check failure.'); } } catch (DmlException e) { System.debug('The following exception has occurred during DML operation: ' + e.getMessage()); } // Call to upsert records from Shopify (commented out for now) // updateAllSfRecordFromShopifyUtility.upsertSFRecords(bodyMap, objectMapping, requestBody, storeName); } } }