Skip to content

[DEVEX-222] - Auto serialization feedback improvements #338

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
bb30aa3
[DEVEX-222] Fixed the missing application of custom serialization set…
oskardudycz Mar 12, 2025
bcfc61d
[DEVEX-222] Added stream state as a mandatory parameter in append to …
oskardudycz Mar 13, 2025
32f5c7c
[DEVEX-222] Ensured that metadata is serialized with auto-serializati…
oskardudycz Mar 13, 2025
dace25c
[DEVEX-222] Adjusted samples to match the append api changes
oskardudycz Mar 13, 2025
b7dd8e2
[DEVEX-222] Added MessageData type as an easier to use replacement fo…
oskardudycz Mar 13, 2025
8d44328
[DEVEX-222] Refactored setting stream metadata to use OperationOptions
oskardudycz Mar 13, 2025
1d8fc3f
[DEVEX-222] Added DeserializedData and DeserializedMessages extension…
oskardudycz Mar 13, 2025
af0ea4e
[DEVEX-222] Simplified the message serializer implementation
oskardudycz Mar 14, 2025
6d05450
[DEVEX-222] Marked old Stream Metadata options as obsolete
oskardudycz Mar 20, 2025
994f3b0
[DEVEX-222] Made old Read methods obsolete and used the new ones in t…
oskardudycz Mar 20, 2025
8c6e39f
[DEVEX-222] Made Read options nullable, to precisely know if user pro…
oskardudycz Mar 20, 2025
3bf1ced
[DEVEX-222] Made the Read Options nullable and thanks to that smarter…
oskardudycz Mar 21, 2025
842065c
[DEVEX-222] Made old SetStreamMetadata and ConditionalAppend methods …
oskardudycz Mar 21, 2025
35caf9e
[DEVEX-222] Added delete method with options
oskardudycz Mar 21, 2025
dca00fb
[DEVEX-222] Made old subscription methods obsolete and adjusted tests…
oskardudycz Mar 21, 2025
255ba7d
[DEVEX-222] Added Tombstone method with options and made the old obso…
oskardudycz Mar 21, 2025
6d48b9c
[DEVEX-222] Made all persistent subscription methods obsolete
oskardudycz Mar 21, 2025
b135a83
[DEVEX-222] Added samples showcasing auto-serialization usage
oskardudycz Mar 25, 2025
3a70a55
[DEVEX-222] Reshaped type resolution strategy to take EventRecord ins…
oskardudycz Mar 26, 2025
27e1c61
[DEVEX-222] Changed message type registration to allow multiple messa…
oskardudycz Mar 26, 2025
dba4342
[DEVEX-222] Nested Message type mapping into settings object
oskardudycz Mar 27, 2025
7e765ee
[DEVEX-222] Added nested message type mapping
oskardudycz Mar 28, 2025
a789d34
[DEVEX-222] Replaced clr type with clr type name in naming resolution
oskardudycz Mar 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
162 changes: 113 additions & 49 deletions samples/appending-events/Program.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using KurrentDB.Client;

#pragma warning disable CS8321 // Local function is declared but never used
#pragma warning disable CS8321 // Local function is declared but never used

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

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

await AppendToStream(client);
await AppendToStreamWithAutoSerialization(client);
await AppendToStreamWithMetadataAndAutoSerialization(client);
await AppendWithConcurrencyCheck(client);
await AppendWithNoStream(client);
await AppendWithSameId(client);
await AppendWithSameIdAndAutoSerialization(client);

return;

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

var eventData = new EventData(
Uuid.NewUuid(),
var eventData = MessageData.From(
"some-event",
"{\"id\": \"1\" \"value\": \"some value\"}"u8.ToArray()
);

await client.AppendToStreamAsync(
"some-stream",
StreamState.NoStream,
new List<EventData> {
eventData
}
[eventData]
);

#endregion append-to-stream
}

static async Task AppendToStreamWithAutoSerialization(KurrentDBClient client) {
#region append-to-stream-with-auto-serialization

var shoppingCartId = Guid.NewGuid();

var @event = new ProductItemAddedToShoppingCart(
shoppingCartId,
new PricedProductItem("t-shirt", 1, 99.99m)
);

await client.AppendToStreamAsync(
$"shopping_cart-{shoppingCartId}",
StreamState.NoStream,
[@event]
);

#endregion append-to-stream-with-auto-serialization
}

static async Task AppendToStreamWithMetadataAndAutoSerialization(KurrentDBClient client) {
#region append-to-stream-with-metadata-and-auto-serialization

var shoppingCartId = Guid.NewGuid();
var clientId = Guid.NewGuid().ToString();

var @event = new ProductItemAddedToShoppingCart(
shoppingCartId,
new PricedProductItem("t-shirt", 1, 99.99m)
);

var metadata = new ShoppingCartMetadata(clientId);

var message = Message.From(@event, metadata);

await client.AppendToStreamAsync(
$"shopping_cart-{shoppingCartId}",
StreamState.NoStream,
[message]
);

#endregion append-to-stream-with-metadata-and-auto-serialization
}

static async Task AppendWithSameId(KurrentDBClient client) {
#region append-duplicate-event

var eventData = new EventData(
Uuid.NewUuid(),
var eventData = MessageData.From(
"some-event",
"{\"id\": \"1\" \"value\": \"some value\"}"u8.ToArray()
"{\"id\": \"1\" \"value\": \"some value\"}"u8.ToArray(),
messageId: Uuid.NewUuid()
);

await client.AppendToStreamAsync(
"same-event-stream",
StreamState.Any,
new List<EventData> {
eventData
}
[eventData]
);

// attempt to append the same event again
await client.AppendToStreamAsync(
"same-event-stream",
StreamState.Any,
new List<EventData> {
eventData
}
[eventData]
);

#endregion append-duplicate-event
}

static async Task AppendWithSameIdAndAutoSerialization(KurrentDBClient client) {
#region append-duplicate-event-with-serialization

var shoppingCartId = Guid.NewGuid();

var @event = new ProductItemAddedToShoppingCart(
shoppingCartId,
new PricedProductItem("t-shirt", 1, 99.99m)
);

var message = Message.From(
@event,
messageId: Uuid.NewUuid()
);

await client.AppendToStreamAsync(
"same-event-stream",
StreamState.Any,
[message]
);

// attempt to append the same event again
await client.AppendToStreamAsync(
"same-event-stream",
StreamState.Any,
[message]
);

#endregion append-duplicate-event-with-serialization
}

static async Task AppendWithNoStream(KurrentDBClient client) {
#region append-with-no-stream

var eventDataOne = new EventData(
Uuid.NewUuid(),
var eventDataOne = MessageData.From(
"some-event",
"{\"id\": \"1\" \"value\": \"some value\"}"u8.ToArray()
);

var eventDataTwo = new EventData(
Uuid.NewUuid(),
var eventDataTwo = MessageData.From(
"some-event",
"{\"id\": \"2\" \"value\": \"some other value\"}"u8.ToArray()
);

await client.AppendToStreamAsync(
"no-stream-stream",
StreamState.NoStream,
new List<EventData> {
eventDataOne
}
[eventDataOne]
);

// attempt to append the same event again
await client.AppendToStreamAsync(
"no-stream-stream",
StreamState.NoStream,
new List<EventData> {
eventDataTwo
}
[eventDataTwo]
);

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

#region append-with-concurrency-check

var clientOneRead = client.ReadStreamAsync(
Direction.Forwards,
"concurrency-stream",
StreamPosition.Start
);
var clientOneRead = client.ReadStreamAsync("concurrency-stream");

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

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

var clientOneData = new EventData(
Uuid.NewUuid(),
var clientOneData = MessageData.From(
"some-event",
"{\"id\": \"1\" \"value\": \"clientOne\"}"u8.ToArray()
);

await client.AppendToStreamAsync(
"no-stream-stream",
clientOneRevision,
new List<EventData> {
clientOneData
}
[clientOneData]
);

var clientTwoData = new EventData(
Uuid.NewUuid(),
var clientTwoData = MessageData.From(
"some-event",
"{\"id\": \"2\" \"value\": \"clientTwo\"}"u8.ToArray()
);

await client.AppendToStreamAsync(
"no-stream-stream",
clientTwoRevision,
new List<EventData> {
clientTwoData
}
[clientTwoData]
);

#endregion append-with-concurrency-check
}

static async Task AppendOverridingUserCredentials(KurrentDBClient client, CancellationToken cancellationToken) {
var eventData = new EventData(
Uuid.NewUuid(),
var eventData = MessageData.From(
"TestEvent",
"{\"id\": \"1\" \"value\": \"some value\"}"u8.ToArray()
);
Expand All @@ -162,10 +213,23 @@ static async Task AppendOverridingUserCredentials(KurrentDBClient client, Cancel
await client.AppendToStreamAsync(
"some-stream",
StreamState.Any,
new[] { eventData },
userCredentials: new UserCredentials("admin", "changeit"),
cancellationToken: cancellationToken
[eventData],
new AppendToStreamOptions { UserCredentials = new UserCredentials("admin", "changeit") },
cancellationToken
);

#endregion overriding-user-credentials
}

public record PricedProductItem(
string ProductId,
int Quantity,
decimal UnitPrice
);

public record ProductItemAddedToShoppingCart(
Guid CartId,
PricedProductItem ProductItem
);

public record ShoppingCartMetadata(string ClientId);
7 changes: 2 additions & 5 deletions samples/diagnostics/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,18 +55,15 @@ static async Task TraceAppendToStream(KurrentDBClient client) {

host.Start();

var eventData = new EventData(
Uuid.NewUuid(),
var eventData = MessageData.From(
"some-event",
"{\"id\": \"1\" \"value\": \"some value\"}"u8.ToArray()
);

await client.AppendToStreamAsync(
Uuid.NewUuid().ToString(),
StreamState.Any,
new List<EventData> {
eventData
}
[eventData]
);

# endregion setup-client-for-tracing
Expand Down
3 changes: 1 addition & 2 deletions samples/projection-management/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -439,8 +439,7 @@ static async Task Populate(string connection, int numberOfEvents) {
var client = new KurrentDBClient(settings);
var messages = Enumerable.Range(0, numberOfEvents).Select(
number =>
new EventData(
Uuid.NewUuid(),
MessageData.From(
"eventtype",
Encoding.UTF8.GetBytes($@"{{ ""Id"":{number} }}")
)
Expand Down
25 changes: 8 additions & 17 deletions samples/quick-start/Program.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
using System.Text.Json;
using KurrentDB.Client;

var tokenSource = new CancellationTokenSource();
var tokenSource = new CancellationTokenSource();
var cancellationToken = tokenSource.Token;

#region createClient
Expand All @@ -21,20 +18,14 @@
ImportantData = "I wrote my first event!"
};

var eventData = new EventData(
Uuid.NewUuid(),
"TestEvent",
JsonSerializer.SerializeToUtf8Bytes(evt)
);

#endregion createEvent

#region appendEvents

await client.AppendToStreamAsync(
"some-stream",
StreamState.Any,
new[] { eventData },
[evt],
cancellationToken: cancellationToken
);

Expand All @@ -45,23 +36,23 @@ await client.AppendToStreamAsync(
await client.AppendToStreamAsync(
"some-stream",
StreamState.Any,
new[] { eventData },
userCredentials: new UserCredentials("admin", "changeit"),
cancellationToken: cancellationToken
[evt],
new AppendToStreamOptions { UserCredentials = new UserCredentials("admin", "changeit") },
cancellationToken
);

#endregion overriding-user-credentials

#region readStream

var result = client.ReadStreamAsync(
Direction.Forwards,
"some-stream",
StreamPosition.Start,
cancellationToken: cancellationToken
);

var events = await result.ToListAsync(cancellationToken);
var events = await result
.DeserializedData()
.ToListAsync(cancellationToken);

#endregion readStream

Expand Down
Loading
Loading