0

我在 APEX 中的编码经验为 0,因此非常感谢您对这个问题的帮助和支持!

如果删除了 SF 用户,我想找出一种方法来自动删除 Aircall 用户。让我们假设每个 SF 用户都有一个 Aircall ID,该 ID 存在于他们的用户配置文件中,存储在一个名为“Aircall ID”的字段中。这是我形成删除请求所需要的。

我希望当在 Salesforce 上删除用户时,它会触发 Aircall 的删除请求,将之前存储在 Aircall ID 字段中的值发送到相关的特定端点。

我需要帮助弄清楚如何编写一个将 Aircall ID 发送到类的 APEX 触发器(在用户被删除后触发),最后如何在收到 ID 后自动触发该类的执行以完成Aircall平台上的用户删除。

public class deleteAirCallUser {

    Http http = new Http();
    HttpRequest request = new HttpRequest();
    
    request.setMethod('DELETE');
    
    string encodedCredentials = 'apikey';
    String authorizationHeader = 'Basic ' + encodedCredentials;
    request.setHeader('Content-Type', 'application/json;charset=UTF-8');
    request.setHeader('Authorization', authorizationHeader);
    string AircallUserId = //should be the Aircall userID from the deleted profile
    request.setBody(AircallUserId);
    request.setEndpoint('https://api.aircall.io/v1/users/'+ Aircall userID);
    
    HttpResponse response = http.send(request);
    
    if (response.getStatusCode() == 200) {
       
        
        Map<String, Object> results = (Map<String, Object>) JSON.deserializeUntyped(response.getBody());
        
        System.debug(results);}
    
    else{
        
        Map<String, Object> results_2 = (Map<String, Object>) JSON.deserializeUntyped(response.getBody());
        
        System.debug(results_2);
        
    }
          }

谢谢您的帮助!

4

1 回答 1

1

https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_objects_user.htm

“您无法在用户界面或 API 中删除用户。您可以在用户界面中停用用户;您可以在用户界面或 API 中停用或禁用客户门户网站或合作伙伴门户网站用户。因为用户可以永远不会被删除,我们建议您在创建它们时要小心。”

对于停用,您将需要这样的东西。(它不是按照最佳实践编写的,理想情况下,触发器将是“瘦”并且实际处理卸载到帮助程序类。此外,它假设您一次最多更新 10 个用户,因为这是标注的限制。

trigger UserTrigger on User (after update){

    Set<String> toSend = new Set<String>();
    for(User u : trigger.new){
        User oldUser = trigger.oldMap.get(u.Id);
        // have we deactivated them?
        if(!u.isActive && oldUser.isActive && String.isNotBlank(u.AirCallId__c)){
            toSend.add(u.AirCallId__c);
        }
    }
    if(!toSend.isEmpty()){
        sendAirCallDeletes(toSend);
    }
    
    // This should be in a helper class, it looks bizarre to have functions defined in trigger's body
    @future
    static void sendAirCallDeletes(Set<String> toSend){
        Http http = new Http();
        HttpRequest request = new HttpRequest();
        request.setMethod('DELETE');
        String encodedCredentials = 'apikey';
        String authorizationHeader = 'Basic ' + encodedCredentials;
        request.setHeader('Content-Type', 'application/json;charset=UTF-8');
        request.setHeader('Authorization', authorizationHeader);
        for(String airCallId : toSend){
            request.setBody(airCallId);
            request.setEndpoint('https://api.aircall.io/v1/users/'+ airCallId);
            try{
                HttpResponse response = http.send(request);
                System.debug(response.getStatusCode());
                System.debug(response.getBody());
                System.debug((Map<String, Object>) JSON.deserializeUntyped(response.getBody());
            } catch(Exception e){
                System.debug(e);
            }
        }
    }
}

您可能想了解“命名凭据”(不要将 api 密钥等存储在代码中),为什么当我们想从触发器中调用时需要“@future”技巧,如何检查您的呼叫限制可以单笔交易...但应该是一个开始?

于 2021-07-08T22:19:38.017 回答