Skip to content

Commit beb04dc

Browse files
committed
1. add long text support
2. add null checks
1 parent dc3cf4a commit beb04dc

File tree

5 files changed

+135
-43
lines changed

5 files changed

+135
-43
lines changed

force-app/main/default/classes/AccountTriggerTest.cls

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,13 @@ class AccountTriggerTest {
5050

5151
for (Account acc : accounts) {
5252
acc.BillingCountry = 'India';
53+
acc.Description = 'Test Description';
5354
}
5455

5556
update accounts;
5657

5758
Test.startTest();
59+
5860
System.assertEquals(
5961
[
6062
SELECT Id
@@ -68,6 +70,19 @@ class AccountTriggerTest {
6870
200,
6971
'Field history records not found'
7072
);
73+
System.assertEquals(
74+
[
75+
SELECT Id
76+
FROM Field_History__c
77+
WHERE
78+
Tracked_Field_API__c = 'Description'
79+
AND Tracked_Record_Id__c IN :accountIds
80+
]
81+
?.size(),
82+
200,
83+
'Field history records not found'
84+
);
85+
7186
Test.stopTest();
7287
}
7388
}

force-app/main/default/classes/FieldTrackerService.cls

Lines changed: 58 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
Singleton Class implements the custom field history
33
tracking dynamically through custom metadata configuration
44
*/
5-
public with sharing class FieldTrackerService {
5+
public without sharing class FieldTrackerService {
66
// Static members
77
private static FieldTrackerService instance;
88

@@ -17,60 +17,81 @@ public with sharing class FieldTrackerService {
1717
private String objectName;
1818
private Set<String> fields;
1919
private List<Field_Tracker_Field__mdt> trackedFields;
20+
private Field_Tracker_Object__mdt ftObject;
2021

2122
private FieldTrackerService(String objectName) {
2223
this.objectName = objectName;
2324

24-
Field_Tracker_Object__mdt ftObject = Field_Tracker_Object__mdt.getInstance(
25-
objectName
26-
);
27-
trackedFields = [
28-
SELECT Field__c, Field_Label__c
29-
FROM Field_Tracker_Field__mdt
30-
WHERE Field_Tracker_Object__c = :ftObject.Id AND Is_Active__c = TRUE
31-
];
32-
fields = Schema.getGlobalDescribe()
33-
.get(objectName)
34-
.getDescribe()
35-
.fields.getMap()
36-
.keySet();
25+
ftObject = Field_Tracker_Object__mdt.getInstance(objectName);
26+
27+
if (ftObject.Is_Active__c) {
28+
trackedFields = [
29+
SELECT Field__c, Field_Label__c, Is_Long_Text__c
30+
FROM Field_Tracker_Field__mdt
31+
WHERE
32+
Field_Tracker_Object__c = :ftObject.Id
33+
AND Is_Active__c = TRUE
34+
];
35+
fields = Schema.getGlobalDescribe()
36+
.get(objectName)
37+
.getDescribe()
38+
.fields.getMap()
39+
.keySet();
40+
}
3741
}
3842

3943
// OldMap should be null in case of Insert trigger.
4044
public void saveFieldHistories(
4145
List<SObject> records,
4246
Map<Id, SObject> oldMap
4347
) {
44-
List<Field_History__c> fieldHistories = new List<Field_History__c>();
45-
Boolean isNew = oldMap == null;
46-
for (SObject record : records) {
47-
SObject oldRecord = oldMap?.get(record.Id);
48-
for (Field_Tracker_Field__mdt trackedField : trackedFields) {
49-
if (
50-
String.isNotBlank(trackedField.Field__c) &&
51-
fields.contains(trackedField.Field__c.toLowerCase()) &&
52-
(isNew ||
53-
oldRecord.get(trackedField.Field__c) !=
54-
record.get(trackedField.Field__c))
55-
) {
56-
fieldHistories.add(
57-
new Field_History__c(
48+
if (
49+
ftObject != null &&
50+
ftObject.Is_Active__c &&
51+
trackedFields != null &&
52+
!trackedFields.isEmpty()
53+
) {
54+
List<Field_History__c> fieldHistories = new List<Field_History__c>();
55+
Boolean isNew = oldMap == null;
56+
for (SObject record : records) {
57+
SObject oldRecord = oldMap?.get(record.Id);
58+
for (Field_Tracker_Field__mdt trackedField : trackedFields) {
59+
if (
60+
String.isNotBlank(trackedField.Field__c) &&
61+
fields.contains(trackedField.Field__c.toLowerCase()) &&
62+
(isNew && record.get(trackedField.Field__c) != null ||
63+
!isNew &&
64+
oldRecord.get(trackedField.Field__c) !=
65+
record.get(trackedField.Field__c))
66+
) {
67+
Field_History__c history = new Field_History__c(
5868
Tracked_Object__c = objectName,
5969
Tracked_Field_Label__c = trackedField.Field_Label__c,
6070
Tracked_Field_API__c = trackedField.Field__c,
61-
Tracked_Record_Id__c = record.Id,
62-
New_Value__c = String.valueOf(
71+
Tracked_Record_Id__c = record.Id
72+
);
73+
74+
if (!trackedField.Is_Long_Text__c) {
75+
history.New_Value__c = String.valueOf(
6376
record.get(trackedField.Field__c)
64-
),
65-
Old_Value__c = String.valueOf(
77+
);
78+
history.Old_Value__c = String.valueOf(
6679
oldRecord?.get(trackedField.Field__c)
67-
)
68-
)
69-
);
80+
);
81+
} else {
82+
history.New_Value_Long_Text__c = String.valueOf(
83+
record.get(trackedField.Field__c)
84+
);
85+
history.Old_Value_Long_Text__c = String.valueOf(
86+
oldRecord?.get(trackedField.Field__c)
87+
);
88+
history.Is_Long_Text__c = true;
89+
}
90+
fieldHistories.add(history);
91+
}
7092
}
7193
}
94+
insert fieldHistories;
7295
}
73-
74-
insert fieldHistories;
7596
}
7697
}

force-app/main/default/classes/FieldTrackerServiceTest.cls

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,40 @@ class FieldTrackerServiceTest {
2727
Account[] accounts = [SELECT id FROM Account];
2828
for (Account acc : accounts) {
2929
acc.BillingCountry = 'India';
30+
acc.Description = 'Test Description';
3031
}
3132

33+
Set<Id> accountIds = new Map<Id, Account>(accounts).keySet();
34+
3235
update accounts;
3336

34-
System.assert(
37+
Test.startTest();
38+
39+
System.assertEquals(
40+
[
41+
SELECT Id
42+
FROM Field_History__c
43+
WHERE
44+
Tracked_Field_API__c = 'BillingCountry'
45+
AND Tracked_Record_Id__c IN :accountIds
46+
AND Old_Value__c = 'United States'
47+
]
48+
?.size(),
49+
200,
50+
'Field history records not found'
51+
);
52+
System.assertEquals(
3553
[
36-
SELECT Id
37-
FROM Field_History__c
38-
WHERE Tracked_Field_API__c = 'BillingCountry'
39-
]
40-
?.size() > 0
54+
SELECT Id
55+
FROM Field_History__c
56+
WHERE
57+
Tracked_Field_API__c = 'Description'
58+
AND Tracked_Record_Id__c IN :accountIds
59+
]
60+
?.size(),
61+
200,
62+
'Field history records not found'
4163
);
64+
Test.stopTest();
4265
}
4366
}

force-app/main/default/customMetadata/Field_Tracker_Field.Billing_Country.md-meta.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,8 @@
2222
<field>Is_Active__c</field>
2323
<value xsi:type="xsd:boolean">true</value>
2424
</values>
25+
<values>
26+
<field>Is_Long_Text__c</field>
27+
<value xsi:type="xsd:boolean">false</value>
28+
</values>
2529
</CustomMetadata>
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<CustomMetadata
3+
xmlns="http://soap.sforce.com/2006/04/metadata"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
6+
>
7+
<label>Description</label>
8+
<protected>false</protected>
9+
<values>
10+
<field>Field_Label__c</field>
11+
<value xsi:type="xsd:string">Description</value>
12+
</values>
13+
<values>
14+
<field>Field_Tracker_Object__c</field>
15+
<value xsi:type="xsd:string">Account</value>
16+
</values>
17+
<values>
18+
<field>Field__c</field>
19+
<value xsi:type="xsd:string">Description</value>
20+
</values>
21+
<values>
22+
<field>Is_Active__c</field>
23+
<value xsi:type="xsd:boolean">true</value>
24+
</values>
25+
<values>
26+
<field>Is_Long_Text__c</field>
27+
<value xsi:type="xsd:boolean">true</value>
28+
</values>
29+
</CustomMetadata>

0 commit comments

Comments
 (0)