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