Skip to content

Commit 3ac9b52

Browse files
committed
Simplifying conversion
1 parent 2a12597 commit 3ac9b52

File tree

1 file changed

+46
-71
lines changed

1 file changed

+46
-71
lines changed

Source/Kernel/Storage.MongoDB/EventSequences/EventConverter.cs

Lines changed: 46 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using Cratis.Chronicle.Concepts.Events;
99
using Cratis.Chronicle.Storage.EventTypes;
1010
using Cratis.Chronicle.Storage.Identities;
11+
using MongoDB.Bson;
1112

1213
namespace 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

Comments
 (0)