SyncMadeEasy/force-app/main/default/classes/APIWebservice.cls

116 lines
6.3 KiB
OpenEdge ABL

@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<String, String> 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<String, Object> responseMap = (Map<String, Object>) 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<HIC_ShopifySync__Object_Mapping__c> 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<String, Object> bodyMap = responseMap;
List<Object> dataList = new List<Object>();
String query2 = GenericAPIWebUtility.generateFieldMappingQuery(objectMapping.id);
List<HIC_ShopifySync__HIC_Field_Mapping__c> 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<String, Object>) {
bodyMap = (Map<String, Object>) nestedValue;
}
else if (nestedValue instanceof List<Object>) {
List<Object> nestedList = (List<Object>) nestedValue;
if (!nestedList.isEmpty() && nestedList[0] instanceof Map<String, Object>) {
bodyMap = (Map<String, Object>) 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<SObject> listOfSobjToUpsert = (List<SObject>)Type.forName(listType).newInstance();
for(Object dataRecord : dataList){
SObject sobjRecord = GenericAPIWebUtility.processFieldTypeAndMapping(listOfFiledMapping, String.valueOf(objectMapping.HIC_ShopifySync__sObject_Name__c), (Map<String, Object>)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<String, SObjectField> sfFieldsMap = SfObject.getDescribe().fields.getMap();
Schema.SObjectField ShopifyId = sfFieldsMap.get('HIC_ShopifySync__Shopify_Id__c');
List<Database.upsertResult> updateResult = new List<Database.upsertResult>();
try {
if (CheckAccessibility.isUpsertable(String.valueOf(ShopifyId), objectMapping.HIC_ShopifySync__sObject_Name__c)) {
Map<Object, SObject> mapToRestricDuplicateRecord = new Map<Object, SObject>();
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);
}
}
}