Skip to content

Commit 18b26d9

Browse files
authored
[DEVEX-222] - Auto serialization feedback improvements (#338)
* [DEVEX-222] Fixed the missing application of custom serialization setting in AppendToStreamAsync method * [DEVEX-222] Added stream state as a mandatory parameter in append to stream Added also override for raw event append that has options and made other methods obsolete. Introduced OperationOptions that compose default client operation settings plus credentials and deadlines. * [DEVEX-222] Ensured that metadata is serialized with auto-serialization as regular system metadata * [DEVEX-222] Adjusted samples to match the append api changes Added also factor for event data that's not requiring to provide id immediately * [DEVEX-222] Added MessageData type as an easier to use replacement for EventData, and better aligned with general usage of messages instead of just events * [DEVEX-222] Refactored setting stream metadata to use OperationOptions * [DEVEX-222] Added DeserializedData and DeserializedMessages extensions for read results That should be a middle ground without forcing people to use a regular ResolvedEvent if they don't want to * [DEVEX-222] Simplified the message serializer implementation Now serializer creates a derived serializer merging operation settings with default settings if needed. That allowed to hide internal details and there's no need to pass content type explicitly, as it's already in settings. Extended SchemaRegistry to provide wrapper methods to naming resolution context. Thanks to that MessageSerializer doesn't need to reference it internally. To make responsibilities clearer made also naming resolution context part of serializer context. * [DEVEX-222] Marked old Stream Metadata options as obsolete * [DEVEX-222] Made old Read methods obsolete and used the new ones in tests * [DEVEX-222] Made Read options nullable, to precisely know if user provided options or not * [DEVEX-222] Made the Read Options nullable and thanks to that smarter, so e.g. FromEnd assigns also backwards if it wasn't set * [DEVEX-222] Made old SetStreamMetadata and ConditionalAppend methods obsolete * [DEVEX-222] Added delete method with options * [DEVEX-222] Made old subscription methods obsolete and adjusted tests to use them * [DEVEX-222] Added Tombstone method with options and made the old obsolete * [DEVEX-222] Made all persistent subscription methods obsolete * [DEVEX-222] Added samples showcasing auto-serialization usage * [DEVEX-222] Reshaped type resolution strategy to take EventRecord instead of just raw string. That should enable current users to override their strategy if they used something more than just message type name from EventRecord. It needs to be EventRecord and not ResolvedEvent, as resolution happens before creating ResolvedEvent. * [DEVEX-222] Changed message type registration to allow multiple message type names mapping to the same CLR class * [DEVEX-222] Nested Message type mapping into settings object * [DEVEX-222] Added nested message type mapping * [DEVEX-222] Replaced clr type with clr type name in naming resolution Tha makes naming strategy focused on just mapping types back and forth and allowing to disable auto registration
1 parent bb3fd10 commit 18b26d9

File tree

90 files changed

+4236
-2779
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

90 files changed

+4236
-2779
lines changed

samples/appending-events/Program.cs

Lines changed: 113 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using KurrentDB.Client;
2-
3-
#pragma warning disable CS8321 // Local function is declared but never used
1+
#pragma warning disable CS8321 // Local function is declared but never used
42

53
var settings = KurrentDBClientSettings.Create("esdb://localhost:2113?tls=false");
64

@@ -9,91 +7,155 @@
97
await using var client = new KurrentDBClient(settings);
108

119
await AppendToStream(client);
10+
await AppendToStreamWithAutoSerialization(client);
11+
await AppendToStreamWithMetadataAndAutoSerialization(client);
1212
await AppendWithConcurrencyCheck(client);
1313
await AppendWithNoStream(client);
1414
await AppendWithSameId(client);
15+
await AppendWithSameIdAndAutoSerialization(client);
1516

1617
return;
1718

1819
static async Task AppendToStream(KurrentDBClient client) {
1920
#region append-to-stream
2021

21-
var eventData = new EventData(
22-
Uuid.NewUuid(),
22+
var eventData = MessageData.From(
2323
"some-event",
2424
"{\"id\": \"1\" \"value\": \"some value\"}"u8.ToArray()
2525
);
2626

2727
await client.AppendToStreamAsync(
2828
"some-stream",
2929
StreamState.NoStream,
30-
new List<EventData> {
31-
eventData
32-
}
30+
[eventData]
3331
);
3432

3533
#endregion append-to-stream
3634
}
3735

36+
static async Task AppendToStreamWithAutoSerialization(KurrentDBClient client) {
37+
#region append-to-stream-with-auto-serialization
38+
39+
var shoppingCartId = Guid.NewGuid();
40+
41+
var @event = new ProductItemAddedToShoppingCart(
42+
shoppingCartId,
43+
new PricedProductItem("t-shirt", 1, 99.99m)
44+
);
45+
46+
await client.AppendToStreamAsync(
47+
$"shopping_cart-{shoppingCartId}",
48+
StreamState.NoStream,
49+
[@event]
50+
);
51+
52+
#endregion append-to-stream-with-auto-serialization
53+
}
54+
55+
static async Task AppendToStreamWithMetadataAndAutoSerialization(KurrentDBClient client) {
56+
#region append-to-stream-with-metadata-and-auto-serialization
57+
58+
var shoppingCartId = Guid.NewGuid();
59+
var clientId = Guid.NewGuid().ToString();
60+
61+
var @event = new ProductItemAddedToShoppingCart(
62+
shoppingCartId,
63+
new PricedProductItem("t-shirt", 1, 99.99m)
64+
);
65+
66+
var metadata = new ShoppingCartMetadata(clientId);
67+
68+
var message = Message.From(@event, metadata);
69+
70+
await client.AppendToStreamAsync(
71+
$"shopping_cart-{shoppingCartId}",
72+
StreamState.NoStream,
73+
[message]
74+
);
75+
76+
#endregion append-to-stream-with-metadata-and-auto-serialization
77+
}
78+
3879
static async Task AppendWithSameId(KurrentDBClient client) {
3980
#region append-duplicate-event
4081

41-
var eventData = new EventData(
42-
Uuid.NewUuid(),
82+
var eventData = MessageData.From(
4383
"some-event",
44-
"{\"id\": \"1\" \"value\": \"some value\"}"u8.ToArray()
84+
"{\"id\": \"1\" \"value\": \"some value\"}"u8.ToArray(),
85+
messageId: Uuid.NewUuid()
4586
);
4687

4788
await client.AppendToStreamAsync(
4889
"same-event-stream",
4990
StreamState.Any,
50-
new List<EventData> {
51-
eventData
52-
}
91+
[eventData]
5392
);
5493

5594
// attempt to append the same event again
5695
await client.AppendToStreamAsync(
5796
"same-event-stream",
5897
StreamState.Any,
59-
new List<EventData> {
60-
eventData
61-
}
98+
[eventData]
6299
);
63100

64101
#endregion append-duplicate-event
65102
}
66103

104+
static async Task AppendWithSameIdAndAutoSerialization(KurrentDBClient client) {
105+
#region append-duplicate-event-with-serialization
106+
107+
var shoppingCartId = Guid.NewGuid();
108+
109+
var @event = new ProductItemAddedToShoppingCart(
110+
shoppingCartId,
111+
new PricedProductItem("t-shirt", 1, 99.99m)
112+
);
113+
114+
var message = Message.From(
115+
@event,
116+
messageId: Uuid.NewUuid()
117+
);
118+
119+
await client.AppendToStreamAsync(
120+
"same-event-stream",
121+
StreamState.Any,
122+
[message]
123+
);
124+
125+
// attempt to append the same event again
126+
await client.AppendToStreamAsync(
127+
"same-event-stream",
128+
StreamState.Any,
129+
[message]
130+
);
131+
132+
#endregion append-duplicate-event-with-serialization
133+
}
134+
67135
static async Task AppendWithNoStream(KurrentDBClient client) {
68136
#region append-with-no-stream
69137

70-
var eventDataOne = new EventData(
71-
Uuid.NewUuid(),
138+
var eventDataOne = MessageData.From(
72139
"some-event",
73140
"{\"id\": \"1\" \"value\": \"some value\"}"u8.ToArray()
74141
);
75142

76-
var eventDataTwo = new EventData(
77-
Uuid.NewUuid(),
143+
var eventDataTwo = MessageData.From(
78144
"some-event",
79145
"{\"id\": \"2\" \"value\": \"some other value\"}"u8.ToArray()
80146
);
81147

82148
await client.AppendToStreamAsync(
83149
"no-stream-stream",
84150
StreamState.NoStream,
85-
new List<EventData> {
86-
eventDataOne
87-
}
151+
[eventDataOne]
88152
);
89153

90154
// attempt to append the same event again
91155
await client.AppendToStreamAsync(
92156
"no-stream-stream",
93157
StreamState.NoStream,
94-
new List<EventData> {
95-
eventDataTwo
96-
}
158+
[eventDataTwo]
97159
);
98160

99161
#endregion append-with-no-stream
@@ -103,56 +165,45 @@ static async Task AppendWithConcurrencyCheck(KurrentDBClient client) {
103165
await client.AppendToStreamAsync(
104166
"concurrency-stream",
105167
StreamState.Any,
106-
new[] { new EventData(Uuid.NewUuid(), "-", ReadOnlyMemory<byte>.Empty) }
168+
[MessageData.From("-", ReadOnlyMemory<byte>.Empty)]
107169
);
108170

109171
#region append-with-concurrency-check
110172

111-
var clientOneRead = client.ReadStreamAsync(
112-
Direction.Forwards,
113-
"concurrency-stream",
114-
StreamPosition.Start
115-
);
173+
var clientOneRead = client.ReadStreamAsync("concurrency-stream");
116174

117175
var clientOneRevision = (await clientOneRead.LastAsync()).Event.EventNumber.ToUInt64();
118176

119-
var clientTwoRead = client.ReadStreamAsync(Direction.Forwards, "concurrency-stream", StreamPosition.Start);
177+
var clientTwoRead = client.ReadStreamAsync("concurrency-stream");
120178
var clientTwoRevision = (await clientTwoRead.LastAsync()).Event.EventNumber.ToUInt64();
121179

122-
var clientOneData = new EventData(
123-
Uuid.NewUuid(),
180+
var clientOneData = MessageData.From(
124181
"some-event",
125182
"{\"id\": \"1\" \"value\": \"clientOne\"}"u8.ToArray()
126183
);
127184

128185
await client.AppendToStreamAsync(
129186
"no-stream-stream",
130187
clientOneRevision,
131-
new List<EventData> {
132-
clientOneData
133-
}
188+
[clientOneData]
134189
);
135190

136-
var clientTwoData = new EventData(
137-
Uuid.NewUuid(),
191+
var clientTwoData = MessageData.From(
138192
"some-event",
139193
"{\"id\": \"2\" \"value\": \"clientTwo\"}"u8.ToArray()
140194
);
141195

142196
await client.AppendToStreamAsync(
143197
"no-stream-stream",
144198
clientTwoRevision,
145-
new List<EventData> {
146-
clientTwoData
147-
}
199+
[clientTwoData]
148200
);
149201

150202
#endregion append-with-concurrency-check
151203
}
152204

153205
static async Task AppendOverridingUserCredentials(KurrentDBClient client, CancellationToken cancellationToken) {
154-
var eventData = new EventData(
155-
Uuid.NewUuid(),
206+
var eventData = MessageData.From(
156207
"TestEvent",
157208
"{\"id\": \"1\" \"value\": \"some value\"}"u8.ToArray()
158209
);
@@ -162,10 +213,23 @@ static async Task AppendOverridingUserCredentials(KurrentDBClient client, Cancel
162213
await client.AppendToStreamAsync(
163214
"some-stream",
164215
StreamState.Any,
165-
new[] { eventData },
166-
userCredentials: new UserCredentials("admin", "changeit"),
167-
cancellationToken: cancellationToken
216+
[eventData],
217+
new AppendToStreamOptions { UserCredentials = new UserCredentials("admin", "changeit") },
218+
cancellationToken
168219
);
169220

170221
#endregion overriding-user-credentials
171222
}
223+
224+
public record PricedProductItem(
225+
string ProductId,
226+
int Quantity,
227+
decimal UnitPrice
228+
);
229+
230+
public record ProductItemAddedToShoppingCart(
231+
Guid CartId,
232+
PricedProductItem ProductItem
233+
);
234+
235+
public record ShoppingCartMetadata(string ClientId);

samples/diagnostics/Program.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,15 @@ static async Task TraceAppendToStream(KurrentDBClient client) {
5555

5656
host.Start();
5757

58-
var eventData = new EventData(
59-
Uuid.NewUuid(),
58+
var eventData = MessageData.From(
6059
"some-event",
6160
"{\"id\": \"1\" \"value\": \"some value\"}"u8.ToArray()
6261
);
6362

6463
await client.AppendToStreamAsync(
6564
Uuid.NewUuid().ToString(),
6665
StreamState.Any,
67-
new List<EventData> {
68-
eventData
69-
}
66+
[eventData]
7067
);
7168

7269
# endregion setup-client-for-tracing

samples/projection-management/Program.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -439,8 +439,7 @@ static async Task Populate(string connection, int numberOfEvents) {
439439
var client = new KurrentDBClient(settings);
440440
var messages = Enumerable.Range(0, numberOfEvents).Select(
441441
number =>
442-
new EventData(
443-
Uuid.NewUuid(),
442+
MessageData.From(
444443
"eventtype",
445444
Encoding.UTF8.GetBytes($@"{{ ""Id"":{number} }}")
446445
)

samples/quick-start/Program.cs

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
using System.Text.Json;
2-
using KurrentDB.Client;
3-
4-
var tokenSource = new CancellationTokenSource();
1+
var tokenSource = new CancellationTokenSource();
52
var cancellationToken = tokenSource.Token;
63

74
#region createClient
@@ -21,20 +18,14 @@
2118
ImportantData = "I wrote my first event!"
2219
};
2320

24-
var eventData = new EventData(
25-
Uuid.NewUuid(),
26-
"TestEvent",
27-
JsonSerializer.SerializeToUtf8Bytes(evt)
28-
);
29-
3021
#endregion createEvent
3122

3223
#region appendEvents
3324

3425
await client.AppendToStreamAsync(
3526
"some-stream",
3627
StreamState.Any,
37-
new[] { eventData },
28+
[evt],
3829
cancellationToken: cancellationToken
3930
);
4031

@@ -45,23 +36,23 @@ await client.AppendToStreamAsync(
4536
await client.AppendToStreamAsync(
4637
"some-stream",
4738
StreamState.Any,
48-
new[] { eventData },
49-
userCredentials: new UserCredentials("admin", "changeit"),
50-
cancellationToken: cancellationToken
39+
[evt],
40+
new AppendToStreamOptions { UserCredentials = new UserCredentials("admin", "changeit") },
41+
cancellationToken
5142
);
5243

5344
#endregion overriding-user-credentials
5445

5546
#region readStream
5647

5748
var result = client.ReadStreamAsync(
58-
Direction.Forwards,
5949
"some-stream",
60-
StreamPosition.Start,
6150
cancellationToken: cancellationToken
6251
);
6352

64-
var events = await result.ToListAsync(cancellationToken);
53+
var events = await result
54+
.DeserializedData()
55+
.ToListAsync(cancellationToken);
6556

6657
#endregion readStream
6758

0 commit comments

Comments
 (0)