Skip to content

APEX REST endpoint for fetching person idents from record ids #27

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Jun 16, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion sfdx-project.json
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,20 @@
"versionNumber": "0.157.0.LATEST"
}
]
},
{
"versionName": "ver 0.2",
"versionNumber": "0.2.0.NEXT",
"path": "src/integration/audit-logging",
"default": false,
"package": "audit-logging",
"versionDescription": "Overføring av logger til ArcSight",
"dependencies": [
{
"package": "crm-platform-base",
"versionNumber": "0.253.0.LATEST"
}
]
}
],
"packageAliases": {
Expand All @@ -83,6 +97,7 @@
"crm-shared-flowComponents": "0Ho2o000000fxYJCAY",
"crm-platform-integration": "0Ho2o0000008ORrCAM",
"crm-platform-oppgave": "0Ho2o000000fxXzCAI",
"crm-platform-reporting": "0Ho2o0000008OSfCAM"
"crm-platform-reporting": "0Ho2o0000008OSfCAM",
"audit-logging": "0HoQC00000003sL0AQ"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
@RestResource(urlMapping='/audit-logging/person-idents')
global with sharing class AuditLoggingPersonIdentService {
@HttpPost
global static void getPersonIdents() {
PersonIdentRequest request = (PersonIdentRequest) JSON.deserialize(
RestContext.request.requestBody.toString(),
PersonIdentRequest.class
);

List<String> recordIds = request.recordIds;
String soqlQuery =
'SELECT Id, ' +
request.personIdentField +
' FROM ' +
request.objectName +
' WHERE Id IN :recordIds' +
' WITH SECURITY_ENFORCED';

try {
List<SObject> records = Database.query(soqlQuery);
List<PersonIdentResponse> responses = new List<PersonIdentResponse>();
for (SObject record : records) {
PersonIdentResponse response = new PersonIdentResponse();
response.recordId = (String) record.get('Id');
response.personIdent = getPersonIdent(
request.personIdentField,
record
);
responses.add(response);
}

// Serialize the response to JSON
setResponse(200, JSON.serialize(responses));
} catch (Exception e) {
// Handle any exceptions and return a 500 status code
setResponse(500, e.getMessage());
}
}
global class PersonIdentRequest {
global String objectName;
global String personIdentField;
global List<String> recordIds;
}

private static void setResponse(Integer statusCode, String payload) {
RestResponse response = RestContext.response;
response.statusCode = statusCode;
response.responseBody = Blob.valueOf(payload);
response.addHeader('Content-Type', 'application/json');
}

private static String getPersonIdent(
String personIdentField,
SObject record
) {
if (personIdentField.contains('.')) {
List<String> parts = personIdentField.split('\\.');
SObject related = record;
for (Integer i = 0; i < parts.size() - 1; i++) {
related = (SObject) related.getSObject(parts[i]);
if (related == null)
break;
}
return (related != null &&
related.get(parts[parts.size() - 1]) != null)
? String.valueOf(related.get(parts[parts.size() - 1]))
: null;
}
return (String) record.get(personIdentField);
}

global class PersonIdentResponse {
global String recordId;
global String personIdent;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>62.0</apiVersion>
<status>Active</status>
</ApexClass>
Original file line number Diff line number Diff line change
@@ -0,0 +1,252 @@
@IsTest
private class AuditLoggingPersonIdentServiceTest {
@TestSetup
static void makeData() {
List<Account> accounts = new List<Account>{
new Account(
Name = 'Test Account 1',
INT_PersonIdent__c = '1234567890'
),
new Account(
Name = 'Test Account 2',
INT_PersonIdent__c = '0987654321'
),
new Account(Name = 'Test Account 3')
};
insert accounts;

Case testCase = new Case(
Subject = 'Test Case',
AccountId = accounts[0].Id
);
insert testCase;

WorkOrder workOrder = new WorkOrder(
Subject = 'Test Work Order',
AccountId = accounts[0].Id
);
insert workOrder;

WorkOrderLineItem workOrderLineItem = new WorkOrderLineItem(
WorkOrderId = workOrder.Id,
Subject = 'Test Work Order Line Item'
);
insert workOrderLineItem;
}

@IsTest
static void shouldReturnTwoPersonIdentsWhenToRecordIdsAsInput() {
// Arrange
AuditLoggingPersonIdentService.PersonIdentRequest request = new AuditLoggingPersonIdentService.PersonIdentRequest();
request.objectName = 'Account';
request.personIdentField = 'INT_PersonIdent__c';
request.recordIds = new List<Id>{
[SELECT Id FROM Account WHERE Name = 'Test Account 1']
.Id,
[SELECT Id FROM Account WHERE Name = 'Test Account 2']
.Id
};

RestContext.request = new RestRequest();
RestContext.request.requestBody = Blob.valueOf(JSON.serialize(request));

// Act
Test.startTest();
RestContext.response = new RestResponse();
AuditLoggingPersonIdentService.getPersonIdents();
Test.stopTest();

// Assert
Assert.areEqual(200, RestContext.response.statusCode);
String responseBody = RestContext.response.responseBody.toString();
Assert.areNotEqual(null, responseBody);

Assert.areEqual(
'[{"recordId":"' +
request.recordIds[0] +
'","personIdent":"1234567890"},{"recordId":"' +
request.recordIds[1] +
'","personIdent":"0987654321"}]',
responseBody
);
}

@IsTest
static void shouldReturnNullForPersonIdentWhenAccountIsMissingPersonIdent() {
// Arrange
AuditLoggingPersonIdentService.PersonIdentRequest request = new AuditLoggingPersonIdentService.PersonIdentRequest();
request.objectName = 'Account';
request.personIdentField = 'INT_PersonIdent__c';
request.recordIds = new List<Id>{
[SELECT Id FROM Account WHERE Name = 'Test Account 3']
.Id
};

RestContext.request = new RestRequest();
RestContext.request.requestBody = Blob.valueOf(JSON.serialize(request));

// Act
Test.startTest();
RestContext.response = new RestResponse();
AuditLoggingPersonIdentService.getPersonIdents();
Test.stopTest();

// Assert
Assert.areEqual(200, RestContext.response.statusCode);
String responseBody = RestContext.response.responseBody.toString();
Assert.areNotEqual(null, responseBody);

Assert.areEqual(
'[{"recordId":"' + request.recordIds[0] + '","personIdent":null}]',
responseBody
);
}

@IsTest
static void shouldReturnEmptyListWhenRecordIdDoesNotExist() {
// Arrange
AuditLoggingPersonIdentService.PersonIdentRequest request = new AuditLoggingPersonIdentService.PersonIdentRequest();
request.objectName = 'Account';
request.personIdentField = 'INT_PersonIdent__c';
request.recordIds = new List<Id>{ '001xx000003DGYAAA4' };
RestContext.request = new RestRequest();
RestContext.request.requestBody = Blob.valueOf(JSON.serialize(request));

// Act
Test.startTest();
RestContext.response = new RestResponse();
AuditLoggingPersonIdentService.getPersonIdents();
Test.stopTest();

// Assert
Assert.areEqual(200, RestContext.response.statusCode);
String responseBody = RestContext.response.responseBody.toString();
Assert.areNotEqual(null, responseBody);

Assert.areEqual('[]', responseBody);
}

@IsTest
static void shouldReturn500StatusCodeWhenUnknownObject() {
// Arrange
AuditLoggingPersonIdentService.PersonIdentRequest request = new AuditLoggingPersonIdentService.PersonIdentRequest();
request.objectName = 'Account2';
request.personIdentField = 'INT_PersonIdent__c';
request.recordIds = new List<Id>{
[SELECT Id FROM Account WHERE Name = 'Test Account 1']
.Id,
[SELECT Id FROM Account WHERE Name = 'Test Account 2']
.Id
};

RestContext.request = new RestRequest();
RestContext.request.requestBody = Blob.valueOf(JSON.serialize(request));

// Act
Test.startTest();
RestContext.response = new RestResponse();
AuditLoggingPersonIdentService.getPersonIdents();
Test.stopTest();

// Assert
Assert.areEqual(500, RestContext.response.statusCode);
String responseBody = RestContext.response.responseBody.toString();
String expectedErrorMessage = 'sObject type \'Account2\' is not supported.';
Assert.isTrue((responseBody.contains(expectedErrorMessage)));
}

@IsTest
static void shouldReturn500StatusCodeWhenUnknownPersonIdentField() {
// Arrange
AuditLoggingPersonIdentService.PersonIdentRequest request = new AuditLoggingPersonIdentService.PersonIdentRequest();
request.objectName = 'Account';
request.personIdentField = 'Unknown';
request.recordIds = new List<Id>{
[SELECT Id FROM Account WHERE Name = 'Test Account 1']
.Id,
[SELECT Id FROM Account WHERE Name = 'Test Account 2']
.Id
};

RestContext.request = new RestRequest();
RestContext.request.requestBody = Blob.valueOf(JSON.serialize(request));

// Act
Test.startTest();
RestContext.response = new RestResponse();
AuditLoggingPersonIdentService.getPersonIdents();
Test.stopTest();

// Assert
Assert.areEqual(500, RestContext.response.statusCode);
String responseBody = RestContext.response.responseBody.toString();
String expectedErrorMessage = 'No such column \'Unknown\' on entity';
Assert.isTrue((responseBody.contains(expectedErrorMessage)));
}

@IsTest
static void shouldReturnOnePersonIdentsWhenOneCaseIdAsInput() {
// Arrange
AuditLoggingPersonIdentService.PersonIdentRequest request = new AuditLoggingPersonIdentService.PersonIdentRequest();
request.objectName = ' Case';
request.personIdentField = 'Account.INT_PersonIdent__c';
request.recordIds = new List<Id>{
[SELECT Id FROM Case WHERE Subject = 'Test Case']
.Id
};

RestContext.request = new RestRequest();
RestContext.request.requestBody = Blob.valueOf(JSON.serialize(request));

// Act
Test.startTest();
RestContext.response = new RestResponse();
AuditLoggingPersonIdentService.getPersonIdents();
Test.stopTest();

// Assert
Assert.areEqual(200, RestContext.response.statusCode);
String responseBody = RestContext.response.responseBody.toString();
Assert.areNotEqual(null, responseBody);

Assert.areEqual(
'[{"recordId":"' +
request.recordIds[0] +
'","personIdent":"1234567890"}]',
responseBody
);
}

@IsTest
static void shouldReturnOnePersonIdentsWhenOneWrokOrderLineItemAsInput() {
// Arrange
AuditLoggingPersonIdentService.PersonIdentRequest request = new AuditLoggingPersonIdentService.PersonIdentRequest();
request.objectName = 'WorkOrderLineItem';
request.personIdentField = 'WorkOrder.Account.INT_PersonIdent__c';
request.recordIds = new List<Id>{
[SELECT Id FROM WorkOrderLineItem LIMIT 1]
.Id
};

RestContext.request = new RestRequest();
RestContext.request.requestBody = Blob.valueOf(JSON.serialize(request));

// Act
Test.startTest();
RestContext.response = new RestResponse();
AuditLoggingPersonIdentService.getPersonIdents();
Test.stopTest();

// Assert
Assert.areEqual(200, RestContext.response.statusCode);
String responseBody = RestContext.response.responseBody.toString();
Assert.areNotEqual(null, responseBody);

Assert.areEqual(
'[{"recordId":"' +
request.recordIds[0] +
'","personIdent":"1234567890"}]',
responseBody
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>62.0</apiVersion>
<status>Active</status>
</ApexClass>
Loading