Skip to content

Commit

Permalink
updated events to records, some renaming and restructuring
Browse files Browse the repository at this point in the history
  • Loading branch information
erikshafer committed May 21, 2024
1 parent d881157 commit 633633d
Show file tree
Hide file tree
Showing 10 changed files with 112 additions and 62 deletions.
6 changes: 2 additions & 4 deletions StudentEnrollmentConsoleApp/Events/Event.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
namespace StudentEnrollmentConsoleApp.Events;

public abstract class Event
public abstract record Event
{
public abstract string StreamId { get; }

public DateTime CreatedAtUtc { get; set; }
public string Id { get; init; } = default!;
}
35 changes: 35 additions & 0 deletions StudentEnrollmentConsoleApp/Events/EventTypeMapper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using System.Collections.Concurrent;

namespace StudentEnrollmentConsoleApp.Events;

public class EventTypeMapper
{
public static readonly EventTypeMapper Instance = new();

private readonly ConcurrentDictionary<string, Type?> _typeMap = new();
private readonly ConcurrentDictionary<Type, string> _typeNameMap = new();

public string ToName<TEventType>() => ToName(typeof(TEventType));

public string ToName(Type eventType) => _typeNameMap.GetOrAdd(eventType, _ =>
{
var eventTypeName = eventType.FullName!;
_typeMap.TryAdd(eventTypeName, eventType);
return eventTypeName;
});

public Type? ToType(string eventTypeName) => _typeMap.GetOrAdd(eventTypeName, _ =>
{
var type = AppDomain.CurrentDomain
.GetAssemblies()
.SelectMany(a => a.GetTypes().Where(x => x.FullName == eventTypeName || x.Name == eventTypeName))
.FirstOrDefault();

if (type == null)
return null;

_typeNameMap.TryAdd(type, eventTypeName);

return type;
});
}
6 changes: 2 additions & 4 deletions StudentEnrollmentConsoleApp/Events/StudentCreated.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
namespace StudentEnrollmentConsoleApp.Events;

public class StudentCreated : Event
public record StudentCreated : Event
{
public required string StudentId { get; init; }
public required string FullName { get; init; }
public required string Email { get; init; }
public required DateTime DateOfBirth { get; init; }

public override string StreamId => StudentId;
public DateTime CreatedAtUtc { get; init; }
}
7 changes: 7 additions & 0 deletions StudentEnrollmentConsoleApp/Events/StudentEmailChanged.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace StudentEnrollmentConsoleApp.Events;

public record StudentEmailChanged : Event
{
public required string Email { get; init; }
public DateTime ChangedAtUtc { get; init; }
}
6 changes: 2 additions & 4 deletions StudentEnrollmentConsoleApp/Events/StudentEnrolled.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
namespace StudentEnrollmentConsoleApp.Events;

public class StudentEnrolled : Event
public record StudentEnrolled : Event
{
public required string StudentId { get; init; }
public required string CourseName { get; init; }

public override string StreamId => StudentId;
public DateTime EnrolledAtUtc { get; init; }
}
9 changes: 0 additions & 9 deletions StudentEnrollmentConsoleApp/Events/StudentUnEnrolled.cs

This file was deleted.

10 changes: 0 additions & 10 deletions StudentEnrollmentConsoleApp/Events/StudentUpdated.cs

This file was deleted.

7 changes: 7 additions & 0 deletions StudentEnrollmentConsoleApp/Events/StudentWithdrawn.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace StudentEnrollmentConsoleApp.Events;

public record StudentWithdrawn : Event
{
public required string CourseName { get; init; }
public DateTime WithdrawnAtUtc { get; init; }
}
63 changes: 44 additions & 19 deletions StudentEnrollmentConsoleApp/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@
using EventStore.Client;
using StudentEnrollmentConsoleApp.Events;

// Register events to a singleton for ease-of-reference
EventTypeMapper.Instance.ToName(typeof(StudentCreated));
EventTypeMapper.Instance.ToName(typeof(StudentEnrolled));
EventTypeMapper.Instance.ToName(typeof(StudentWithdrawn));
EventTypeMapper.Instance.ToName(typeof(StudentEmailChanged));

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

Expand All @@ -11,10 +17,11 @@
"StudentCreated",
JsonSerializer.SerializeToUtf8Bytes(new StudentCreated
{
StudentId = streamId,
Id = streamId,
FullName = "Erik Shafer",
Email = "[email protected]",
DateOfBirth = new DateTime(1987, 1, 1)
DateOfBirth = new DateTime(1987, 1, 1),
CreatedAtUtc = DateTime.UtcNow
})
);

Expand All @@ -23,19 +30,20 @@
"StudentEnrolled",
JsonSerializer.SerializeToUtf8Bytes(new StudentEnrolled
{
StudentId = streamId,
CourseName = "From Zero to Hero: REST APis in .NET"
Id = streamId,
CourseName = "From Zero to Hero: REST APis in .NET",
EnrolledAtUtc = DateTime.UtcNow
})
);

var updated = new EventData(
var emailChanged = new EventData(
Uuid.NewUuid(),
"StudentUpdated",
JsonSerializer.SerializeToUtf8Bytes(new StudentUpdated
"StudentEmailChanged",
JsonSerializer.SerializeToUtf8Bytes(new StudentEmailChanged
{
StudentId = streamId,
FullName = "Erik Shafer",
Email = "[email protected]",
Id = streamId,
Email = "[email protected]",
ChangedAtUtc = DateTime.UtcNow
})
);

Expand All @@ -48,7 +56,7 @@
await client.AppendToStreamAsync(
streamId,
StreamState.Any,
new[] { created, enrolled, updated },
new[] { created, enrolled, emailChanged },
cancellationToken: default
);

Expand All @@ -62,21 +70,38 @@ await client.AppendToStreamAsync(
var eventStream = await readStreamResult.ToListAsync();

// Write out the events from the stream
foreach (var @event in eventStream)
Console.WriteLine("Events from selected stream: ");
foreach (var resolved in eventStream)
{
Console.WriteLine($"EventId: {@event.Event.EventId}");
Console.WriteLine($"EventStreamId: {@event.Event.EventStreamId}");
Console.WriteLine($"EventType: {@event.Event.EventType}");
Console.WriteLine($"Data: {Encoding.UTF8.GetString(@event.Event.Data.ToArray())}");
Console.WriteLine("---");
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("");
}

// Write out all the courses the student enrolled in
var enrolledCourses = eventStream
.Where(re => re.Event.EventType == "StudentEnrolled")
.Select(re => JsonSerializer.Deserialize<StudentEnrolled>(re.Event.Data.ToArray()))
.Select(se => se!.CourseName)
.ToArray();
.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 (eventType == null)
break;

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

Console.WriteLine($"\t{deserializedEvent}");
}

Console.WriteLine($"Courses enrolled in: {enrolledCourses}");
Console.WriteLine("");
25 changes: 13 additions & 12 deletions StudentEnrollmentConsoleApp/Student.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ namespace StudentEnrollmentConsoleApp;

public class Student
{
public string Id { get; set; }
public string FullName { get; set; }
public string Email { get; set; }
public string Id { get; set; } = default!;
public string FullName { get; set; } = default!;
public string Email { get; set; } = default!;
public DateTime DateOfBirth { get; set; }
public List<string> EnrolledCourses { get; set; } = new();
public DateTime CreatedAtUtc { get; set; }
public List<string> EnrolledCourses { get; set; } = [];

public void Apply(Event @event)
{
Expand All @@ -17,28 +18,28 @@ public void Apply(Event @event)
case StudentCreated created:
Apply(created);
break;
case StudentUpdated updated:
Apply(updated);
case StudentEmailChanged emailChanged:
Apply(emailChanged);
break;
case StudentEnrolled enrolled:
Apply(enrolled);
break;
case StudentUnEnrolled unEnrolled:
Apply(unEnrolled);
case StudentWithdrawn withdrawn:
Apply(withdrawn);
break;
}
}

private void Apply(StudentCreated @event)
{
Id = @event.StudentId;
Id = @event.Id;
FullName = @event.FullName;
Email = @event.Email;
CreatedAtUtc = @event.CreatedAtUtc;
}

private void Apply(StudentUpdated @event)
private void Apply(StudentEmailChanged @event)
{
FullName = @event.FullName;
Email = @event.Email;
}

Expand All @@ -48,7 +49,7 @@ private void Apply(StudentEnrolled @event)
EnrolledCourses.Add(@event.CourseName);
}

private void Apply(StudentUnEnrolled @event)
private void Apply(StudentWithdrawn @event)
{
if (EnrolledCourses.Contains(@event.CourseName))
EnrolledCourses.Add(@event.CourseName);
Expand Down

0 comments on commit 633633d

Please sign in to comment.