diff --git a/sfdx-project.json b/sfdx-project.json index 7d5f1dd..5a7c22a 100644 --- a/sfdx-project.json +++ b/sfdx-project.json @@ -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": { @@ -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" } } diff --git a/src/integration/audit-logging/classes/services/AuditLoggingPersonIdentService.cls b/src/integration/audit-logging/classes/services/AuditLoggingPersonIdentService.cls new file mode 100644 index 0000000..aa9b219 --- /dev/null +++ b/src/integration/audit-logging/classes/services/AuditLoggingPersonIdentService.cls @@ -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 recordIds = request.recordIds; + String soqlQuery = + 'SELECT Id, ' + + request.personIdentField + + ' FROM ' + + request.objectName + + ' WHERE Id IN :recordIds' + + ' WITH SECURITY_ENFORCED'; + + try { + List records = Database.query(soqlQuery); + List responses = new List(); + 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 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 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; + } +} diff --git a/src/integration/audit-logging/classes/services/AuditLoggingPersonIdentService.cls-meta.xml b/src/integration/audit-logging/classes/services/AuditLoggingPersonIdentService.cls-meta.xml new file mode 100644 index 0000000..998805a --- /dev/null +++ b/src/integration/audit-logging/classes/services/AuditLoggingPersonIdentService.cls-meta.xml @@ -0,0 +1,5 @@ + + + 62.0 + Active + diff --git a/src/integration/audit-logging/classes/services/tests/AuditLoggingPersonIdentServiceTest.cls b/src/integration/audit-logging/classes/services/tests/AuditLoggingPersonIdentServiceTest.cls new file mode 100644 index 0000000..d7df82c --- /dev/null +++ b/src/integration/audit-logging/classes/services/tests/AuditLoggingPersonIdentServiceTest.cls @@ -0,0 +1,252 @@ +@IsTest +private class AuditLoggingPersonIdentServiceTest { + @TestSetup + static void makeData() { + List accounts = new List{ + 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{ + [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{ + [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{ '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{ + [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{ + [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{ + [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{ + [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 + ); + } +} diff --git a/src/integration/audit-logging/classes/services/tests/AuditLoggingPersonIdentServiceTest.cls-meta.xml b/src/integration/audit-logging/classes/services/tests/AuditLoggingPersonIdentServiceTest.cls-meta.xml new file mode 100644 index 0000000..998805a --- /dev/null +++ b/src/integration/audit-logging/classes/services/tests/AuditLoggingPersonIdentServiceTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 62.0 + Active +