From 25d0c009eedcfe531935ce8e528dc569f2a80fcc Mon Sep 17 00:00:00 2001 From: TekH Date: Thu, 13 Aug 2026 11:58:12 +0200 Subject: [PATCH] refactor(infrastructure): migrate EmailSyncWorker to DB-backed account source with upsert seed - EmailSyncWorker now fetches active email accounts from IRepository on every polling cycle instead of reading from static options list - Add UpsertSeedEmailAccount: on startup, seed accounts from EmailAccountsOptions into the database via IRepository.UpsertAsync (insert or update by Username) - Remove standalone EmailAccountSyncWorker (merged into EmailSyncWorker) --- .../Background/EmailAccountSyncWorker.cs | 26 ------------------- .../Services/Background/EmailSyncWorker.cs | 24 +++++++++++++++-- 2 files changed, 22 insertions(+), 28 deletions(-) delete mode 100644 src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/Background/EmailAccountSyncWorker.cs diff --git a/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/Background/EmailAccountSyncWorker.cs b/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/Background/EmailAccountSyncWorker.cs deleted file mode 100644 index dc37a84..0000000 --- a/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/Background/EmailAccountSyncWorker.cs +++ /dev/null @@ -1,26 +0,0 @@ -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 diff --git a/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/Background/EmailSyncWorker.cs b/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/Background/EmailSyncWorker.cs index be01c30..7222811 100644 --- a/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/Background/EmailSyncWorker.cs +++ b/src/infrastructure/DigitalData.MessagingService.Infrastructure/Services/Background/EmailSyncWorker.cs @@ -1,17 +1,22 @@ using DigitalData.MessagingService.Application.Common.Dto.MailSearch; using DigitalData.MessagingService.Application.Common.Interfaces; +using DigitalData.MessagingService.Application.Common.Interfaces.Repositories; using DigitalData.MessagingService.Application.Common.Options; +using DigitalData.MessagingService.Domain.Entities; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; namespace DigitalData.MessagingService.Infrastructure.Services.Background; -public class EmailSyncWorker(IImapEmailService imapService, IOptions Options) : BackgroundService +public class EmailSyncWorker(IImapEmailService imapService, IOptions Options, IServiceProvider Provider) : BackgroundService { private DateFilter? _dateFilter = null; protected override async Task ExecuteAsync(CancellationToken stoppingToken) { + await UpsertSeedEmailAccount(stoppingToken); + if (imapService is not LimilabsImapEmailService limapService) { await Task.Delay(Timeout.Infinite, stoppingToken).ConfigureAwait(ConfigureAwaitOptions.SuppressThrowing); @@ -22,7 +27,11 @@ public class EmailSyncWorker(IImapEmailService imapService, IOptions>(); + + foreach (var account in await emailAccountRepo.GetAllAsync(stoppingToken)) if (account.ImapServer is not null) { // init or update last date filter @@ -44,4 +53,15 @@ public class EmailSyncWorker(IImapEmailService imapService, IOptions>(); + + // init seed email accounts if not exist + foreach (var account in Options.Value.Accounts) + await emailAccountRepo.UpsertAsync(a => a.Username == account.Username, account, stoppingToken); + } } \ No newline at end of file