Skip to content

Commit e00cd19

Browse files
authored
Merge pull request #1570 from SFDO-Community/feature/1565-enable-dlrs-to-use-namedcreds
#1565 Normalize MDT API access, enable Named Cred instead of using crrrent session
2 parents 3e357b6 + c6726a7 commit e00cd19

File tree

6 files changed

+66
-15
lines changed

6 files changed

+66
-15
lines changed

dlrs/libs/metadataservice/classes/MetadataService.cls

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36899,8 +36899,14 @@ public class MetadataService {
3689936899
};
3690036900
}
3690136901
public class MetadataPort {
36902-
public String endpoint_x =
36903-
URL.getOrgDomainUrl().toExternalForm() + '/services/Soap/m/34.0';
36902+
public String endpoint_x {
36903+
get {
36904+
return endpointUrl + endpointPath;
36905+
}
36906+
private set;
36907+
}
36908+
public String endpointUrl = URL.getOrgDomainUrl().toExternalForm();
36909+
public String endpointPath = '/services/Soap/m/63.0'; // changing to 64+ causes a break, please test deployment if increasing
3690436910
public Map<String, String> inputHttpHeaders_x;
3690536911
public Map<String, String> outputHttpHeaders_x;
3690636912
public String clientCertName_x;

dlrs/main/classes/CustomMetadataService.cls

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,10 +192,19 @@ public class CustomMetadataService {
192192
/**
193193
* Connect to the Metadata API
194194
**/
195-
private static MetadataService.MetadataPort createService() {
195+
public static MetadataService.MetadataPort createService() {
196196
MetadataService.MetadataPort service = new MetadataService.MetadataPort();
197197
service.SessionHeader = new MetadataService.SessionHeader_element();
198198
service.SessionHeader.sessionId = UserInfo.getSessionId();
199+
String namedCredApiName = DeclarativeLookupRollupSummaries__c.getInstance()
200+
.NamedCredentialForApi__c;
201+
if (String.isNotBlank(namedCredApiName)) {
202+
service.endpointUrl = String.format(
203+
'callout:{0}',
204+
new List<String>{ namedCredApiName }
205+
);
206+
service.SessionHeader.sessionId = '{!$Credential.OAuthToken}';
207+
}
199208
return service;
200209
}
201210

dlrs/main/classes/CustomMetadataServiceTest.cls

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,39 @@ private class CustomMetadataServiceTest {
100100
Assert.areEqual(1, Limits.getDmlRows());
101101
}
102102

103+
@IsTest
104+
static void testCreateServiceWithoutNamedCred() {
105+
MetadataService.MetadataPort svc = CustomMetadataService.createService();
106+
Assert.areEqual(URL.getOrgDomainUrl().toExternalForm(), svc.endpointUrl);
107+
Assert.isTrue(svc.SessionHeader.sessionId.endsWith('!ApexTestSession'));
108+
}
109+
110+
@IsTest
111+
static void testCreateServiceWithNullNamedCred() {
112+
DeclarativeLookupRollupSummaries__c settings = DeclarativeLookupRollupSummaries__c.getInstance();
113+
settings.NamedCredentialForAPI__c = null;
114+
insert settings;
115+
116+
System.runAs(new User(Id = UserInfo.getUserId())) {
117+
MetadataService.MetadataPort svc = CustomMetadataService.createService();
118+
Assert.areEqual(URL.getOrgDomainUrl().toExternalForm(), svc.endpointUrl);
119+
Assert.isTrue(svc.SessionHeader.sessionId.endsWith('!ApexTestSession'));
120+
}
121+
}
122+
123+
@IsTest
124+
static void testCreateServiceWithNamedCred() {
125+
DeclarativeLookupRollupSummaries__c settings = DeclarativeLookupRollupSummaries__c.getInstance();
126+
settings.NamedCredentialForAPI__c = 'TestCred';
127+
insert settings;
128+
129+
System.runAs(new User(Id = UserInfo.getUserId())) {
130+
MetadataService.MetadataPort svc = CustomMetadataService.createService();
131+
Assert.areEqual('callout:TestCred', svc.endpointUrl);
132+
Assert.areEqual('{!$Credential.OAuthToken}', svc.SessionHeader.sessionId);
133+
}
134+
}
135+
103136
public class MetadataServiceDeleteSuccessCalloutMock implements WebServiceMock {
104137
public void doInvoke(
105138
Object stub,

dlrs/main/classes/RollupController.cls

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ public with sharing class RollupController {
359359
);
360360

361361
// Deploy zip file posted back from the page action function
362-
MetadataService.MetadataPort service = createService();
362+
MetadataService.MetadataPort service = CustomMetadataService.createService();
363363
MetadataService.DeployOptions deployOptions = new MetadataService.DeployOptions();
364364
deployOptions.testLevel = 'RunSpecifiedTests';
365365
deployOptions.runTests = new List<String>{ RollupTriggerTestName };
@@ -380,7 +380,7 @@ public with sharing class RollupController {
380380

381381
public PageReference checkAsyncRequest() {
382382
// Check the status of the retrieve request
383-
MetadataService.MetadataPort service = createService();
383+
MetadataService.MetadataPort service = CustomMetadataService.createService();
384384
MetadataService.DeployResult deployResult = service.checkDeployStatus(
385385
AsyncResult.Id,
386386
true
@@ -617,11 +617,4 @@ public with sharing class RollupController {
617617
return FALLBACK_COMPONENT_API_VERSION;
618618
}
619619
}
620-
621-
private static MetadataService.MetadataPort createService() {
622-
MetadataService.MetadataPort service = new MetadataService.MetadataPort();
623-
service.SessionHeader = new MetadataService.SessionHeader_element();
624-
service.SessionHeader.sessionId = UserInfo.getSessionId();
625-
return service;
626-
}
627620
}

dlrs/main/classes/RollupService.cls

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,7 @@ global with sharing class RollupService {
3939

4040
global static Boolean checkMetadataAPIConnection() {
4141
try {
42-
MetadataService.MetadataPort service = new MetadataService.MetadataPort();
43-
service.SessionHeader = new MetadataService.SessionHeader_element();
44-
service.SessionHeader.sessionId = UserInfo.getSessionId();
42+
MetadataService.MetadataPort service = CustomMetadataService.createService();
4543
List<MetadataService.ListMetadataQuery> queries = new List<MetadataService.ListMetadataQuery>();
4644
MetadataService.ListMetadataQuery remoteSites = new MetadataService.ListMetadataQuery();
4745
remoteSites.type_x = 'RemoteSiteSetting';
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<CustomField xmlns="http://soap.sforce.com/2006/04/metadata">
3+
<fullName>NamedCredentialForAPI__c</fullName>
4+
<externalId>false</externalId>
5+
<inlineHelpText>Override default DLRS behavior and use this named credential to access Salesforce APIs for metadata management.</inlineHelpText>
6+
<label>Named Credential for API</label>
7+
<length>255</length>
8+
<required>false</required>
9+
<trackTrending>false</trackTrending>
10+
<type>Text</type>
11+
<unique>false</unique>
12+
</CustomField>

0 commit comments

Comments
 (0)