【问题标题】:Automate user creation and deletion through external API requests通过外部 API 请求自动创建和删除用户
【发布时间】:2021-07-08 16:40:14
【问题描述】:

我在 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);
        
    }
          }

感谢您的帮助!

【问题讨论】:

    标签: rest salesforce apex apex-trigger


    【解决方案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”技巧,当我们想从触发器中调用时,如何检查限制您可以在单笔交易中拨打的电话...但应该是一个开始吗?

    【讨论】:

    • 你太棒了!非常感谢,这将对我的公司产生巨大的影响!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2023-03-24
    • 2019-06-23
    • 2018-01-02
    • 1970-01-01
    • 2015-02-23
    相关资源
    最近更新 更多