22using System . Collections . Concurrent ;
33using System . Collections . Generic ;
44using System . Linq ;
5- using System . Reflection ;
65using System . Threading . Tasks ;
76using AutoCompare ;
87using Hangfire ;
@@ -25,11 +24,7 @@ public class LogChangesOrderChangedEventHandler : IEventHandler<OrderChangedEven
2524 private readonly IMemberService _memberService ;
2625 private readonly IChangeLogService _changeLogService ;
2726 private readonly ISettingsManager _settingsManager ;
28- private static readonly ConcurrentDictionary < Type , HashSet < string > > _auditablePropertiesCacheByTypeDict = new ( ) ;
29- private static readonly PropertyInfo [ ] _addressProperties = typeof ( Address )
30- . GetProperties ( BindingFlags . Instance | BindingFlags . Public )
31- . OrderBy ( p => p . Name )
32- . ToArray ( ) ;
27+ private static readonly ConcurrentDictionary < Type , List < string > > _auditablePropertiesCacheByTypeDict = new ( ) ;
3328
3429 public LogChangesOrderChangedEventHandler ( IChangeLogService changeLogService , IMemberService memberService , ISettingsManager settingsManager )
3530 {
@@ -62,14 +57,14 @@ protected virtual IList<OperationLog> GetOperationLogs(IEnumerable<GenericChange
6257 switch ( changedEntry . EntryState )
6358 {
6459 case EntryState . Modified :
65- {
66- var originalOperations = changedEntry . OldEntry . GetFlatObjectsListWithInterface < IOperation > ( ) . Distinct ( ) . ToList ( ) ;
67- var modifiedOperations = changedEntry . NewEntry . GetFlatObjectsListWithInterface < IOperation > ( ) . Distinct ( ) . ToList ( ) ;
60+ {
61+ var originalOperations = changedEntry . OldEntry . GetFlatObjectsListWithInterface < IOperation > ( ) . Distinct ( ) . ToList ( ) ;
62+ var modifiedOperations = changedEntry . NewEntry . GetFlatObjectsListWithInterface < IOperation > ( ) . Distinct ( ) . ToList ( ) ;
6863
69- modifiedOperations . CompareTo ( originalOperations , EqualityComparer < IOperation > . Default ,
70- ( state , modified , original ) => operationLogs . AddRange ( GetChangedEntryOperationLogs ( new GenericChangedEntry < IOperation > ( modified , original , state ) ) ) ) ;
71- break ;
72- }
64+ modifiedOperations . CompareTo ( originalOperations , EqualityComparer < IOperation > . Default ,
65+ ( state , modified , original ) => operationLogs . AddRange ( GetChangedEntryOperationLogs ( new GenericChangedEntry < IOperation > ( modified , original , state ) ) ) ) ;
66+ break ;
67+ }
7368 case EntryState . Added or EntryState . Deleted :
7469 operationLogs . AddRange ( GetChangedEntryOperationLogs ( new GenericChangedEntry < IOperation > ( changedEntry . NewEntry , changedEntry . OldEntry , changedEntry . EntryState ) ) ) ;
7570 break ;
@@ -91,60 +86,60 @@ protected virtual IEnumerable<OperationLog> GetChangedEntryOperationLogs(Generic
9186 switch ( changedEntry . EntryState )
9287 {
9388 case EntryState . Modified :
94- {
95- var logs = new List < string > ( ) ;
96- var diff = GetOperationDifferences ( changedEntry , logs ) ;
97- var auditableProperties = GetAuditableProperties ( changedEntry ) ;
98-
99- if ( auditableProperties . Count > 0 )
10089 {
101- var observedDifferences = diff
102- . Where ( x => auditableProperties . Contains ( x . Name ) )
103- . Distinct ( new DifferenceComparer ( ) ) ;
90+ var logs = new List < string > ( ) ;
91+ var diff = GetOperationDifferences ( changedEntry , logs ) ;
92+ var auditableProperties = GetAuditableProperties ( changedEntry ) ;
10493
105- foreach ( var difference in observedDifferences )
94+ if ( auditableProperties . Count > 0 )
10695 {
107- logs . Add ( $ "The { changedEntry . OldEntry . OperationType } { changedEntry . NewEntry . Number } property '{ difference . Name } ' changed from '{ difference . OldValue } ' to '{ difference . NewValue } '") ;
96+ var observedDifferences = diff
97+ . Where ( x => auditableProperties . ContainsIgnoreCase ( x . Name ) )
98+ . Distinct ( new DifferenceComparer ( ) ) ;
99+
100+ foreach ( var difference in observedDifferences )
101+ {
102+ logs . Add ( $ "The { changedEntry . OldEntry . OperationType } { changedEntry . NewEntry . Number } property '{ difference . Name } ' changed from '{ difference . OldValue } ' to '{ difference . NewValue } '") ;
103+ }
108104 }
109- }
110105
111- foreach ( var log in logs )
112- {
113- result . Add ( GetLogRecord ( changedEntry . NewEntry , log ) ) ;
114- }
106+ foreach ( var log in logs )
107+ {
108+ result . Add ( GetLogRecord ( changedEntry . NewEntry , log ) ) ;
109+ }
115110
116- break ;
117- }
111+ break ;
112+ }
118113 case EntryState . Deleted :
119- {
120- var record = GetLogRecord ( changedEntry . NewEntry ,
121- $ "The { changedEntry . NewEntry . OperationType } { changedEntry . NewEntry . Number } deleted",
122- EntryState . Deleted ) ;
123- result . Add ( record ) ;
124- break ;
125- }
114+ {
115+ var record = GetLogRecord ( changedEntry . NewEntry ,
116+ $ "The { changedEntry . NewEntry . OperationType } { changedEntry . NewEntry . Number } deleted",
117+ EntryState . Deleted ) ;
118+ result . Add ( record ) ;
119+ break ;
120+ }
126121 case EntryState . Added :
127- {
128- var record = GetLogRecord ( changedEntry . NewEntry ,
129- $ "The new { changedEntry . NewEntry . OperationType } { changedEntry . NewEntry . Number } added",
130- EntryState . Added ) ;
131- result . Add ( record ) ;
132- break ;
133- }
122+ {
123+ var record = GetLogRecord ( changedEntry . NewEntry ,
124+ $ "The new { changedEntry . NewEntry . OperationType } { changedEntry . NewEntry . Number } added",
125+ EntryState . Added ) ;
126+ result . Add ( record ) ;
127+ break ;
128+ }
134129 }
135130
136131 return result ;
137132 }
138133
139- protected static HashSet < string > GetAuditableProperties ( GenericChangedEntry < IOperation > changedEntry )
134+ protected static List < string > GetAuditableProperties ( GenericChangedEntry < IOperation > changedEntry )
140135 {
141136 var type = changedEntry . OldEntry . GetType ( ) ;
142137
143- return _auditablePropertiesCacheByTypeDict . GetOrAdd ( type , t => new HashSet < string > (
138+ return _auditablePropertiesCacheByTypeDict . GetOrAdd ( type , t =>
144139 t . GetProperties ( )
145140 . Where ( prop => Attribute . IsDefined ( prop , typeof ( AuditableAttribute ) ) )
146- . Select ( x => x . Name ) ,
147- StringComparer . OrdinalIgnoreCase ) ) ;
141+ . Select ( x => x . Name )
142+ . ToList ( ) ) ;
148143 }
149144
150145 protected virtual IList < Difference > GetOperationDifferences ( GenericChangedEntry < IOperation > changedEntry , List < string > logs )
@@ -179,6 +174,7 @@ protected virtual IList<Difference> GetOperationDifferences(GenericChangedEntry<
179174 protected virtual IEnumerable < string > GetCustomerOrderChanges ( CustomerOrder originalOrder , CustomerOrder modifiedOrder )
180175 {
181176 var result = new List < string > ( ) ;
177+
182178 if ( originalOrder . EmployeeId != modifiedOrder . EmployeeId )
183179 {
184180 var employeeName = "none" ;
@@ -189,25 +185,20 @@ protected virtual IEnumerable<string> GetCustomerOrderChanges(CustomerOrder orig
189185 }
190186 result . Add ( $ "Order employee was changed to '{ employeeName } '") ;
191187 }
188+
192189 result . AddRange ( GetAddressChanges ( originalOrder , originalOrder . Addresses , modifiedOrder . Addresses ) ) ;
193190
194191 return result ;
195192 }
196193
197194 protected virtual IEnumerable < string > GetShipmentChanges ( Shipment originalShipment , Shipment modifiedShipment )
198195 {
199- var result = new List < string > ( ) ;
200- result . AddRange ( GetAddressChanges ( originalShipment , [ originalShipment . DeliveryAddress ] , [ modifiedShipment . DeliveryAddress ] ) ) ;
201-
202- return result ;
196+ return GetAddressChanges ( originalShipment , [ originalShipment . DeliveryAddress ] , [ modifiedShipment . DeliveryAddress ] ) ;
203197 }
204198
205199 protected virtual IEnumerable < string > GetPaymentChanges ( PaymentIn payment , PaymentIn modifiedPayment )
206200 {
207- var result = new List < string > ( ) ;
208- result . AddRange ( GetAddressChanges ( payment , [ payment . BillingAddress ] , [ modifiedPayment . BillingAddress ] ) ) ;
209-
210- return result ;
201+ return GetAddressChanges ( payment , [ payment . BillingAddress ] , [ modifiedPayment . BillingAddress ] ) ;
211202 }
212203
213204 protected virtual IEnumerable < string > GetAddressChanges ( IOperation operation , IEnumerable < Address > originalAddress , IEnumerable < Address > modifiedAddress )
@@ -217,7 +208,7 @@ protected virtual IEnumerable<string> GetAddressChanges(IOperation operation, IE
217208 var modifiedAddressList = modifiedAddress ? . Where ( x => x != null ) . ToList ( ) ?? [ ] ;
218209 var originalAddressList = originalAddress ? . Where ( x => x != null ) . ToList ( ) ?? [ ] ;
219210
220- modifiedAddressList . CompareTo ( originalAddressList , EqualityComparer < Address > . Default , ( state , source , target ) =>
211+ modifiedAddressList . CompareTo ( originalAddressList , EqualityComparer < Address > . Default , ( state , _ , target ) =>
221212 {
222213 switch ( state )
223214 {
@@ -237,7 +228,7 @@ protected virtual string StringifyAddress(Address address)
237228 {
238229 return address is null
239230 ? string . Empty
240- : string . Join ( ", " , _addressProperties . Select ( p => p . GetValue ( address ) ) . Where ( x => x != null ) ) ;
231+ : string . Join ( ", " , address . GetAllProperties ( ) . Select ( p => p . GetValue ( address ) ) . Where ( x => x != null ) ) ;
241232 }
242233
243234 protected virtual OperationLog GetLogRecord ( IOperation operation , string template , EntryState operationType = EntryState . Modified )
0 commit comments