116 lines
6.3 KiB
OpenEdge ABL
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);
|
|
}
|
|
}
|
|
} |