Bulkify Apex Methods полученных после запуска сканера

Здравствуйте.
Столкнулся с проблемой, при запуске сканера для подготовки кода в Sequrity Rewiev, получаю ишью Query: Bulkify Apex Methods Using Collections In Methods:
Object: message in file: classes/Sender.cls

L 4: public static void sendMessage(Outbound_Message__c message, Sender_Profile_Source__c source) {
Object: message in file: classes/Sender.cls
L 29: lMessages.add(message);
Object: lmessages in file: classes/Sender.cls
L 30: update lMessages;

Сам код :

 public static void sendMessage(Outbound_Message__c message, Sender_Profile_Source__c source) {
        if (FeatureManagement.checkPermission('Sending_Messages')) {
            if (([SELECT ResultCode__c FROM Outbound_Message__c WHERE Id = :message.Id LIMIT 1].ResultCode__c != 1005)) {
                final String API_Endpoint = 'https://sms/send';
                Http http = new Http();
                HttpRequest request = new HttpRequest();
                request.setEndpoint(API_Endpoint);
                AuthData auth = setAuthorization(source, 1);
                if (auth.messagesToSendCount > 0) {
                    request.setHeader('Authorization', auth.authorization);
                    request.setHeader('Content-Type', 'application/json');
                    request.setMethod('POST');
                    request.setBody(getJSONStringToSend(message, auth));
                    HttpResponse response = http.send(request);
                    if (response.getStatusCode() == 200) {
                        Map<String, Object> responseMap = (Map<String, Object>) JSON.deserializeUntyped(response.getBody());
                        message.MessageId__c = (String) responseMap.get('messageId');
                        message.ResultCode__c = (Integer) responseMap.get('resultCode');
                        if (Schema.sObjectType.Outbound_Message__c.fields.MessageId__c.isUpdateable() && Schema.sObjectType.Outbound_Message__c.fields.ResultCode__c.isUpdateable()) {
/*============================================================*/
                            **update message;**
                        }
                        Messaging_Account__c account = [SELECT Messages_Sent__c FROM Messaging_Account__c WHERE Id = :auth.accountId];
                        ++account.Messages_Sent__c;
                        update account;
                    } else {
                        System.debug('Something wrong ' + response.getBody());
                    }
                } else {
                    throw new MessagesLimitException();
                }
            }
        }
    }

Я пробовал создавать лист, добавлять в него записи создаваемые и апдейтить его-не выходит. Подскажите что я делаю не так.
Спасибо

Сейчас посмотрим код.

P.S. если что, сможете его отформатировать с помощью вот этой штуки.
image

Если это метод сендер, то лучше лишнее из него убрать.

А то и кони и люди и всё в одном тут смешалось.

public static void sendMessage(Outbound_Message__c message, Sender_Profile_Source__c source) {
    if (FeatureManagement.checkPermission(‘Sending_Messages’)) {
        if (([SELECT ResultCode__c FROM Outbound_Message__c WHERE Id =: message.Id LIMIT 1].ResultCode__c != 1005)) {
            final String API_Endpoint = ‘https: //sms/send’;
            Http http = new Http();
            HttpRequest request = new HttpRequest();
            request.setEndpoint(API_Endpoint);
            AuthData auth = setAuthorization(source, 1);
            if (auth.messagesToSendCount > 0) {
                request.setHeader(‘Authorization’, auth.authorization);
                request.setHeader(‘Content - Type’, ‘application / json’);
                request.setMethod(‘POST’);
                request.setBody(getJSONStringToSend(message, auth));
                HttpResponse response = http.send(request);
                if (response.getStatusCode() == 200) {
                    Map < String, Object > responseMap = (Map < String, Object > ) JSON.deserializeUntyped(response.getBody());
                    message.MessageId__c = (String) responseMap.get(‘messageId’);
                    message.ResultCode__c = (Integer) responseMap.get(‘resultCode’);
                    if (Schema.sObjectType.Outbound_Message__c.fields.MessageId__c.isUpdateable() && Schema.sObjectType.Outbound_Message__c.fields.ResultCode__c.isUpdateable()) {
                    /============================================================/
                    update message;
                }
                Messaging_Account__c account = [SELECT Messages_Sent__c FROM Messaging_Account__c WHERE Id =: auth.accountId];
                ++account.Messages_Sent__c;
                update account;
                } else {
                    System.debug('Something wrong ’ + response.getBody());
                }
            } else {
                throw new MessagesLimitException();
            }
        }
    }
}

попробуйте вот так сделать.

update new List<Outbound_Message__c>{message};

пробовал update new List<Outbound_Message__c>{message}; - все равно ишью остается.

Bulkify Apex Methods Using Collections In Methods

м.б. так?
public static void sendMessage(List<Outbound_Message__c> message, Sender_Profile_Source__c source) { … }

L 29: и L 30: насколько понимаю, закомментированы -> м.б. там необходимо тоже перейти к коллекциям.

1 Like

Так сработало. Я правда не очень понимаю логику этого сканера. Но поменяв на лист входящи еданные успешно апдейтил и данная ишка пропала .Спасибо

2 Likes

Логика сф непостежима…

Хотя есть подозрение что это из-за того что именно входящий параметр Вы сохраняете, по этой прчиине код должен быть балкифицированн.