From 3149bb1cf95fb3bad86abd8154eedfaf1829a51b Mon Sep 17 00:00:00 2001 From: TekH Date: Tue, 28 Jul 2026 10:18:54 +0200 Subject: [PATCH] Add Publisher.Abstraction project and refactor namespaces Introduced a new project, `DigitalData.MessagingService.Publisher.Abstraction`, to encapsulate the `OutgoingEmailEvent` class and `IOutgoingEmailPublisher` interface. The project targets multiple frameworks (`net462`, `net480`, `net8.0`) and enables nullable reference types and the latest C# language version. Moved `OutgoingEmailEvent` and `IOutgoingEmailPublisher` to the new project, updating their namespaces and replacing `required` properties with mutable ones in `OutgoingEmailEvent`. Updated all dependent files to reference the new namespace. Updated the solution file to include the new project and adjusted build configurations. Cleaned up unused `using` directives and removed redundant `LangVersion` property in the new project file. --- ...sagingService.Publisher.Abstraction.csproj | 10 +++++++ .../IOutgoingEmailPublisher.cs | 6 ++-- .../OutgoingEmailEvent.cs | 30 +++++++++++++++++++ DigitalData.MessagingService.sln | 9 +++++- .../Common/Events/OutgoingEmailEvent.cs | 28 ----------------- .../Common/Mappings/EmailMappingProfile.cs | 2 +- ...alData.MessagingService.Application.csproj | 1 + .../EmailSending/Commands/SendEmailCommand.cs | 3 +- .../DependencyInjection.cs | 1 + .../Queue/OutgoingEmailConsumer.cs | 2 +- .../Queue/OutgoingEmailPublisher.cs | 3 +- 11 files changed, 57 insertions(+), 38 deletions(-) create mode 100644 DigitalData.MessagingService.Publisher/DigitalData.MessagingService.Publisher.Abstraction.csproj rename {src/DigitalData.MessagingService.Application/Common/Interfaces => DigitalData.MessagingService.Publisher}/IOutgoingEmailPublisher.cs (60%) create mode 100644 DigitalData.MessagingService.Publisher/OutgoingEmailEvent.cs delete mode 100644 src/DigitalData.MessagingService.Application/Common/Events/OutgoingEmailEvent.cs diff --git a/DigitalData.MessagingService.Publisher/DigitalData.MessagingService.Publisher.Abstraction.csproj b/DigitalData.MessagingService.Publisher/DigitalData.MessagingService.Publisher.Abstraction.csproj new file mode 100644 index 0000000..ab2d2aa --- /dev/null +++ b/DigitalData.MessagingService.Publisher/DigitalData.MessagingService.Publisher.Abstraction.csproj @@ -0,0 +1,10 @@ + + + + net462;net480;net8.0 + latest + enable + latest + + + diff --git a/src/DigitalData.MessagingService.Application/Common/Interfaces/IOutgoingEmailPublisher.cs b/DigitalData.MessagingService.Publisher/IOutgoingEmailPublisher.cs similarity index 60% rename from src/DigitalData.MessagingService.Application/Common/Interfaces/IOutgoingEmailPublisher.cs rename to DigitalData.MessagingService.Publisher/IOutgoingEmailPublisher.cs index a964979..b30666a 100644 --- a/src/DigitalData.MessagingService.Application/Common/Interfaces/IOutgoingEmailPublisher.cs +++ b/DigitalData.MessagingService.Publisher/IOutgoingEmailPublisher.cs @@ -1,7 +1,7 @@ -using DigitalData.MessagingService.Application.Common.Events; -using DigitalData.MessagingService.Application.EmailSending.Commands; +using System.Threading; +using System.Threading.Tasks; -namespace DigitalData.MessagingService.Application.Common.Interfaces; +namespace DigitalData.MessagingService.Publisher.Abstraction; /// /// Email queue interface for outgoing emails. diff --git a/DigitalData.MessagingService.Publisher/OutgoingEmailEvent.cs b/DigitalData.MessagingService.Publisher/OutgoingEmailEvent.cs new file mode 100644 index 0000000..ea66be9 --- /dev/null +++ b/DigitalData.MessagingService.Publisher/OutgoingEmailEvent.cs @@ -0,0 +1,30 @@ +using System; + +namespace DigitalData.MessagingService.Publisher.Abstraction; + +public class OutgoingEmailEvent +{ + public Guid Id { get; set; } + + /// + /// Recipient email address + /// + public string Recipient { get; set; } = null!; + + /// + /// Email subject + /// + public string Subject { get; set; } = null!; + + /// + /// Email body (HTML or plain text) + /// + public string Body { get; set; } = null!; + + /// + /// Is HTML email (default: true) + /// + public bool IsHtml { get; set; } = true; + + public DateTime QueuedAt { get; set; } +} \ No newline at end of file diff --git a/DigitalData.MessagingService.sln b/DigitalData.MessagingService.sln index 319987d..e5dbe7b 100644 --- a/DigitalData.MessagingService.sln +++ b/DigitalData.MessagingService.sln @@ -37,6 +37,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DigitalData.MessagingServic EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DigitalData.MessagingService.Client.Infrastructure", "DigitalData.MessagingService.Client.Infrastructure\DigitalData.MessagingService.Client.Infrastructure.csproj", "{4ED75E1B-FE53-4AA9-AB83-E35E25049D6D}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DigitalData.MessagingService.Publisher.Abstraction", "DigitalData.MessagingService.Publisher\DigitalData.MessagingService.Publisher.Abstraction.csproj", "{99CA4C0E-75A5-4143-97BB-9C605E65E692}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -75,6 +77,10 @@ Global {4ED75E1B-FE53-4AA9-AB83-E35E25049D6D}.Debug|Any CPU.Build.0 = Debug|Any CPU {4ED75E1B-FE53-4AA9-AB83-E35E25049D6D}.Release|Any CPU.ActiveCfg = Release|Any CPU {4ED75E1B-FE53-4AA9-AB83-E35E25049D6D}.Release|Any CPU.Build.0 = Release|Any CPU + {99CA4C0E-75A5-4143-97BB-9C605E65E692}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {99CA4C0E-75A5-4143-97BB-9C605E65E692}.Debug|Any CPU.Build.0 = Debug|Any CPU + {99CA4C0E-75A5-4143-97BB-9C605E65E692}.Release|Any CPU.ActiveCfg = Release|Any CPU + {99CA4C0E-75A5-4143-97BB-9C605E65E692}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -89,8 +95,9 @@ Global {DD9D4A3A-AB55-456E-80D3-54A2D4025E64} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} {71BEA4D0-7835-4A8C-B11E-1088E0801DCE} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} {5B941DD2-7D0E-5D58-5D32-7E1B4C249CBC} = {71BEA4D0-7835-4A8C-B11E-1088E0801DCE} - {C553F2ED-1585-E143-70E5-44A8D64D1BDF} = {DD9D4A3A-AB55-456E-80D3-54A2D4025E64} + {C553F2ED-1585-E143-70E5-44A8D64D1BDF} = {B52B4CEE-1C67-424B-8659-370FEA7EAF2A} {4ED75E1B-FE53-4AA9-AB83-E35E25049D6D} = {71BEA4D0-7835-4A8C-B11E-1088E0801DCE} + {99CA4C0E-75A5-4143-97BB-9C605E65E692} = {DD9D4A3A-AB55-456E-80D3-54A2D4025E64} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {90E29FDC-F6C6-414F-94BF-25DF61D18060} diff --git a/src/DigitalData.MessagingService.Application/Common/Events/OutgoingEmailEvent.cs b/src/DigitalData.MessagingService.Application/Common/Events/OutgoingEmailEvent.cs deleted file mode 100644 index 5969de1..0000000 --- a/src/DigitalData.MessagingService.Application/Common/Events/OutgoingEmailEvent.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace DigitalData.MessagingService.Application.Common.Events; - -public class OutgoingEmailEvent -{ - public required Guid Id { get; init; } - - /// - /// Recipient email address - /// - public required string Recipient { get; init; } - - /// - /// Email subject - /// - public required string Subject { get; init; } - - /// - /// Email body (HTML or plain text) - /// - public required string Body { get; init; } - - /// - /// Is HTML email (default: true) - /// - public bool IsHtml { get; init; } = true; - - public DateTime QueuedAt { get; init; } -} \ No newline at end of file diff --git a/src/DigitalData.MessagingService.Application/Common/Mappings/EmailMappingProfile.cs b/src/DigitalData.MessagingService.Application/Common/Mappings/EmailMappingProfile.cs index 331efa1..70659d7 100644 --- a/src/DigitalData.MessagingService.Application/Common/Mappings/EmailMappingProfile.cs +++ b/src/DigitalData.MessagingService.Application/Common/Mappings/EmailMappingProfile.cs @@ -1,6 +1,6 @@ using AutoMapper; -using DigitalData.MessagingService.Application.Common.Events; using DigitalData.MessagingService.Application.EmailSending.Commands; +using DigitalData.MessagingService.Publisher.Abstraction; namespace DigitalData.MessagingService.Application.Common.Mappings; diff --git a/src/DigitalData.MessagingService.Application/DigitalData.MessagingService.Application.csproj b/src/DigitalData.MessagingService.Application/DigitalData.MessagingService.Application.csproj index 24af99d..f5b56b5 100644 --- a/src/DigitalData.MessagingService.Application/DigitalData.MessagingService.Application.csproj +++ b/src/DigitalData.MessagingService.Application/DigitalData.MessagingService.Application.csproj @@ -7,6 +7,7 @@ + diff --git a/src/DigitalData.MessagingService.Application/EmailSending/Commands/SendEmailCommand.cs b/src/DigitalData.MessagingService.Application/EmailSending/Commands/SendEmailCommand.cs index 89e98bb..3db5d89 100644 --- a/src/DigitalData.MessagingService.Application/EmailSending/Commands/SendEmailCommand.cs +++ b/src/DigitalData.MessagingService.Application/EmailSending/Commands/SendEmailCommand.cs @@ -1,6 +1,5 @@ using AutoMapper; -using DigitalData.MessagingService.Application.Common.Events; -using DigitalData.MessagingService.Application.Common.Interfaces; +using DigitalData.MessagingService.Publisher.Abstraction; using MediatR; namespace DigitalData.MessagingService.Application.EmailSending.Commands; diff --git a/src/DigitalData.MessagingService.Infrastructure/DependencyInjection.cs b/src/DigitalData.MessagingService.Infrastructure/DependencyInjection.cs index d5f1a6a..b191789 100644 --- a/src/DigitalData.MessagingService.Infrastructure/DependencyInjection.cs +++ b/src/DigitalData.MessagingService.Infrastructure/DependencyInjection.cs @@ -2,6 +2,7 @@ using DigitalData.MessagingService.Application.Common.Interfaces; using DigitalData.MessagingService.Infrastructure.Queue; using DigitalData.MessagingService.Infrastructure.Services; using DigitalData.MessagingService.Infrastructure.Services.Background; +using DigitalData.MessagingService.Publisher.Abstraction; using DigitalData.MessagingService.RabbitMQ; using Microsoft.AspNetCore.DataProtection; using Microsoft.Extensions.Configuration; diff --git a/src/DigitalData.MessagingService.Infrastructure/Queue/OutgoingEmailConsumer.cs b/src/DigitalData.MessagingService.Infrastructure/Queue/OutgoingEmailConsumer.cs index 5516511..80da0ee 100644 --- a/src/DigitalData.MessagingService.Infrastructure/Queue/OutgoingEmailConsumer.cs +++ b/src/DigitalData.MessagingService.Infrastructure/Queue/OutgoingEmailConsumer.cs @@ -1,12 +1,12 @@ using System.Text; using System.Text.Json; using DigitalData.MessagingService.Application.Common.Interfaces; +using DigitalData.MessagingService.Publisher.Abstraction; using DigitalData.MessagingService.RabbitMQ; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using RabbitMQ.Client; using RabbitMQ.Client.Events; -using DigitalData.MessagingService.Application.Common.Events; namespace DigitalData.MessagingService.Infrastructure.Queue; diff --git a/src/DigitalData.MessagingService.Infrastructure/Queue/OutgoingEmailPublisher.cs b/src/DigitalData.MessagingService.Infrastructure/Queue/OutgoingEmailPublisher.cs index d11545a..2ff0fa7 100644 --- a/src/DigitalData.MessagingService.Infrastructure/Queue/OutgoingEmailPublisher.cs +++ b/src/DigitalData.MessagingService.Infrastructure/Queue/OutgoingEmailPublisher.cs @@ -1,11 +1,10 @@ using System.Text; using System.Text.Json; -using DigitalData.MessagingService.Application.Common.Interfaces; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using RabbitMQ.Client; -using DigitalData.MessagingService.Application.Common.Events; using DigitalData.MessagingService.RabbitMQ; +using DigitalData.MessagingService.Publisher.Abstraction; namespace DigitalData.MessagingService.Infrastructure.Queue;