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

224 lines
18 KiB
OpenEdge ABL

/**
* ─────────────────────────────────────────────────────────────────────────────────────────────────┐
* This Utility class is use for create and delete Webhook into the Shopify platform.
* We use rest callout for create and delete webhooks into the Shopify platform.
* Shopify API Documentation: https://shopify.dev/docs/admin-api/rest/reference
* Create Shopify Store: https://www.shopify.com/signup?itcat=identity&itterm=create-new-store
* Shopify API Release 2020: https://www.shopify.in/partners/blog/shopify-api-release-january-2020
* What is Person Account in Salesforce ? https://help.salesforce.com/articleView?id=account_person.htm&type=5
* ──────────────────────────────────────────────────────────────────────────────────────────────────
* @author Sumit <sumit@hicShopify.com>
* ──────────────────────────────────────────────────────────────────────────────────────────────────
*/
public with sharing class HICWebhookUtility {
//Providing Username and Password
public static string USER_NAME;
public static string PASSWORD;
//Provide URL of the Shopify store to HTTP requests
public static string shopifyUrl;
public static List<HIC_ShopifySync__HIC_Configuration__c > configurationList = new List<HIC_ShopifySync__HIC_Configuration__c >();
public HICWebhookUtility(String store){
String query = 'Select '+CheckAccessibility.isAccessible('name, HIC_ShopifySync__Shopify_URL__c, HIC_ShopifySync__API_Key__c, HIC_ShopifySync__Private_Key_Password__c, HIC_ShopifySync__Opportunity__c, HIC_ShopifySync__Order__c, HIC_ShopifySync__Opportunity_Line_Item__c, HIC_ShopifySync__Order_Line_Item__c, HIC_ShopifySync__Order_Fulfillment__c, HIC_ShopifySync__Person_Account__c ','HIC_ShopifySync__HIC_Configuration__c')+' from HIC_ShopifySync__HIC_Configuration__c where '+CheckAccessibility.isAccessible('HIC_ShopifySync__Store__c', 'HIC_ShopifySync__HIC_Configuration__c')+' = \''+store+'\' LIMIT 1';
configurationList = Database.query(query);
if(!configurationList.isEmpty()){
USER_NAME = configurationList[0].HIC_ShopifySync__API_Key__c;
PASSWORD = configurationList[0].HIC_ShopifySync__Private_Key_Password__c;
shopifyUrl = configurationList[0].HIC_ShopifySync__Shopify_URL__c;
}
}
public HICWebhookUtility(List<HIC_ShopifySync__HIC_Configuration__c> configList){
//String query = 'Select '+CheckAccessibility.isAccessible('name, HIC_ShopifySync__Shopify_URL__c, HIC_ShopifySync__API_Key__c, HIC_ShopifySync__Private_Key_Password__c, HIC_ShopifySync__Opportunity__c, HIC_ShopifySync__Order__c, HIC_ShopifySync__Opportunity_Line_Item__c, HIC_ShopifySync__Order_Line_Item__c, HIC_ShopifySync__Order_Fulfillment__c, HIC_ShopifySync__Person_Account__c ','HIC_ShopifySync__HIC_Configuration__c')+' from HIC_ShopifySync__HIC_Configuration__c where '+CheckAccessibility.isAccessible('HIC_ShopifySync__Store__c', 'HIC_ShopifySync__HIC_Configuration__c')+' = \''+store+'\' LIMIT 1';
configurationList = configList;
if(!configurationList.isEmpty()){
USER_NAME = configurationList[0].HIC_ShopifySync__API_Key__c;
PASSWORD = configurationList[0].HIC_ShopifySync__Private_Key_Password__c;
shopifyUrl = configurationList[0].HIC_ShopifySync__Shopify_URL__c;
}
}
@future(callout=true)
public static void deleteWebhook(string objectName, string forDML, string store){
List<HIC_ShopifySync__HIC_Webhook__c> webhookList = new list<HIC_ShopifySync__HIC_Webhook__c>();
String trimmedObjectName = objectName.Trim();
// String query = 'Select '+CheckAccessibility.isAccessible('HIC_ShopifySync__Shopify_Object__c,HIC_ShopifySync__DML_Type__c,HIC_ShopifySync__SF_URL_Mapping__c, HIC_ShopifySync__Topic__c, HIC_ShopifySync__Webhook_Id__c ','HIC_ShopifySync__Webhook__c')+ ' from HIC_ShopifySync__Webhook__c where '+CheckAccessibility.isAccessible('HIC_ShopifySync__Shopify_Object__c','HIC_ShopifySync__Webhook__c')+' = \''+trimmedObjectName+'\' AND '+CheckAccessibility.isAccessible('HIC_ShopifySync__DML_Type__c','HIC_ShopifySync__Webhook__c')+' = \''+forDML+'\' LIMIT 500';
// webhookList = database.query(query);
webhookList = [Select HIC_ShopifySync__Shopify_Object__c,HIC_ShopifySync__DML_Type__c,HIC_ShopifySync__Metafields_Namespace__c,HIC_ShopifySync__SF_URL_Mapping__c, HIC_ShopifySync__Topic__c, HIC_ShopifySync__Webhook_Id__c from HIC_ShopifySync__HIC_Webhook__c where HIC_ShopifySync__Shopify_Object__c =: trimmedObjectName AND HIC_ShopifySync__DML_Type__c =: forDML and HIC_ShopifySync__Store__c =: store LIMIT 500];
if(webhookList.isEmpty()) return;
if(webhookList[0].HIC_ShopifySync__Webhook_Id__c != '' && webhookList[0].HIC_ShopifySync__Webhook_Id__c != null){
string webhookURL = 'webhooks/'+webhookList[0].HIC_ShopifySync__Webhook_Id__c;
map<string,string> responseMap = processRequest(webhookURL,'DELETE','',store);
if(responseMap.containsKey('Ok')){
webhookList[0].HIC_ShopifySync__Webhook_Id__c = null;
try{
Update webhookList[0];
}catch(Exception e){
system.debug('***Error in--'+e.getMessage());
}
}
}else{
list<HIC_ShopifySync__HIC_Configuration__c> configList = new list<HIC_ShopifySync__HIC_Configuration__c>();
// String Configquery = 'Select '+CheckAccessibility.isAccessible('id,HIC_ShopifySync__Salesforce_Site_URL__c,HIC_ShopifySync__Order_Sync__c,HIC_ShopifySync__Draft_Order_Sync__c,HIC_ShopifySync__Product_Sync__c,HIC_ShopifySync__Inventory_Location_Sync__c,HIC_ShopifySync__Customer_Sync__c,HIC_ShopifySync__Collection_Sync__c,name,HIC_ShopifySync__Default_Field_Mapping__c,HIC_ShopifySync__Batch_Is_Processing__c,HIC_ShopifySync__Specify_Close_Date__c, HIC_ShopifySync__Account_Contact__c, HIC_ShopifySync__Person_Account__c, HIC_ShopifySync__Default_Account__c, HIC_ShopifySync__Shopify_URL__c, HIC_ShopifySync__API_Key__c, HIC_ShopifySync__Private_Key_Password__c, HIC_ShopifySync__Opportunity__c, HIC_ShopifySync__Order__c, HIC_ShopifySync__Opportunity_Line_Item__c, HIC_ShopifySync__Order_Line_Item__c, HIC_ShopifySync__Order_Fulfillment__c','HIC_ShopifySync__Configuration__c')+' from HIC_ShopifySync__Configuration__c where '+CheckAccessibility.isAccessible('name','HIC_ShopifySync__Configuration__c')+' = \'Default\' LIMIT 1';
// configList = database.query(Configquery);
configList = [Select id,HIC_ShopifySync__Salesforce_Site_URL__c,HIC_ShopifySync__Order_Sync__c,HIC_ShopifySync__Draft_Order_Sync__c,HIC_ShopifySync__Product_Sync__c,HIC_ShopifySync__Inventory_Location_Sync__c,HIC_ShopifySync__Customer_Sync__c,HIC_ShopifySync__Collection_Sync__c,name,HIC_ShopifySync__Default_Field_Mapping__c,HIC_ShopifySync__Batch_Is_Processing__c,HIC_ShopifySync__Specify_Close_Date__c, HIC_ShopifySync__Account_Contact__c, HIC_ShopifySync__Person_Account__c, HIC_ShopifySync__Default_Account__c, HIC_ShopifySync__Shopify_URL__c, HIC_ShopifySync__API_Key__c, HIC_ShopifySync__Private_Key_Password__c, HIC_ShopifySync__Opportunity__c, HIC_ShopifySync__Order__c, HIC_ShopifySync__Opportunity_Line_Item__c, HIC_ShopifySync__Order_Line_Item__c, HIC_ShopifySync__Order_Fulfillment__c from HIC_ShopifySync__HIC_Configuration__c where HIC_ShopifySync__Store__c =: store LIMIT 1];
if(configList.isEmpty()) return;
System.debug('CheckingWebhookExist Called');
CheckingWebhookExist(webhookList[0].HIC_ShopifySync__Topic__c,configList[0].HIC_ShopifySync__Salesforce_Site_URL__c, webhookList[0].HIC_ShopifySync__SF_URL_Mapping__c,configList,webhookList,store);
}
}
public static void CheckingWebhookExist(String topic,String SiteUrl,String returnClassUrl,list<HIC_ShopifySync__HIC_Configuration__c> configList,List<HIC_ShopifySync__HIC_Webhook__c> webhookList, String store){
String hiturl = 'webhooks.json?topic='+topic+'&address='+SiteUrl+'/services/apexrest/HIC_ShopifySync/'+returnClassUrl+'?objectname='+webhookList[0].HIC_ShopifySync__Shopify_Object__c+'%26DMLType='+webhookList[0].HIC_ShopifySync__DML_Type__c+'%26store='+store;
String WebhookExistResponse ;
if(!Test.isRunningTest()){
WebhookExistResponse = HIC_ShopifyUtility.fetchAllDataUsingId(hiturl,configList);
}else{
WebhookExistResponse = '{ "webhooks": [{ "id": 515347349585, "address": "https://hic-sf-shopify-developer-edition.ap15.force.com/services/apexrest/HIC_ShopifySync/UpdateCollectionAndCollectAuthentication", "topic": "collections/update", "created_at": "2019-09-14T12:43:21+05:30", "updated_at": "2019-09-14T12:43:21+05:30", "format": "json", "fields": [], "metafield_namespaces": [], "api_version": "2019-07" }] }';
}
if(WebhookExistResponse != null && WebhookExistResponse !=''){
map<string,object> main = ( map<string,object>)Json.deserializeUntyped(WebhookExistResponse);
list<Object> listofExistingWebhook =(List<Object>) main.get('webhooks');
for(Object webobj: listofExistingWebhook){
Map<string,object> singlewebhook = (Map<string,object>) webobj;
if(singlewebhook.containsKey('id')){
String webhookURL = 'webhooks/'+String.valueof(singlewebhook.get('id'));
map<string,string> responseMap = processRequest(webhookURL,'DELETE','',store);
if(responseMap.containsKey('Ok')){
system.debug('Done');
}
}
}
}
}
public static map<string,string> processRequest(string objectType, string method, string body, string store){
new HICWebhookUtility(store);
Http h = new Http();
HttpRequest req = new HttpRequest();
string ResponseBody;
map<string,string> statusVsBodyMap = new map<string,string>();
string endPointValue = shopifyUrl + '/admin/'+objectType+'.json';
req.setEndpoint(endPointValue);
//Adding certificate to HTTP Requests
req.setClientCertificateName('Shopify');
/*Blob headerValue = Blob.valueOf(USER_NAME + ':' + PASSWORD);
String authorizationHeader = 'Basic ' +
EncodingUtil.base64Encode(headerValue);
req.setHeader('Authorization', authorizationHeader);*/
req.setHeader('X-Shopify-Access-Token', PASSWORD);
req.setHeader('content-type', 'application/json');
//Use get Method as we are retrieving data from shopify
req.setMethod(method);
req.setTimeout(120000);
if(method == 'POST'){
req.setBody(body);
}
try {
HttpResponse res = h.send(req);
ResponseBody = res.getBody();
System.debug('ResponseBody--' +ResponseBody);
System.debug('res Status--' +res.getStatusCode());
if(res.getStatusCode() == 200 || res.getStatusCode() == 201 || res.getStatusCode() == 204){
statusVsBodyMap.put('Ok',ResponseBody);
return statusVsBodyMap;
}
}catch(Exception e){
if(ResponseBody == '' || ResponseBody == null){
ResponseBody = e.getMessage();
}
System.debug('error --' +e.getMessage());
}
statusVsBodyMap.put('Error',ResponseBody);
return statusVsBodyMap;
}
//Deprecated
@future(callout=true)
public static void deleteWebhook(string objectName, string forDML){}
@future(callout=true)
public static void deleteWebhook(string objectName, string forDML, string store, String config){
List<HIC_ShopifySync__HIC_Configuration__c> configList = (List<HIC_ShopifySync__HIC_Configuration__c>)JSON.deserialize(config, List<HIC_ShopifySync__HIC_Configuration__c>.Class);
List<HIC_ShopifySync__HIC_Webhook__c> webhookList = new list<HIC_ShopifySync__HIC_Webhook__c>();
String trimmedObjectName = objectName.Trim();
// String query = 'Select '+CheckAccessibility.isAccessible('HIC_ShopifySync__Shopify_Object__c,HIC_ShopifySync__DML_Type__c,HIC_ShopifySync__SF_URL_Mapping__c, HIC_ShopifySync__Topic__c, HIC_ShopifySync__Webhook_Id__c ','HIC_ShopifySync__Webhook__c')+ ' from HIC_ShopifySync__Webhook__c where '+CheckAccessibility.isAccessible('HIC_ShopifySync__Shopify_Object__c','HIC_ShopifySync__Webhook__c')+' = \''+trimmedObjectName+'\' AND '+CheckAccessibility.isAccessible('HIC_ShopifySync__DML_Type__c','HIC_ShopifySync__Webhook__c')+' = \''+forDML+'\' LIMIT 500';
// webhookList = database.query(query);
webhookList = [Select HIC_ShopifySync__Shopify_Object__c,HIC_ShopifySync__DML_Type__c,HIC_ShopifySync__SF_URL_Mapping__c,HIC_ShopifySync__Metafields_Namespace__c,HIC_ShopifySync__Topic__c, HIC_ShopifySync__Webhook_Id__c from HIC_ShopifySync__HIC_Webhook__c where HIC_ShopifySync__Shopify_Object__c =: trimmedObjectName AND HIC_ShopifySync__DML_Type__c =: forDML and HIC_ShopifySync__Store__c =: store LIMIT 500];
if(webhookList.isEmpty()) return;
if(webhookList[0].HIC_ShopifySync__Webhook_Id__c != '' && webhookList[0].HIC_ShopifySync__Webhook_Id__c != null){
string webhookURL = 'webhooks/'+webhookList[0].HIC_ShopifySync__Webhook_Id__c;
map<string,string> responseMap = processRequest(webhookURL,'DELETE','',store, configList);
if(responseMap.containsKey('Ok')){
webhookList[0].HIC_ShopifySync__Webhook_Id__c = null;
try{
Update webhookList[0];
}catch(Exception e){
system.debug('***Error in--'+e.getMessage());
}
}
}else{
//configList = new list<HIC_ShopifySync__HIC_Configuration__c>();
// String Configquery = 'Select '+CheckAccessibility.isAccessible('id,HIC_ShopifySync__Salesforce_Site_URL__c,HIC_ShopifySync__Order_Sync__c,HIC_ShopifySync__Draft_Order_Sync__c,HIC_ShopifySync__Product_Sync__c,HIC_ShopifySync__Inventory_Location_Sync__c,HIC_ShopifySync__Customer_Sync__c,HIC_ShopifySync__Collection_Sync__c,name,HIC_ShopifySync__Default_Field_Mapping__c,HIC_ShopifySync__Batch_Is_Processing__c,HIC_ShopifySync__Specify_Close_Date__c, HIC_ShopifySync__Account_Contact__c, HIC_ShopifySync__Person_Account__c, HIC_ShopifySync__Default_Account__c, HIC_ShopifySync__Shopify_URL__c, HIC_ShopifySync__API_Key__c, HIC_ShopifySync__Private_Key_Password__c, HIC_ShopifySync__Opportunity__c, HIC_ShopifySync__Order__c, HIC_ShopifySync__Opportunity_Line_Item__c, HIC_ShopifySync__Order_Line_Item__c, HIC_ShopifySync__Order_Fulfillment__c','HIC_ShopifySync__Configuration__c')+' from HIC_ShopifySync__Configuration__c where '+CheckAccessibility.isAccessible('name','HIC_ShopifySync__Configuration__c')+' = \'Default\' LIMIT 1';
// configList = database.query(Configquery);
//configList = [Select id,HIC_ShopifySync__Salesforce_Site_URL__c,HIC_ShopifySync__Order_Sync__c,HIC_ShopifySync__Draft_Order_Sync__c,HIC_ShopifySync__Product_Sync__c,HIC_ShopifySync__Inventory_Location_Sync__c,HIC_ShopifySync__Customer_Sync__c,HIC_ShopifySync__Collection_Sync__c,name,HIC_ShopifySync__Default_Field_Mapping__c,HIC_ShopifySync__Batch_Is_Processing__c,HIC_ShopifySync__Specify_Close_Date__c, HIC_ShopifySync__Account_Contact__c, HIC_ShopifySync__Person_Account__c, HIC_ShopifySync__Default_Account__c, HIC_ShopifySync__Shopify_URL__c, HIC_ShopifySync__API_Key__c, HIC_ShopifySync__Private_Key_Password__c, HIC_ShopifySync__Opportunity__c, HIC_ShopifySync__Order__c, HIC_ShopifySync__Opportunity_Line_Item__c, HIC_ShopifySync__Order_Line_Item__c, HIC_ShopifySync__Order_Fulfillment__c from HIC_ShopifySync__HIC_Configuration__c where HIC_ShopifySync__Store__c =: store LIMIT 1];
if(configList.isEmpty()) return;
System.debug('CheckingWebhookExist Called');
CheckingWebhookExist(webhookList[0].HIC_ShopifySync__Topic__c,configList[0].HIC_ShopifySync__Salesforce_Site_URL__c, webhookList[0].HIC_ShopifySync__SF_URL_Mapping__c,configList,webhookList,store);
}
}
public static map<string,string> processRequest(string objectType, string method, string body, string store, List<HIC_ShopifySync__HIC_Configuration__c> configList){
new HICWebhookUtility(configList);
Http h = new Http();
HttpRequest req = new HttpRequest();
string ResponseBody;
map<string,string> statusVsBodyMap = new map<string,string>();
string endPointValue = shopifyUrl + '/admin/'+objectType+'.json';
req.setEndpoint(endPointValue);
//Adding certificate to HTTP Requests
req.setClientCertificateName('Shopify');
/*Blob headerValue = Blob.valueOf(USER_NAME + ':' + PASSWORD);
String authorizationHeader = 'Basic ' +
EncodingUtil.base64Encode(headerValue);
req.setHeader('Authorization', authorizationHeader);*/
req.setHeader('X-Shopify-Access-Token', PASSWORD);
req.setHeader('content-type', 'application/json');
//Use get Method as we are retrieving data from shopify
req.setMethod(method);
req.setTimeout(120000);
if(method == 'POST'){
req.setBody(body);
}
try {
HttpResponse res = h.send(req);
ResponseBody = res.getBody();
System.debug('ResponseBody--' +ResponseBody);
System.debug('res Status--' +res.getStatusCode());
if(res.getStatusCode() == 200 || res.getStatusCode() == 201 || res.getStatusCode() == 204){
statusVsBodyMap.put('Ok',ResponseBody);
return statusVsBodyMap;
}
}catch(Exception e){
if(ResponseBody == '' || ResponseBody == null){
ResponseBody = e.getMessage();
}
System.debug('error --' +e.getMessage());
}
statusVsBodyMap.put('Error',ResponseBody);
return statusVsBodyMap;
}
}