Skip to content

Commit

Permalink
chores; bug fixes, cleanup, renaming, improving clarity
Browse files Browse the repository at this point in the history
  • Loading branch information
erikshafer committed May 23, 2024
1 parent 1f99242 commit 5f8f59c
Show file tree
Hide file tree
Showing 10 changed files with 100 additions and 49 deletions.
2 changes: 1 addition & 1 deletion StudentEnrollment01.InMemory/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@
var student = inMemoryDb.GetStudent(id);

Console.WriteLine(
"StudentId: {0} | FullName: {1} | Email: {2} | DOB: {3} | CreatedAtUtc: {4}",
"StudentId: {0} | FullName: {1} | Email: {2} | DateOfBirth: {3} | CreatedAtUtc: {4}",
student!.Id, student.FullName, student.Email, student.DateOfBirth, student.CreatedAtUtc);
Console.WriteLine();
2 changes: 1 addition & 1 deletion StudentEnrollment01.InMemory/Student.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,6 @@ private void Apply(StudentEnrolled @event)
private void Apply(StudentUnEnrolled @event)
{
if (EnrolledCourses.Contains(@event.CourseName))
EnrolledCourses.Add(@event.CourseName);
EnrolledCourses.Remove(@event.CourseName);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace StudentEnrollment02.Esdb.Events;

public class StudentWithdrawn : Event
public class StudentWithdrew : Event
{
public required string CourseName { get; init; }
}
8 changes: 6 additions & 2 deletions StudentEnrollment02.Esdb/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,17 @@ await client.AppendToStreamAsync(
cancellationToken: default
);

var readStreamResult = client.ReadStreamAsync(
var streamResult = client.ReadStreamAsync(
Direction.Forwards,
streamId,
StreamPosition.Start,
cancellationToken: default
);
var eventStream = await readStreamResult.ToListAsync();

if (await streamResult.ReadState is ReadState.StreamNotFound)
return;

var eventStream = await streamResult.ToListAsync();

Console.WriteLine("Events from selected stream: ");
foreach (var resolved in eventStream)
Expand Down
6 changes: 3 additions & 3 deletions StudentEnrollment02.Esdb/Student.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public void Apply(Event @event)
case StudentEnrolled enrolled:
Apply(enrolled);
break;
case StudentWithdrawn withdrawn:
case StudentWithdrew withdrawn:
Apply(withdrawn);
break;
}
Expand All @@ -49,9 +49,9 @@ private void Apply(StudentEnrolled @event)
EnrolledCourses.Add(@event.CourseName);
}

private void Apply(StudentWithdrawn @event)
private void Apply(StudentWithdrew @event)
{
if (EnrolledCourses.Contains(@event.CourseName))
EnrolledCourses.Add(@event.CourseName);
EnrolledCourses.Remove(@event.CourseName);
}
}
1 change: 1 addition & 0 deletions StudentEnrollment03.Esdb/Events/StudentEnrolled.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@ namespace StudentEnrollment03.Esdb.Events;
public record StudentEnrolled : Event
{
public required string CourseName { get; init; }
public required string InstructorName { get; init; }
public DateTime EnrolledAtUtc { get; init; }
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace StudentEnrollment03.Esdb.Events;

public record StudentWithdrawn : Event
public record StudentWithdrew : Event
{
public required string CourseName { get; init; }
public DateTime WithdrawnAtUtc { get; init; }
Expand Down
114 changes: 78 additions & 36 deletions StudentEnrollment03.Esdb/Program.cs
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
using System.Text;
using System.Text.Json;
using EventStore.Client;
using StudentEnrollment03.Esdb;
using StudentEnrollment03.Esdb.Events;

EventTypeMapper.Instance.ToName(typeof(StudentCreated));
EventTypeMapper.Instance.ToName(typeof(StudentEnrolled));
EventTypeMapper.Instance.ToName(typeof(StudentWithdrawn));
EventTypeMapper.Instance.ToName(typeof(StudentWithdrew));
EventTypeMapper.Instance.ToName(typeof(StudentEmailChanged));

var id = Guid.Parse("a662d446-4920-415e-8c2a-0dd4a6c58908");
var streamId = $"student-{id}";

var created = new EventData(
Uuid.NewUuid(),
"StudentCreated",
nameof(StudentCreated),
JsonSerializer.SerializeToUtf8Bytes(new StudentCreated
{
Id = streamId,
Expand All @@ -26,11 +27,36 @@

var enrolled = new EventData(
Uuid.NewUuid(),
"StudentEnrolled",
nameof(StudentEnrolled),
JsonSerializer.SerializeToUtf8Bytes(new StudentEnrolled
{
Id = streamId,
CourseName = "From Zero to Hero: REST APis in .NET",
InstructorName = "Nick Chapsas",
EnrolledAtUtc = DateTime.UtcNow
})
);

var enrolled2 = new EventData(
Uuid.NewUuid(),
nameof(StudentEnrolled),
JsonSerializer.SerializeToUtf8Bytes(new StudentEnrolled
{
Id = streamId,
CourseName = "From Zero to Hero: Integration Testing in ASP.NET Core",
InstructorName = "Nick Chapsas",
EnrolledAtUtc = DateTime.UtcNow
})
);

var enrolled3 = new EventData(
Uuid.NewUuid(),
nameof(StudentEnrolled),
JsonSerializer.SerializeToUtf8Bytes(new StudentEnrolled
{
Id = streamId,
CourseName = "Cloud Fundamentals: AWS Services for C# Developers",
InstructorName = "Nick Chapsas",
EnrolledAtUtc = DateTime.UtcNow
})
);
Expand All @@ -46,56 +72,72 @@
})
);

var withdrawn = new EventData(
Uuid.NewUuid(),
nameof(StudentWithdrew),
JsonSerializer.SerializeToUtf8Bytes(new StudentWithdrew
{
Id = streamId,
CourseName = "Cloud Fundamentals: AWS Services for C# Developers",
WithdrawnAtUtc = DateTime.UtcNow
})
);

const string connectionString = "esdb://admin:changeit@localhost:2113?tls=false&tlsVerifyCert=false";
var settings = EventStoreClientSettings.Create(connectionString);
var client = new EventStoreClient(settings);

await client.AppendToStreamAsync(
streamId,
StreamState.Any,
new[] { created, enrolled, emailChanged },
new[] { created, enrolled, enrolled2, enrolled3, emailChanged, withdrawn },
cancellationToken: default
);

var readStreamResult = client.ReadStreamAsync(
var streamResult = client.ReadStreamAsync(
Direction.Forwards,
streamId,
StreamPosition.Start,
cancellationToken: default
);
var eventStream = await readStreamResult.ToListAsync();

Console.WriteLine("Events from selected stream: ");
foreach (var resolved in eventStream)
{
Console.WriteLine($"\tEventId: {resolved.Event.EventId}");
Console.WriteLine($"\tEventStreamId: {resolved.Event.EventStreamId}");
Console.WriteLine($"\tEventType: {resolved.Event.EventType}");
Console.WriteLine($"\tData: {Encoding.UTF8.GetString(resolved.Event.Data.ToArray())}");
Console.WriteLine("");
}

var enrolledCourses = eventStream
.Where(re => re.Event.EventType == "StudentEnrolled")
.Select(re => JsonSerializer.Deserialize<StudentEnrolled>(re.Event.Data.ToArray()))
.Select(se => se!.CourseName)
.ToList();
Console.WriteLine("Courses enrolled in: ");
enrolledCourses.ForEach(ec => Console.WriteLine($"\t- {ec}"));
Console.WriteLine("");

// Write out using the mapper.
Console.WriteLine("Deserialized events:");
foreach (var resolved in eventStream)
{
var eventType = EventTypeMapper.Instance.ToType(resolved.Event.EventType);
if (await streamResult.ReadState is ReadState.StreamNotFound)
return;

if (eventType == null)
break;
var eventStream = await streamResult.ToListAsync();
var student = new Student();

var deserializedEvent = JsonSerializer.Deserialize(Encoding.UTF8.GetString(resolved.Event.Data.Span), eventType);

Console.WriteLine($"\t{deserializedEvent}");
foreach (var @event in eventStream)
{
switch (DeserializeEvent(@event.Event))
{
case StudentCreated studentCreated:
student.Apply(studentCreated);
break;
case StudentEnrolled studentEnrolled:
student.Apply(studentEnrolled);
break;
case StudentEmailChanged studentEmailChanged:
student.Apply(studentEmailChanged);
break;
case StudentWithdrew studentWithdrew:
student.Apply(studentWithdrew);
break;
}
}

Console.WriteLine("");
Console.WriteLine(
"StudentId: {0}\nFullName: {1}\nEmail: {2}\nDateOfBirth: {3}\nCreatedAtUtc: {4}",
student!.Id, student.FullName, student.Email, student.DateOfBirth, student.CreatedAtUtc);
Console.WriteLine("Enrolled courses:");
foreach (var enrolledCourse in student.EnrolledCourses)
Console.WriteLine($"\t- {enrolledCourse}");
Console.WriteLine();

static Event DeserializeEvent(EventRecord eventRecord)
{
return (Event)JsonSerializer
.Deserialize(
Encoding.UTF8.GetString(eventRecord.Data.ToArray()),
Type.GetType($"{typeof(Event).Namespace}.{eventRecord.EventType}")!)!;
}
6 changes: 3 additions & 3 deletions StudentEnrollment03.Esdb/Student.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public void Apply(Event @event)
case StudentEnrolled enrolled:
Apply(enrolled);
break;
case StudentWithdrawn withdrawn:
case StudentWithdrew withdrawn:
Apply(withdrawn);
break;
}
Expand All @@ -49,9 +49,9 @@ private void Apply(StudentEnrolled @event)
EnrolledCourses.Add(@event.CourseName);
}

private void Apply(StudentWithdrawn @event)
private void Apply(StudentWithdrew @event)
{
if (EnrolledCourses.Contains(@event.CourseName))
EnrolledCourses.Add(@event.CourseName);
EnrolledCourses.Remove(@event.CourseName);
}
}
6 changes: 5 additions & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
version: "3.4"

services:
studentenrollment-esdb:
student-enrollment-esdb:
image: eventstore/eventstore:24.2.0-jammy
environment:
- EVENTSTORE_CLUSTER_SIZE=1
Expand All @@ -12,3 +12,7 @@ services:
- EVENTSTORE_ENABLE_ATOM_PUB_OVER_HTTP=true
ports:
- "2113:2113"
networks:
- student-enrollment-esdb-net
networks:
student-enrollment-esdb-net:

0 comments on commit 5f8f59c

Please sign in to comment.