Added Event Tracking!

This commit is contained in:
2026-07-16 16:36:46 +02:00
parent 50e74a0034
commit ee1e64c944
6 changed files with 81 additions and 1 deletions
@@ -11,6 +11,9 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Microsoft.Extensions.Logging.Abstractions">
<HintPath>..\..\..\..\..\..\.nuget\packages\microsoft.extensions.logging.abstractions\10.0.9\lib\net10.0\Microsoft.Extensions.Logging.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Wolverine"> <Reference Include="Wolverine">
<HintPath>..\..\..\..\..\..\.nuget\packages\wolverinefx\6.18.0\lib\net10.0\Wolverine.dll</HintPath> <HintPath>..\..\..\..\..\..\.nuget\packages\wolverinefx\6.18.0\lib\net10.0\Wolverine.dll</HintPath>
</Reference> </Reference>
@@ -0,0 +1,42 @@
using Microsoft.Extensions.Logging;
namespace FinancialApi.Application;
public static class FinancialEventHandler
{
public static void Handle(
FeeAppliedEvent @event,
IEventTracker store,
ILogger logger)
{
var message = $"FeeApplied: ${@event.Amount} moved from Account {@event.AccountId} to Account 99999.";
logger.LogInformation("BACKGROUND EVENT FIRED: {Message}", message);
// Save to our UI bucket
store.Add(message);
}
public static void Handle(
FundsTransferredEvent @event,
IEventTracker store,
ILogger logger)
{
var message = $"FundsTransferred: ${@event.Amount} moved from Account {@event.SourceAccountId} to Account {@event.DestinationAccountId}.";
logger.LogInformation("BACKGROUND EVENT FIRED: {Message}", message);
// Save to our UI bucket
store.Add(message);
}
public static void Handle(
JournalReversedEvent @event,
IEventTracker store,
ILogger logger)
{
var message = $"JournalReversed: Original Entry {@event.OriginalJournalId} was reversed by Entry {@event.ReversalJournalId}.";
logger.LogInformation("BACKGROUND EVENT FIRED: {Message}", message);
store.Add(message);
}
}
@@ -0,0 +1,6 @@
namespace FinancialApi.Application;
public interface IEventTracker
{
void Add(string eventMessage);
}
@@ -0,0 +1,13 @@
using FinancialApi.Application;
namespace FinancialApi;
public class DemoEventStore : IEventTracker
{
public List<string> CapturedEvents { get; } = new();
public void Add(string eventMessage)
{
CapturedEvents.Add($"[{DateTimeOffset.UtcNow:HH:mm:ss}] {eventMessage}");
}
}
@@ -31,6 +31,11 @@ POST {{FinancialApi_HostAddress}}/journal/reverse
Content-Type: application/json Content-Type: application/json
{ {
"originalJournalId": "3E829F92-E2FA-4FCD-9B7B-E1B5AAC96FF1", "originalJournalId": "1443B0FC-F679-4445-A910-CC333F0925B7",
"reason": "Incorrect Account Fee" "reason": "Incorrect Account Fee"
} }
### Events
GET {{FinancialApi_HostAddress}}/events
Content-Type: application/json
@@ -22,6 +22,7 @@ builder.Services.AddDbContext<AccountDbContext>(options =>
builder.Services.AddScoped<IAccountQuery, AccountQuery>(); builder.Services.AddScoped<IAccountQuery, AccountQuery>();
builder.Services.AddScoped<IReversalQuery, ReversalQuery>(); builder.Services.AddScoped<IReversalQuery, ReversalQuery>();
builder.Services.AddSingleton<IEventTracker, DemoEventStore>();
// Add services to the container. // Add services to the container.
// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi // Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
@@ -31,6 +32,7 @@ builder.AddServiceDefaults();
builder.Host.UseWolverine(opts => builder.Host.UseWolverine(opts =>
{ {
opts.Discovery.IncludeAssembly(typeof(DemoEventStore).Assembly);
opts.Discovery.IncludeAssembly(typeof(ApplyFeeHandler).Assembly); opts.Discovery.IncludeAssembly(typeof(ApplyFeeHandler).Assembly);
opts.PersistMessagesWithSqlite(connectionString); opts.PersistMessagesWithSqlite(connectionString);
opts.UseEntityFrameworkCoreTransactions(); opts.UseEntityFrameworkCoreTransactions();
@@ -74,4 +76,13 @@ app.MapPost("/journal/reverse", async (ReverseJournalCommand cmd, IMessageBus bu
return Results.Accepted(); return Results.Accepted();
}); });
app.MapGet("/events", (IEventTracker tracker) =>
{
if (tracker is DemoEventStore store)
{
return Results.Ok(store.CapturedEvents);
}
return Results.NotFound();
});
app.Run(); app.Run();