From 8b4d1e48f560f9021c73c504c9d44df5f0acb173 Mon Sep 17 00:00:00 2001 From: TekH Date: Thu, 13 Aug 2026 09:37:39 +0200 Subject: [PATCH] Add EmailAccountSyncWorker and configure EmailAccount entity Introduced the `EmailAccountSyncWorker` background service to initialize and synchronize email accounts using RabbitMQ for event-driven processing. The service resolves email account configurations from application settings and upserts them into the repository. Updated `MessagingServiceDbContext` to configure the `EmailAccount` entity, setting the `Username` property to use the `SQL_Latin1_General_CP1_CI_AS` collation for case-insensitive comparisons. Added necessary `using` directives in `DependencyInjection.cs` to integrate new dependencies for AutoMapper, repositories, services, and background processing. --- .../DependencyInjection.cs | 2 ++ .../Persistence/MessagingServiceDbContext.cs | 6 +++++ .../Background/EmailAccountSyncWorker.cs | 26 +++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/Background/EmailAccountSyncWorker.cs diff --git a/src/infrastructure/DigitalData.MessagingService.Infrastructure/DependencyInjection.cs b/src/infrastructure/DigitalData.MessagingService.Infrastructure/DependencyInjection.cs index 297b5ec..79fc6c6 100644 --- a/src/infrastructure/DigitalData.MessagingService.Infrastructure/DependencyInjection.cs +++ b/src/infrastructure/DigitalData.MessagingService.Infrastructure/DependencyInjection.cs @@ -1,5 +1,7 @@ +using AutoMapper; using DigitalData.MessagingService.Application.Common.Interfaces; using DigitalData.MessagingService.Application.Common.Interfaces.Repositories; +using DigitalData.MessagingService.Infrastructure.Mappings; using DigitalData.MessagingService.Infrastructure.Persistence; using DigitalData.MessagingService.Infrastructure.Queue; using DigitalData.MessagingService.Infrastructure.Repositories; diff --git a/src/infrastructure/DigitalData.MessagingService.Infrastructure/Persistence/MessagingServiceDbContext.cs b/src/infrastructure/DigitalData.MessagingService.Infrastructure/Persistence/MessagingServiceDbContext.cs index 7a0cdaa..53679ac 100644 --- a/src/infrastructure/DigitalData.MessagingService.Infrastructure/Persistence/MessagingServiceDbContext.cs +++ b/src/infrastructure/DigitalData.MessagingService.Infrastructure/Persistence/MessagingServiceDbContext.cs @@ -16,6 +16,12 @@ public class MessagingServiceDbContext(DbContextOptions(entity => + { + entity.Property(e => e.Username) + .UseCollation("SQL_Latin1_General_CP1_CI_AS"); + }); + modelBuilder.Entity(entity => { entity.HasMany(e => e.Attachments) diff --git a/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/Background/EmailAccountSyncWorker.cs b/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/Background/EmailAccountSyncWorker.cs new file mode 100644 index 0000000..dc37a84 --- /dev/null +++ b/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/Background/EmailAccountSyncWorker.cs @@ -0,0 +1,26 @@ +using DigitalData.MessagingService.Application.Common.Interfaces.Repositories; +using DigitalData.MessagingService.Application.Common.Options; +using DigitalData.MessagingService.Domain.Entities; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Options; + +namespace DigitalData.MessagingService.Infrastructure.Services.Background; + +/// +/// A hosted background service responsible for initializing the competing email consumer pool. +/// Leverages a push-based, event-driven RabbitMQ consumer to eliminate polling overhead. +/// Email account configuration is resolved exclusively from application settings; no database access is performed. +/// +public class EmailAccountSyncWorker(IRepository Repository, IOptions Options) : BackgroundService +{ + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + foreach (var account in Options.Value.Accounts) + { + if (account is EmailAccount emailAccount) + await Repository.UpsertAsync(a => a.Username == emailAccount.Username, emailAccount, stoppingToken); + } + + await Task.Delay(Timeout.Infinite, stoppingToken).ConfigureAwait(ConfigureAwaitOptions.SuppressThrowing); + } +} \ No newline at end of file