通过外部 API 请求自动创建和删除用户

Automate user creation and deletion through external API requests

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

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

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

我需要帮助弄清楚如何编写将 Aircall ID 发送到 class 的 APEX 触发器(将在删除用户后触发)以及最后如何自动触发此 class 收到 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);
        
    }
          }

感谢您的帮助!

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

“您无法在用户界面或 API 中删除用户。您可以在用户界面中停用用户;并且您可以在用户界面中停用或禁用客户门户网站或合作伙伴门户网站用户用户界面或 API。因为永远无法删除用户,我们建议您在创建用户时谨慎行事。“

对于停用,您需要这样的东西。 (它没有写成最佳实践,理想情况下,触发器应该是“瘦”的,实际处理卸载到助手 class。它还假设您一次最多批量更新 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”技巧,如何检查您可以在单笔交易中进行的通话限制......但应该是一个开始?