88using Cratis . Chronicle . Concepts . Events ;
99using Cratis . Chronicle . Storage . EventTypes ;
1010using Cratis . Chronicle . Storage . Identities ;
11+ using MongoDB . Bson ;
1112
1213namespace Cratis . Chronicle . Storage . MongoDB ;
1314
@@ -34,71 +35,9 @@ public class EventConverter(
3435 /// <inheritdoc/>
3536 public async Task < AppendedEvent > ToAppendedEvent ( Event @event )
3637 {
37- var eventType = new EventType ( @event . Type , EventTypeGeneration . First , false ) ;
38- var generationKey = EventTypeGeneration . First . ToString ( ) ;
39-
40- JsonObject content ;
41- if ( @event . Compensations . Any ( ) )
42- {
43- var latestCompensation = @event . Compensations . Last ( ) ;
44- generationKey = latestCompensation . EventTypeGeneration . ToString ( ) ;
45- eventType = new EventType ( @event . Type , latestCompensation . EventTypeGeneration , false ) ;
46- content = ( JsonNode . Parse ( latestCompensation . Content [ generationKey ] . ToString ( ) ) as JsonObject ) ! ;
47- }
48- else
49- {
50- content = ( JsonNode . Parse ( @event . Content [ generationKey ] . ToString ( ) ) as JsonObject ) ! ;
51- }
52-
53- if ( eventType . Id == GlobalEventTypes . Redaction )
54- {
55- var hash = @event . ContentHashes . TryGetValue ( generationKey , out var redactionHashValue )
56- ? new EventHash ( redactionHashValue )
57- : EventHash . NotSet ;
58- return new AppendedEvent (
59- new (
60- eventType ,
61- @event . EventSourceType ,
62- @event . EventSourceId ,
63- @event . EventStreamType ,
64- @event . EventStreamId ,
65- @event . SequenceNumber ,
66- @event . Occurred ,
67- eventStoreName ,
68- eventStoreNamespace ,
69- @event . CorrelationId ,
70- @event . Causation ,
71- await identityStorage . GetFor ( @event . CausedBy ) ,
72- @event . Tags . Select ( _ => new Tag ( _ ) ) . ToArray ( ) ,
73- hash ) ,
74- ConvertJsonObjectToExpandoObject ( content ) ) ;
75- }
76-
77- var eventSchema = await eventTypesStorage . GetFor ( eventType . Id , eventType . Generation ) ;
78- var releasedContent = await jsonComplianceManager . Release (
79- eventStoreName ,
80- eventStoreNamespace ,
81- eventSchema . Schema ,
82- @event . EventSourceId ,
83- content ) ;
84-
85- var releasedContentAsExpandoObject = expandoObjectConverter . ToExpandoObject ( releasedContent , eventSchema . Schema ) ;
86-
87- EventHash hash2 ;
88- if ( @event . Compensations . Any ( ) )
89- {
90- var latestCompensation = @event . Compensations . Last ( ) ;
91- var compensationGenKey = latestCompensation . EventTypeGeneration . ToString ( ) ;
92- hash2 = latestCompensation . ContentHashes . TryGetValue ( compensationGenKey , out var compensationHashValue )
93- ? new EventHash ( compensationHashValue )
94- : EventHash . NotSet ;
95- }
96- else
97- {
98- hash2 = @event . ContentHashes . TryGetValue ( EventTypeGeneration . First . ToString ( ) , out var hashValue )
99- ? new EventHash ( hashValue )
100- : EventHash . NotSet ;
101- }
38+ var ( eventType , generationKey , content ) = ExtractContent ( @event ) ;
39+ var hash = ExtractHash ( @event , generationKey ) ;
40+ var resolvedContent = await ResolveContent ( eventType , @event . EventSourceId , content ) ;
10241
10342 return new AppendedEvent (
10443 new (
@@ -115,30 +54,66 @@ await identityStorage.GetFor(@event.CausedBy),
11554 @event . Causation ,
11655 await identityStorage . GetFor ( @event . CausedBy ) ,
11756 @event . Tags . Select ( _ => new Tag ( _ ) ) . ToArray ( ) ,
118- hash2 ) ,
119- releasedContentAsExpandoObject ) ;
57+ hash ) ,
58+ resolvedContent ) ;
59+ }
60+
61+ static EventHash ExtractHash ( Event @event , string generationKey )
62+ {
63+ if ( @event . Compensations . Any ( ) )
64+ {
65+ var latest = @event . Compensations . Last ( ) ;
66+ var key = latest . EventTypeGeneration . ToString ( ) ;
67+ return latest . ContentHashes . TryGetValue ( key , out var hv ) ? new EventHash ( hv ) : EventHash . NotSet ;
68+ }
69+
70+ return @event . ContentHashes . TryGetValue ( generationKey , out var hashValue ) ? new EventHash ( hashValue ) : EventHash . NotSet ;
12071 }
12172
122- static ExpandoObject ConvertJsonObjectToExpandoObject ( JsonObject document )
73+ static JsonObject ParseContent ( IDictionary < string , BsonDocument > content , string generationKey )
74+ => ( JsonNode . Parse ( content [ generationKey ] . ToString ( ) ) as JsonObject ) ! ;
75+
76+ static ExpandoObject ConvertToRawExpandoObject ( JsonObject document )
12377 {
12478 var result = new ExpandoObject ( ) ;
12579 var dict = ( IDictionary < string , object ? > ) result ;
12680 foreach ( var ( key , value ) in document )
127- {
12881 dict [ key ] = ConvertJsonNodeToClrType ( value ) ;
129- }
13082 return result ;
13183 }
13284
13385 static object ? ConvertJsonNodeToClrType ( JsonNode ? node ) => node switch
13486 {
13587 null => null ,
136- JsonObject obj => ConvertJsonObjectToExpandoObject ( obj ) ,
88+ JsonObject obj => ConvertToRawExpandoObject ( obj ) ,
13789 JsonArray array => array . Select ( ConvertJsonNodeToClrType ) . ToArray ( ) ,
13890 JsonValue value when value . TryGetValue < bool > ( out var b ) => b ,
13991 JsonValue value when value . TryGetValue < long > ( out var l ) => l ,
14092 JsonValue value when value . TryGetValue < double > ( out var d ) => d ,
14193 JsonValue value when value . TryGetValue < string > ( out var s ) => s ,
14294 _ => node . ToString ( )
14395 } ;
96+
97+ ( EventType EventType , string GenerationKey , JsonObject Content ) ExtractContent ( Event @event )
98+ {
99+ var generationKey = EventTypeGeneration . First . ToString ( ) ;
100+ var eventType = new EventType ( @event . Type , EventTypeGeneration . First , false ) ;
101+
102+ if ( ! @event . Compensations . Any ( ) )
103+ return ( eventType , generationKey , ParseContent ( @event . Content , generationKey ) ) ;
104+
105+ var latest = @event . Compensations . Last ( ) ;
106+ var compensationKey = latest . EventTypeGeneration . ToString ( ) ;
107+ return ( new EventType ( @event . Type , latest . EventTypeGeneration , false ) , compensationKey , ParseContent ( latest . Content , compensationKey ) ) ;
108+ }
109+
110+ async Task < ExpandoObject > ResolveContent ( EventType eventType , EventSourceId eventSourceId , JsonObject content )
111+ {
112+ if ( ! await eventTypesStorage . HasFor ( eventType . Id , eventType . Generation ) )
113+ return ConvertToRawExpandoObject ( content ) ;
114+
115+ var schema = await eventTypesStorage . GetFor ( eventType . Id , eventType . Generation ) ;
116+ var released = await jsonComplianceManager . Release ( eventStoreName , eventStoreNamespace , schema . Schema , eventSourceId , content ) ;
117+ return expandoObjectConverter . ToExpandoObject ( released , schema . Schema ) ;
118+ }
144119}
0 commit comments