Refactor: Rename OutgoingEmail to SendingEmail

This commit renames and refactors all instances of `OutgoingEmail` to `SendingEmail` across the codebase to improve terminology consistency and align with domain language.

- Renamed classes, interfaces, and records (e.g., `OutgoingEmailPublisher` → `SendingEmailPublisher`, `OutgoingEmailEvent` → `SendingEmailEvent`).
- Updated method signatures, parameters, and return types to use `SendingEmail`.
- Adjusted dependency injection registrations to reflect the new naming.
- Updated mappings in `EmailMappingProfile` to map `SendEmailCommand` to `SendingEmailEvent`.
- Refactored `SendEmailCommand` and its handler to work with `SendingEmailEvent`.
- Updated `EmailsController` to use `SendingEmailEvent` in the `SendEmail` action.
- Refactored integration tests to test `SendingEmailPublisher` and updated test data accordingly.
- Updated log messages, error handling, and comments to reflect the new terminology.
- Revised documentation and utility methods to use `SendingEmailEvent`.

This refactor ensures consistency, improves readability, and reduces ambiguity in the codebase.
This commit is contained in:
2026-08-05 13:26:21 +02:00
parent e550db8789
commit 58ad50b96b
15 changed files with 55 additions and 55 deletions

View File

@@ -10,31 +10,31 @@ using RabbitMQ.Client;
namespace DigitalData.MessagingService.Tests.Integration;
/// <summary>
/// Integration tests for <see cref="OutgoingEmailPublisher"/> against the real RabbitMQ broker.
/// Integration tests for <see cref="SendingEmailPublisher"/> against the real RabbitMQ broker.
/// Each test publishes a message and immediately reads it back via BasicGetAsync to verify
/// the full round-trip without starting the consumer (which requires Limilabs Mail.dll).
/// </summary>
public sealed class OutgoingEmailPublisherTests : IAsyncDisposable
public sealed class SendingEmailPublisherTests : IAsyncDisposable
{
private readonly ServiceProvider _serviceProvider;
private readonly IOutgoingEmailPublisher _publisher;
private readonly ISendingEmailPublisher _publisher;
private readonly RabbitMqConnectionFactory _factory;
public OutgoingEmailPublisherTests()
public SendingEmailPublisherTests()
{
var services = new ServiceCollection();
services.AddLogging();
services.AddMessagingServicePublisher(RabbitMqTestConfig.Apply);
_serviceProvider = services.BuildServiceProvider();
_publisher = _serviceProvider.GetRequiredService<IOutgoingEmailPublisher>();
_publisher = _serviceProvider.GetRequiredService<ISendingEmailPublisher>();
_factory = _serviceProvider.GetRequiredService<RabbitMqConnectionFactory>();
}
[Fact]
public async Task EnqueueAsync_PublishesMessage_MessageArrivesInQueue()
{
var email = new OutgoingEmailEvent
var email = new SendingEmailEvent
{
Id = Guid.NewGuid(),
Recipients = ["test@example.com"],
@@ -59,7 +59,7 @@ public sealed class OutgoingEmailPublisherTests : IAsyncDisposable
[Fact]
public async Task EnqueueAsync_MultipleMessages_AllArrivesInQueue()
{
var emails = Enumerable.Range(1, 3).Select(i => new OutgoingEmailEvent
var emails = Enumerable.Range(1, 3).Select(i => new SendingEmailEvent
{
Id = Guid.NewGuid(),
Recipients = new List<string> { $"recipient{i}@example.com" },
@@ -82,7 +82,7 @@ public sealed class OutgoingEmailPublisherTests : IAsyncDisposable
[Fact]
public async Task GetQueueDepthAsync_AfterPublish_ReturnsPositiveDepth()
{
var email = new OutgoingEmailEvent
var email = new SendingEmailEvent
{
Id = Guid.NewGuid(),
Recipients = ["depth-test@example.com"],
@@ -105,7 +105,7 @@ public sealed class OutgoingEmailPublisherTests : IAsyncDisposable
{
var id = Guid.NewGuid();
var email = new OutgoingEmailEvent
var email = new SendingEmailEvent
{
Id = id,
Recipients = new List<string> { "serialize@example.com" },
@@ -132,7 +132,7 @@ public sealed class OutgoingEmailPublisherTests : IAsyncDisposable
/// <summary>
/// Reads a single message from the queue without acknowledging it (peek via nack+requeue).
/// </summary>
private async Task<OutgoingEmailEvent?> PeekMessageAsync()
private async Task<SendingEmailEvent?> PeekMessageAsync()
{
var connection = await _factory.GetDefaultConnectionAsync();
await using var channel = await connection.CreateChannelAsync();
@@ -146,21 +146,21 @@ public sealed class OutgoingEmailPublisherTests : IAsyncDisposable
await channel.BasicNackAsync(result.DeliveryTag, multiple: false, requeue: true);
var json = Encoding.UTF8.GetString(result.Body.ToArray());
return JsonSerializer.Deserialize<OutgoingEmailEvent>(json);
return JsonSerializer.Deserialize<SendingEmailEvent>(json);
}
/// <summary>
/// Scans queue messages (up to a limit) to find a message matching the given <paramref name="id"/>.
/// All messages are re-queued after inspection.
/// </summary>
private async Task<OutgoingEmailEvent?> FindMessageAsync(Guid id, int maxMessages = 50)
private async Task<SendingEmailEvent?> FindMessageAsync(Guid id, int maxMessages = 50)
{
var connection = await _factory.GetDefaultConnectionAsync();
await using var channel = await connection.CreateChannelAsync();
var requeue = new List<(ulong DeliveryTag, byte[] Body)>();
OutgoingEmailEvent? found = null;
SendingEmailEvent? found = null;
for (int i = 0; i < maxMessages; i++)
{
@@ -171,7 +171,7 @@ public sealed class OutgoingEmailPublisherTests : IAsyncDisposable
requeue.Add((result.DeliveryTag, result.Body.ToArray()));
var json = Encoding.UTF8.GetString(result.Body.ToArray());
var evt = JsonSerializer.Deserialize<OutgoingEmailEvent>(json);
var evt = JsonSerializer.Deserialize<SendingEmailEvent>(json);
if (evt?.Id == id)
{