refactor: Rename EmailPorifler to MessagingService

This commit is contained in:
2026-07-24 13:59:43 +02:00
parent 77d3b52d16
commit 5e587da957
58 changed files with 202 additions and 202 deletions

2
.gitignore vendored
View File

@@ -370,4 +370,4 @@ FodyWeavers.xsd
/EnvelopeGenerator.Server/EnvelopeGenerator.Server/publish-output /EnvelopeGenerator.Server/EnvelopeGenerator.Server/publish-output
/EnvelopeGenerator.Server/EnvelopeGenerator.Server/tekh_softHSM_test.md /EnvelopeGenerator.Server/EnvelopeGenerator.Server/tekh_softHSM_test.md
/legacy/App /legacy/App
/src/DigitalData.EmailProfiler.API/appsettings.Secrets.json /src/DigitalData.MessagingService.API/appsettings.Secrets.json

View File

@@ -1,7 +1,7 @@
# EmailProfiler - Agent Notes and Future Enhancements # MessagingService - Agent Notes and Future Enhancements
## Purpose ## Purpose
This document contains important notes, decisions, and future enhancement plans for the EmailProfiler application. This is intended for AI agents and developers who will continue development. This document contains important notes, decisions, and future enhancement plans for the MessagingService application. This is intended for AI agents and developers who will continue development.
--- ---
@@ -302,7 +302,7 @@ return Accepted(); // HTTP 202 - command queued for processing
2. **Create RabbitMqEmailQueue.cs**: 2. **Create RabbitMqEmailQueue.cs**:
```csharp ```csharp
// src/DigitalData.EmailProfiler.Infrastructure/Queue/RabbitMqEmailQueue.cs // src/DigitalData.MessagingService.Infrastructure/Queue/RabbitMqEmailQueue.cs
public class RabbitMqEmailQueue : IEmailQueue public class RabbitMqEmailQueue : IEmailQueue
{ {
private readonly IConnection _connection; private readonly IConnection _connection;
@@ -412,7 +412,7 @@ return Accepted(); // HTTP 202 - command queued for processing
**Example Command**: **Example Command**:
```csharp ```csharp
// src/DigitalData.EmailProfiler.Application/EmailProfiles/Commands/CreateEmailProfileCommand.cs // src/DigitalData.MessagingService.Application/EmailProfiles/Commands/CreateEmailProfileCommand.cs
public record CreateEmailProfileCommand(string ProfileName, int EmailAccountId) : IRequest<int>; public record CreateEmailProfileCommand(string ProfileName, int EmailAccountId) : IRequest<int>;
public class CreateEmailProfileCommandHandler : IRequestHandler<CreateEmailProfileCommand, int> public class CreateEmailProfileCommandHandler : IRequestHandler<CreateEmailProfileCommand, int>
@@ -498,7 +498,7 @@ public class LimilabsEmailService : IEmailService
**Status**: ✅ Complete - DbContext, Repository, Services, RabbitMQ, and DI implemented **Status**: ✅ Complete - DbContext, Repository, Services, RabbitMQ, and DI implemented
**Completed**: **Completed**:
- ✅ EmailProfilerDbContext with DbSet<T> for all entities (attribute-only config, no overrides) - ✅ MessagingServiceDbContext with DbSet<T> for all entities (attribute-only config, no overrides)
- ✅ Generic Repository<T> implementing IRepository<T> with AutoMapper-based CRUD - ✅ Generic Repository<T> implementing IRepository<T> with AutoMapper-based CRUD
- ✅ LimilabsEmailService (IMAP/SMTP with OAuth2 using Limilabs Mail.dll - TODO: Add Limilabs.Mail NuGet) - ✅ LimilabsEmailService (IMAP/SMTP with OAuth2 using Limilabs Mail.dll - TODO: Add Limilabs.Mail NuGet)
- ✅ GdPicturePdfProcessingService (using GdPicture.NET 14 - TODO: Add GdPicture NuGet and license) - ✅ GdPicturePdfProcessingService (using GdPicture.NET 14 - TODO: Add GdPicture NuGet and license)
@@ -517,7 +517,7 @@ public class LimilabsEmailService : IEmailService
**DbContext Example**: **DbContext Example**:
```csharp ```csharp
public class EmailProfilerDbContext : DbContext public class MessagingServiceDbContext : DbContext
{ {
public DbSet<EmailAccount> EmailAccounts { get; set; } public DbSet<EmailAccount> EmailAccounts { get; set; }
public DbSet<EmailProfile> EmailProfiles { get; set; } public DbSet<EmailProfile> EmailProfiles { get; set; }
@@ -695,7 +695,7 @@ if (builder.Configuration["Hosting:Mode"] == "WindowsService")
Install as Windows Service: Install as Windows Service:
```bash ```bash
sc create EmailProfiler binPath="C:\Path\To\DigitalData.EmailProfiler.API.exe" sc create MessagingService binPath="C:\Path\To\DigitalData.MessagingService.API.exe"
``` ```
--- ---

View File

@@ -5,15 +5,15 @@ VisualStudioVersion = 17.14.36717.8
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DigitalData.EmailProfiler.API", "src\DigitalData.EmailProfiler.API\DigitalData.EmailProfiler.API.csproj", "{456817AB-67A3-49DD-9EC5-1253A727B958}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DigitalData.MessagingService.API", "src\DigitalData.MessagingService.API\DigitalData.MessagingService.API.csproj", "{456817AB-67A3-49DD-9EC5-1253A727B958}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DigitalData.EmailProfiler.Infrastructure", "src\DigitalData.EmailProfiler.Infrastructure\DigitalData.EmailProfiler.Infrastructure.csproj", "{D2C32417-FE92-4063-97A9-3DA8D811E561}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DigitalData.MessagingService.Infrastructure", "src\DigitalData.MessagingService.Infrastructure\DigitalData.MessagingService.Infrastructure.csproj", "{D2C32417-FE92-4063-97A9-3DA8D811E561}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DigitalData.EmailProfiler.Domain", "src\DigitalData.EmailProfiler.Domain\DigitalData.EmailProfiler.Domain.csproj", "{76ADC1D0-4DFA-0B1E-57C9-2636434A0043}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DigitalData.MessagingService.Domain", "src\DigitalData.MessagingService.Domain\DigitalData.MessagingService.Domain.csproj", "{76ADC1D0-4DFA-0B1E-57C9-2636434A0043}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DigitalData.EmailProfiler.Application", "src\DigitalData.EmailProfiler.Application\DigitalData.EmailProfiler.Application.csproj", "{1874A827-C6A5-EB5E-0FE9-30A7200382B7}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DigitalData.MessagingService.Application", "src\DigitalData.MessagingService.Application\DigitalData.MessagingService.Application.csproj", "{1874A827-C6A5-EB5E-0FE9-30A7200382B7}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DigitalData.EmailProfiler.Tests", "tests\DigitalData.EmailProfiler.Tests\DigitalData.EmailProfiler.Tests.csproj", "{211FB65F-2406-474E-A426-DA246B250AB8}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DigitalData.MessagingService.Tests", "tests\DigitalData.MessagingService.Tests\DigitalData.MessagingService.Tests.csproj", "{211FB65F-2406-474E-A426-DA246B250AB8}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{4F20FEFD-9289-42C6-ABA6-8DB236D74559}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{4F20FEFD-9289-42C6-ABA6-8DB236D74559}"
EndProject EndProject

View File

@@ -1,8 +1,8 @@
# EmailProfiler - Implementation Guide for AI Agents # MessagingService - Implementation Guide for AI Agents
## Overview ## Overview
This guide provides step-by-step instructions for AI agents to continue the implementation of the EmailProfiler application. The project is a modern .NET 8.0 rewrite of a legacy VB.NET email automation system. This guide provides step-by-step instructions for AI agents to continue the implementation of the MessagingService application. The project is a modern .NET 8.0 rewrite of a legacy VB.NET email automation system.
--- ---
@@ -34,7 +34,7 @@ This guide provides step-by-step instructions for AI agents to continue the impl
## Architecture Overview ## Architecture Overview
``` ```
DigitalData.EmailProfiler/ DigitalData.MessagingService/
├── src/ ├── src/
│ ├── Domain/ ✅ COMPLETE │ ├── Domain/ ✅ COMPLETE
│ ├── Application/ 🚧 IN PROGRESS (5%) │ ├── Application/ 🚧 IN PROGRESS (5%)
@@ -56,15 +56,15 @@ DigitalData.EmailProfiler/
#### 2.1. Create Repository Interfaces #### 2.1. Create Repository Interfaces
**Location**: `src/DigitalData.EmailProfiler.Application/Interfaces/Repositories/` **Location**: `src/DigitalData.MessagingService.Application/Interfaces/Repositories/`
Create these files: Create these files:
**IEmailProfileRepository.cs**: **IEmailProfileRepository.cs**:
```csharp ```csharp
using DigitalData.EmailProfiler.Domain.Entities; using DigitalData.MessagingService.Domain.Entities;
namespace DigitalData.EmailProfiler.Application.Interfaces.Repositories; namespace DigitalData.MessagingService.Application.Interfaces.Repositories;
public interface IEmailProfileRepository public interface IEmailProfileRepository
{ {
@@ -80,9 +80,9 @@ public interface IEmailProfileRepository
**IEmailAccountRepository.cs**: **IEmailAccountRepository.cs**:
```csharp ```csharp
using DigitalData.EmailProfiler.Domain.Entities; using DigitalData.MessagingService.Domain.Entities;
namespace DigitalData.EmailProfiler.Application.Interfaces.Repositories; namespace DigitalData.MessagingService.Application.Interfaces.Repositories;
public interface IEmailAccountRepository public interface IEmailAccountRepository
{ {
@@ -97,9 +97,9 @@ public interface IEmailAccountRepository
**IEmailHistoryRepository.cs**: **IEmailHistoryRepository.cs**:
```csharp ```csharp
using DigitalData.EmailProfiler.Domain.Entities; using DigitalData.MessagingService.Domain.Entities;
namespace DigitalData.EmailProfiler.Application.Interfaces.Repositories; namespace DigitalData.MessagingService.Application.Interfaces.Repositories;
public interface IEmailHistoryRepository public interface IEmailHistoryRepository
{ {
@@ -116,11 +116,11 @@ public interface IEmailHistoryRepository
#### 2.2. Create Service Interfaces #### 2.2. Create Service Interfaces
**Location**: `src/DigitalData.EmailProfiler.Application/Interfaces/Services/` **Location**: `src/DigitalData.MessagingService.Application/Interfaces/Services/`
**IEmailService.cs**: **IEmailService.cs**:
```csharp ```csharp
namespace DigitalData.EmailProfiler.Application.Interfaces.Services; namespace DigitalData.MessagingService.Application.Interfaces.Services;
public interface IEmailService public interface IEmailService
{ {
@@ -169,13 +169,13 @@ public class EmailAttachmentData
#### 2.3. Create MediatR Commands #### 2.3. Create MediatR Commands
**Location**: `src/DigitalData.EmailProfiler.Application/EmailProfiles/Commands/` **Location**: `src/DigitalData.MessagingService.Application/EmailProfiles/Commands/`
**CreateEmailProfileCommand.cs**: **CreateEmailProfileCommand.cs**:
```csharp ```csharp
using MediatR; using MediatR;
namespace DigitalData.EmailProfiler.Application.EmailProfiles.Commands; namespace DigitalData.MessagingService.Application.EmailProfiles.Commands;
public record CreateEmailProfileCommand( public record CreateEmailProfileCommand(
string ProfileName, string ProfileName,
@@ -213,15 +213,15 @@ public class CreateEmailProfileCommandHandler : IRequestHandler<CreateEmailProfi
#### 2.4. Create MediatR Queries #### 2.4. Create MediatR Queries
**Location**: `src/DigitalData.EmailProfiler.Application/EmailProfiles/Queries/` **Location**: `src/DigitalData.MessagingService.Application/EmailProfiles/Queries/`
**GetEmailProfilesQuery.cs**: **GetEmailProfilesQuery.cs**:
```csharp ```csharp
using MediatR; using MediatR;
using AutoMapper; using AutoMapper;
using DigitalData.EmailProfiler.Application.Common.Dtos; using DigitalData.MessagingService.Application.Common.Dtos;
namespace DigitalData.EmailProfiler.Application.EmailProfiles.Queries; namespace DigitalData.MessagingService.Application.EmailProfiles.Queries;
public record GetEmailProfilesQuery : IRequest<List<EmailProfileDto>>; public record GetEmailProfilesQuery : IRequest<List<EmailProfileDto>>;
@@ -248,14 +248,14 @@ public class GetEmailProfilesQueryHandler : IRequestHandler<GetEmailProfilesQuer
#### 2.5. Create Validators #### 2.5. Create Validators
**Location**: `src/DigitalData.EmailProfiler.Application/EmailProfiles/Validators/` **Location**: `src/DigitalData.MessagingService.Application/EmailProfiles/Validators/`
**CreateEmailProfileCommandValidator.cs**: **CreateEmailProfileCommandValidator.cs**:
```csharp ```csharp
using FluentValidation; using FluentValidation;
using DigitalData.EmailProfiler.Application.EmailProfiles.Commands; using DigitalData.MessagingService.Application.EmailProfiles.Commands;
namespace DigitalData.EmailProfiler.Application.EmailProfiles.Validators; namespace DigitalData.MessagingService.Application.EmailProfiles.Validators;
public class CreateEmailProfileCommandValidator : AbstractValidator<CreateEmailProfileCommand> public class CreateEmailProfileCommandValidator : AbstractValidator<CreateEmailProfileCommand>
{ {
@@ -277,15 +277,15 @@ public class CreateEmailProfileCommandValidator : AbstractValidator<CreateEmailP
#### 2.6. Create AutoMapper Profiles #### 2.6. Create AutoMapper Profiles
**Location**: `src/DigitalData.EmailProfiler.Application/Common/Mappings/` **Location**: `src/DigitalData.MessagingService.Application/Common/Mappings/`
**MappingProfile.cs**: **MappingProfile.cs**:
```csharp ```csharp
using AutoMapper; using AutoMapper;
using DigitalData.EmailProfiler.Domain.Entities; using DigitalData.MessagingService.Domain.Entities;
using DigitalData.EmailProfiler.Application.Common.Dtos; using DigitalData.MessagingService.Application.Common.Dtos;
namespace DigitalData.EmailProfiler.Application.Common.Mappings; namespace DigitalData.MessagingService.Application.Common.Mappings;
public class MappingProfile : Profile public class MappingProfile : Profile
{ {
@@ -312,14 +312,14 @@ public class MappingProfile : Profile
#### 2.7. Create DependencyInjection.cs #### 2.7. Create DependencyInjection.cs
**Location**: `src/DigitalData.EmailProfiler.Application/DependencyInjection.cs` **Location**: `src/DigitalData.MessagingService.Application/DependencyInjection.cs`
```csharp ```csharp
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using FluentValidation; using FluentValidation;
using System.Reflection; using System.Reflection;
namespace DigitalData.EmailProfiler.Application; namespace DigitalData.MessagingService.Application;
public static class DependencyInjection public static class DependencyInjection
{ {
@@ -348,7 +348,7 @@ public static class DependencyInjection
#### 3.1. Add NuGet Packages #### 3.1. Add NuGet Packages
```bash ```bash
cd src/DigitalData.EmailProfiler.Infrastructure cd src/DigitalData.MessagingService.Infrastructure
dotnet add package Microsoft.EntityFrameworkCore.SqlServer dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools dotnet add package Microsoft.EntityFrameworkCore.Tools
dotnet add package MailKit dotnet add package MailKit
@@ -360,18 +360,18 @@ dotnet add package Microsoft.AspNetCore.DataProtection
#### 3.2. Create DbContext #### 3.2. Create DbContext
**Location**: `src/DigitalData.EmailProfiler.Infrastructure/Persistence/EmailProfilerDbContext.cs` **Location**: `src/DigitalData.MessagingService.Infrastructure/Persistence/MessagingServiceDbContext.cs`
```csharp ```csharp
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using DigitalData.EmailProfiler.Domain.Entities; using DigitalData.MessagingService.Domain.Entities;
using System.Reflection; using System.Reflection;
namespace DigitalData.EmailProfiler.Infrastructure.Persistence; namespace DigitalData.MessagingService.Infrastructure.Persistence;
public class EmailProfilerDbContext : DbContext public class MessagingServiceDbContext : DbContext
{ {
public EmailProfilerDbContext(DbContextOptions<EmailProfilerDbContext> options) : base(options) { } public MessagingServiceDbContext(DbContextOptions<MessagingServiceDbContext> options) : base(options) { }
public DbSet<EmailAccount> EmailAccounts { get; set; } public DbSet<EmailAccount> EmailAccounts { get; set; }
public DbSet<EmailProfile> EmailProfiles { get; set; } public DbSet<EmailProfile> EmailProfiles { get; set; }
@@ -420,21 +420,21 @@ public class EmailProfilerDbContext : DbContext
#### 3.3. Create Repositories #### 3.3. Create Repositories
**Location**: `src/DigitalData.EmailProfiler.Infrastructure/Persistence/Repositories/` **Location**: `src/DigitalData.MessagingService.Infrastructure/Persistence/Repositories/`
**EmailProfileRepository.cs**: **EmailProfileRepository.cs**:
```csharp ```csharp
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using DigitalData.EmailProfiler.Domain.Entities; using DigitalData.MessagingService.Domain.Entities;
using DigitalData.EmailProfiler.Application.Interfaces.Repositories; using DigitalData.MessagingService.Application.Interfaces.Repositories;
namespace DigitalData.EmailProfiler.Infrastructure.Persistence.Repositories; namespace DigitalData.MessagingService.Infrastructure.Persistence.Repositories;
public class EmailProfileRepository : IEmailProfileRepository public class EmailProfileRepository : IEmailProfileRepository
{ {
private readonly EmailProfilerDbContext _context; private readonly MessagingServiceDbContext _context;
public EmailProfileRepository(EmailProfilerDbContext context) public EmailProfileRepository(MessagingServiceDbContext context)
{ {
_context = context; _context = context;
} }
@@ -516,17 +516,17 @@ Create similar repositories for **EmailAccountRepository**, **EmailHistoryReposi
#### 3.5. Create DependencyInjection.cs #### 3.5. Create DependencyInjection.cs
**Location**: `src/DigitalData.EmailProfiler.Infrastructure/DependencyInjection.cs` **Location**: `src/DigitalData.MessagingService.Infrastructure/DependencyInjection.cs`
```csharp ```csharp
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using DigitalData.EmailProfiler.Infrastructure.Persistence; using DigitalData.MessagingService.Infrastructure.Persistence;
using DigitalData.EmailProfiler.Application.Interfaces.Repositories; using DigitalData.MessagingService.Application.Interfaces.Repositories;
using DigitalData.EmailProfiler.Infrastructure.Persistence.Repositories; using DigitalData.MessagingService.Infrastructure.Persistence.Repositories;
namespace DigitalData.EmailProfiler.Infrastructure; namespace DigitalData.MessagingService.Infrastructure;
public static class DependencyInjection public static class DependencyInjection
{ {
@@ -535,7 +535,7 @@ public static class DependencyInjection
IConfiguration configuration) IConfiguration configuration)
{ {
// DbContext // DbContext
services.AddDbContext<EmailProfilerDbContext>(options => services.AddDbContext<MessagingServiceDbContext>(options =>
options.UseSqlServer( options.UseSqlServer(
configuration.GetConnectionString("DefaultConnection"), configuration.GetConnectionString("DefaultConnection"),
sqlOptions => sqlOptions =>
@@ -572,7 +572,7 @@ public static class DependencyInjection
#### 4.1. Add NuGet Packages #### 4.1. Add NuGet Packages
```bash ```bash
cd src/DigitalData.EmailProfiler.API cd src/DigitalData.MessagingService.API
dotnet add package Serilog.AspNetCore dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Sinks.File dotnet add package Serilog.Sinks.File
dotnet add package Serilog.Sinks.MSSqlServer dotnet add package Serilog.Sinks.MSSqlServer
@@ -581,12 +581,12 @@ dotnet add package Scalar.AspNetCore
#### 4.2. Update Program.cs #### 4.2. Update Program.cs
**Location**: `src/DigitalData.EmailProfiler.API/Program.cs` **Location**: `src/DigitalData.MessagingService.API/Program.cs`
```csharp ```csharp
using DigitalData.EmailProfiler.API; using DigitalData.MessagingService.API;
using DigitalData.EmailProfiler.Application; using DigitalData.MessagingService.Application;
using DigitalData.EmailProfiler.Infrastructure; using DigitalData.MessagingService.Infrastructure;
using Serilog; using Serilog;
using Scalar.AspNetCore; using Scalar.AspNetCore;
@@ -639,7 +639,7 @@ app.MapControllers();
try try
{ {
Log.Information("Starting EmailProfiler API"); Log.Information("Starting MessagingService API");
app.Run(); app.Run();
} }
catch (Exception ex) catch (Exception ex)
@@ -654,16 +654,16 @@ finally
#### 4.3. Create Controllers #### 4.3. Create Controllers
**Location**: `src/DigitalData.EmailProfiler.API/Controllers/` **Location**: `src/DigitalData.MessagingService.API/Controllers/`
**EmailProfilesController.cs**: **EmailProfilesController.cs**:
```csharp ```csharp
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using MediatR; using MediatR;
using DigitalData.EmailProfiler.Application.EmailProfiles.Commands; using DigitalData.MessagingService.Application.EmailProfiles.Commands;
using DigitalData.EmailProfiler.Application.EmailProfiles.Queries; using DigitalData.MessagingService.Application.EmailProfiles.Queries;
namespace DigitalData.EmailProfiler.API.Controllers; namespace DigitalData.MessagingService.API.Controllers;
[ApiController] [ApiController]
[Route("api/[controller]")] [Route("api/[controller]")]
@@ -713,13 +713,13 @@ Create similar controllers for **EmailAccountsController**, **EmailHistoryContro
#### 4.4. Create Background Workers #### 4.4. Create Background Workers
**Location**: `src/DigitalData.EmailProfiler.API/Workers/` **Location**: `src/DigitalData.MessagingService.API/Workers/`
**EmailPollingWorker.cs** and **EmailSenderWorker.cs** (See agents.md for implementation examples) **EmailPollingWorker.cs** and **EmailSenderWorker.cs** (See agents.md for implementation examples)
#### 4.5. Update appsettings.json #### 4.5. Update appsettings.json
**Location**: `src/DigitalData.EmailProfiler.API/appsettings.json` **Location**: `src/DigitalData.MessagingService.API/appsettings.json`
```json ```json
{ {
@@ -758,7 +758,7 @@ Create similar controllers for **EmailAccountsController**, **EmailHistoryContro
#### 5.1. Add NuGet Packages #### 5.1. Add NuGet Packages
```bash ```bash
cd tests/DigitalData.EmailProfiler.Tests cd tests/DigitalData.MessagingService.Tests
dotnet add package FakeItEasy dotnet add package FakeItEasy
dotnet add package Bogus dotnet add package Bogus
dotnet add package FluentAssertions dotnet add package FluentAssertions
@@ -768,15 +768,15 @@ dotnet add package Testcontainers.MsSql
#### 5.2. Create Unit Tests #### 5.2. Create Unit Tests
**Location**: `tests/DigitalData.EmailProfiler.Tests/Unit/Domain/` **Location**: `tests/DigitalData.MessagingService.Tests/Unit/Domain/`
**MessageIdGeneratorTests.cs**: **MessageIdGeneratorTests.cs**:
```csharp ```csharp
using Xunit; using Xunit;
using FluentAssertions; using FluentAssertions;
using DigitalData.EmailProfiler.Domain.Services; using DigitalData.MessagingService.Domain.Services;
namespace DigitalData.EmailProfiler.Tests.Unit.Domain; namespace DigitalData.MessagingService.Tests.Unit.Domain;
public class MessageIdGeneratorTests public class MessageIdGeneratorTests
{ {
@@ -844,7 +844,7 @@ The README should include (in German):
**Template structure**: **Template structure**:
```markdown ```markdown
# DigitalData EmailProfiler # DigitalData MessagingService
## Übersicht ## Übersicht
[Application overview in German] [Application overview in German]
@@ -912,15 +912,15 @@ dotnet build
dotnet test dotnet test
# Run API # Run API
cd src/DigitalData.EmailProfiler.API cd src/DigitalData.MessagingService.API
dotnet run dotnet run
# Create migration # Create migration
cd src/DigitalData.EmailProfiler.Infrastructure cd src/DigitalData.MessagingService.Infrastructure
dotnet ef migrations add InitialCreate --startup-project ../DigitalData.EmailProfiler.API dotnet ef migrations add InitialCreate --startup-project ../DigitalData.MessagingService.API
# Update database # Update database
dotnet ef database update --startup-project ../DigitalData.EmailProfiler.API dotnet ef database update --startup-project ../DigitalData.MessagingService.API
``` ```
--- ---

View File

@@ -1,2 +1,2 @@
# DigitalData.EmailProfiler # DigitalData.MessagingService

View File

@@ -1,4 +1,4 @@
# EmailProfiler - Implementation Status Report # MessagingService - Implementation Status Report
**Last Updated**: 2026-07-20 **Last Updated**: 2026-07-20
**Overall Progress**: 75% Complete (3 of 4 phases done) **Overall Progress**: 75% Complete (3 of 4 phases done)
@@ -7,7 +7,7 @@
## Executive Summary ## Executive Summary
The EmailProfiler migration from legacy VB.NET to modern C# .NET 8.0 Clean Architecture is **75% complete**. All core layers (Domain, Application, Infrastructure) are fully implemented with real service stubs ready for integration. Only API layer controllers and workers remain. The MessagingService migration from legacy VB.NET to modern C# .NET 8.0 Clean Architecture is **75% complete**. All core layers (Domain, Application, Infrastructure) are fully implemented with real service stubs ready for integration. Only API layer controllers and workers remain.
### ✅ What's Working ### ✅ What's Working
- Complete Domain model with 8 entities mapped to legacy database - Complete Domain model with 8 entities mapped to legacy database
@@ -68,7 +68,7 @@ The EmailProfiler migration from legacy VB.NET to modern C# .NET 8.0 Clean Archi
**Files**: **Files**:
``` ```
src/DigitalData.EmailProfiler.Domain/ src/DigitalData.MessagingService.Domain/
├── Entities/ (8 files) ├── Entities/ (8 files)
├── ValueObjects/ (3 files) ├── ValueObjects/ (3 files)
├── Enums/ (5 files) ├── Enums/ (5 files)
@@ -135,7 +135,7 @@ src/DigitalData.EmailProfiler.Domain/
**Files**: **Files**:
``` ```
src/DigitalData.EmailProfiler.Application/ src/DigitalData.MessagingService.Application/
├── EmailProfiles/Commands/ (3 files) ├── EmailProfiles/Commands/ (3 files)
├── EmailProfiles/Queries/ (2 files) ├── EmailProfiles/Queries/ (2 files)
├── EmailProfiles/Validators/ (2 files) ├── EmailProfiles/Validators/ (2 files)
@@ -158,7 +158,7 @@ src/DigitalData.EmailProfiler.Application/
### Phase 3: Infrastructure Layer ✅ COMPLETE (100%) ### Phase 3: Infrastructure Layer ✅ COMPLETE (100%)
**Database**: **Database**:
-`EmailProfilerDbContext` - EF Core DbContext with 8 DbSets -`MessagingServiceDbContext` - EF Core DbContext with 8 DbSets
- NO `OnModelCreating` override (attribute-only configuration) - NO `OnModelCreating` override (attribute-only configuration)
- NO `SaveChangesAsync` override (Repository handles this) - NO `SaveChangesAsync` override (Repository handles this)
- Connection string: `DefaultConnection` from appsettings - Connection string: `DefaultConnection` from appsettings
@@ -231,8 +231,8 @@ src/DigitalData.EmailProfiler.Application/
**Files**: **Files**:
``` ```
src/DigitalData.EmailProfiler.Infrastructure/ src/DigitalData.MessagingService.Infrastructure/
├── Persistence/EmailProfilerDbContext.cs ├── Persistence/MessagingServiceDbContext.cs
├── Repositories/Repository.cs ├── Repositories/Repository.cs
├── Services/ (6 files) ├── Services/ (6 files)
├── Messaging/ (3 files) ├── Messaging/ (3 files)
@@ -290,7 +290,7 @@ src/DigitalData.EmailProfiler.Infrastructure/
**Files**: **Files**:
``` ```
src/DigitalData.EmailProfiler.API/ src/DigitalData.MessagingService.API/
├── Controllers/ (3 files) ├── Controllers/ (3 files)
├── appsettings.json ├── appsettings.json
├── appsettings.Secrets.json ├── appsettings.Secrets.json
@@ -311,7 +311,7 @@ src/DigitalData.EmailProfiler.API/
**Test Structure**: **Test Structure**:
``` ```
tests/DigitalData.EmailProfiler.Tests/ tests/DigitalData.MessagingService.Tests/
├── Domain/ ├── Domain/
│ ├── Services/MessageIdGeneratorTests.cs │ ├── Services/MessageIdGeneratorTests.cs
│ ├── ValueObjects/EmailAddressTests.cs │ ├── ValueObjects/EmailAddressTests.cs
@@ -362,7 +362,7 @@ tests/DigitalData.EmailProfiler.Tests/
### 5. SQL Server Database ✅ AVAILABLE ### 5. SQL Server Database ✅ AVAILABLE
**Status**: Legacy database exists **Status**: Legacy database exists
**Action**: Update connection string in `appsettings.Secrets.json` **Action**: Update connection string in `appsettings.Secrets.json`
**Files Affected**: `EmailProfilerDbContext.cs` **Files Affected**: `MessagingServiceDbContext.cs`
--- ---
@@ -380,7 +380,7 @@ tests/DigitalData.EmailProfiler.Tests/
**Build Command**: **Build Command**:
```bash ```bash
dotnet build src/DigitalData.EmailProfiler.Infrastructure/DigitalData.EmailProfiler.Infrastructure.csproj dotnet build src/DigitalData.MessagingService.Infrastructure/DigitalData.MessagingService.Infrastructure.csproj
``` ```
--- ---
@@ -472,10 +472,10 @@ dotnet build src/DigitalData.EmailProfiler.Infrastructure/DigitalData.EmailProfi
**What You Can Do Right Now**: **What You Can Do Right Now**:
1. Build the solution: `dotnet build` 1. Build the solution: `dotnet build`
2. Review the Domain layer: `src/DigitalData.EmailProfiler.Domain/` 2. Review the Domain layer: `src/DigitalData.MessagingService.Domain/`
3. Review the Application layer: `src/DigitalData.EmailProfiler.Application/` 3. Review the Application layer: `src/DigitalData.MessagingService.Application/`
4. Review the Infrastructure layer: `src/DigitalData.EmailProfiler.Infrastructure/` 4. Review the Infrastructure layer: `src/DigitalData.MessagingService.Infrastructure/`
5. Review the API layer: `src/DigitalData.EmailProfiler.API/` 5. Review the API layer: `src/DigitalData.MessagingService.API/`
**What You Need to Complete**: **What You Need to Complete**:
1. Add Limilabs.Mail NuGet package: `dotnet add package Limilabs.Mail` 1. Add Limilabs.Mail NuGet package: `dotnet add package Limilabs.Mail`

View File

@@ -1,11 +0,0 @@
using Microsoft.EntityFrameworkCore;
namespace DigitalData.EmailProfiler.Infrastructure.Persistence;
/// <summary>
/// Entity Framework Core DbContext for EmailProfiler.
/// IMPORTANT: This context maps to a LEGACY database - NO schema modifications allowed!
/// </summary>
public class EmailProfilerDbContext(DbContextOptions<EmailProfilerDbContext> options) : DbContext(options)
{
}

View File

@@ -1,8 +1,8 @@
using DigitalData.EmailProfiler.Application.EmailSending.Commands; using DigitalData.MessagingService.Application.EmailSending.Commands;
using MediatR; using MediatR;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace DigitalData.EmailProfiler.API.Controllers; namespace DigitalData.MessagingService.API.Controllers;
/// <summary> /// <summary>
/// Email sending API controller /// Email sending API controller

View File

@@ -4,7 +4,7 @@
<TargetFramework>net8.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<UserSecretsId>dotnet-DigitalData.EmailProfiler.Service-e7ef6a9a-436f-48a1-b4f6-ec9381c8cb47</UserSecretsId> <UserSecretsId>dotnet-DigitalData.MessagingService.Service-e7ef6a9a-436f-48a1-b4f6-ec9381c8cb47</UserSecretsId>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@@ -21,9 +21,9 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\DigitalData.EmailProfiler.Application\DigitalData.EmailProfiler.Application.csproj" /> <ProjectReference Include="..\DigitalData.MessagingService.Application\DigitalData.MessagingService.Application.csproj" />
<ProjectReference Include="..\DigitalData.EmailProfiler.Domain\DigitalData.EmailProfiler.Domain.csproj" /> <ProjectReference Include="..\DigitalData.MessagingService.Domain\DigitalData.MessagingService.Domain.csproj" />
<ProjectReference Include="..\DigitalData.EmailProfiler.Infrastructure\DigitalData.EmailProfiler.Infrastructure.csproj" /> <ProjectReference Include="..\DigitalData.MessagingService.Infrastructure\DigitalData.MessagingService.Infrastructure.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -1,8 +1,8 @@
using System.Net; using System.Net;
using System.Text.Json; using System.Text.Json;
using DigitalData.EmailProfiler.Domain.Exceptions; using DigitalData.MessagingService.Domain.Exceptions;
namespace DigitalData.EmailProfiler.API.Middleware; namespace DigitalData.MessagingService.API.Middleware;
/// <summary> /// <summary>
/// Global exception handling middleware /// Global exception handling middleware

View File

@@ -1,7 +1,7 @@
using DigitalData.EmailProfiler.API.Middleware; using DigitalData.MessagingService.API.Middleware;
using DigitalData.EmailProfiler.Application; using DigitalData.MessagingService.Application;
using DigitalData.EmailProfiler.Application.Common.Dtos; using DigitalData.MessagingService.Application.Common.Dtos;
using DigitalData.EmailProfiler.Infrastructure; using DigitalData.MessagingService.Infrastructure;
using Serilog; using Serilog;
// Configure Serilog early // Configure Serilog early
@@ -16,7 +16,7 @@ Log.Logger = new LoggerConfiguration()
try try
{ {
Log.Information("Starting EmailProfiler API"); Log.Information("Starting MessagingService API");
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
@@ -71,13 +71,13 @@ try
app.MapControllers(); app.MapControllers();
Log.Information("EmailProfiler API started successfully"); Log.Information("MessagingService API started successfully");
app.Run(); app.Run();
} }
catch (Exception ex) catch (Exception ex)
{ {
Log.Fatal(ex, "EmailProfiler API failed to start"); Log.Fatal(ex, "MessagingService API failed to start");
throw; throw;
} }
finally finally

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Application.Common.Dtos; namespace DigitalData.MessagingService.Application.Common.Dtos;
/// <summary> /// <summary>
/// DTO for EmailAccount query results. /// DTO for EmailAccount query results.

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Application.Common.Events; namespace DigitalData.MessagingService.Application.Common.Events;
public class OutgoingEmailEvent public class OutgoingEmailEvent
{ {

View File

@@ -1,6 +1,6 @@
using MediatR; using MediatR;
namespace DigitalData.EmailProfiler.Application.Common.Interfaces; namespace DigitalData.MessagingService.Application.Common.Interfaces;
/// <summary> /// <summary>
/// Interface for publishing commands to a message broker (e.g., RabbitMQ) /// Interface for publishing commands to a message broker (e.g., RabbitMQ)

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Application.Common.Interfaces; namespace DigitalData.MessagingService.Application.Common.Interfaces;
/// <summary> /// <summary>
/// Email service interface for SMTP operations. /// Email service interface for SMTP operations.

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Application.Common.Interfaces; namespace DigitalData.MessagingService.Application.Common.Interfaces;
/// <summary> /// <summary>
/// Encryption service interface for password encryption. /// Encryption service interface for password encryption.

View File

@@ -1,7 +1,7 @@
using DigitalData.EmailProfiler.Application.Common.Events; using DigitalData.MessagingService.Application.Common.Events;
using DigitalData.EmailProfiler.Application.EmailSending.Commands; using DigitalData.MessagingService.Application.EmailSending.Commands;
namespace DigitalData.EmailProfiler.Application.Common.Interfaces; namespace DigitalData.MessagingService.Application.Common.Interfaces;
/// <summary> /// <summary>
/// Email queue interface for outgoing emails. /// Email queue interface for outgoing emails.

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Application.Common.Interfaces; namespace DigitalData.MessagingService.Application.Common.Interfaces;
/// <summary> /// <summary>
/// PDF processing service interface. /// PDF processing service interface.

View File

@@ -1,6 +1,6 @@
using System.Linq.Expressions; using System.Linq.Expressions;
namespace DigitalData.EmailProfiler.Application.Common.Interfaces; namespace DigitalData.MessagingService.Application.Common.Interfaces;
/// <summary> /// <summary>
/// Generic repository interface for CRUD operations. /// Generic repository interface for CRUD operations.

View File

@@ -1,8 +1,8 @@
using AutoMapper; using AutoMapper;
using DigitalData.EmailProfiler.Application.Common.Events; using DigitalData.MessagingService.Application.Common.Events;
using DigitalData.EmailProfiler.Application.EmailSending.Commands; using DigitalData.MessagingService.Application.EmailSending.Commands;
namespace DigitalData.EmailProfiler.Application.Common.Mappings; namespace DigitalData.MessagingService.Application.Common.Mappings;
/// <summary> /// <summary>
/// AutoMapper profile for Emails /// AutoMapper profile for Emails

View File

@@ -3,7 +3,7 @@ using FluentValidation;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace DigitalData.EmailProfiler.Application; namespace DigitalData.MessagingService.Application;
/// <summary> /// <summary>
/// Dependency injection configuration for Application layer. /// Dependency injection configuration for Application layer.

View File

@@ -7,7 +7,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\DigitalData.EmailProfiler.Domain\DigitalData.EmailProfiler.Domain.csproj" /> <ProjectReference Include="..\DigitalData.MessagingService.Domain\DigitalData.MessagingService.Domain.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -1,9 +1,9 @@
using AutoMapper; using AutoMapper;
using DigitalData.EmailProfiler.Application.Common.Events; using DigitalData.MessagingService.Application.Common.Events;
using DigitalData.EmailProfiler.Application.Common.Interfaces; using DigitalData.MessagingService.Application.Common.Interfaces;
using MediatR; using MediatR;
namespace DigitalData.EmailProfiler.Application.EmailSending.Commands; namespace DigitalData.MessagingService.Application.EmailSending.Commands;
/// <summary> /// <summary>
/// Command to send an email (enqueue to RabbitMQ) /// Command to send an email (enqueue to RabbitMQ)

View File

@@ -1,7 +1,7 @@
using DigitalData.EmailProfiler.Application.EmailSending.Commands; using DigitalData.MessagingService.Application.EmailSending.Commands;
using FluentValidation; using FluentValidation;
namespace DigitalData.EmailProfiler.Application.EmailSending.Validators; namespace DigitalData.MessagingService.Application.EmailSending.Validators;
/// <summary> /// <summary>
/// Validator for SendEmailCommand /// Validator for SendEmailCommand

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Domain.Common; namespace DigitalData.MessagingService.Domain.Common;
public abstract class BaseEntity public abstract class BaseEntity
{ {

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Domain.Common; namespace DigitalData.MessagingService.Domain.Common;
/// <summary> /// <summary>
/// Domain-wide constants /// Domain-wide constants

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Domain.Common; namespace DigitalData.MessagingService.Domain.Common;
/// <summary> /// <summary>
/// Marker interface for aggregate roots in DDD /// Marker interface for aggregate roots in DDD

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Domain.Common; namespace DigitalData.MessagingService.Domain.Common;
/// <summary> /// <summary>
/// Base class for value objects that implement equality by value /// Base class for value objects that implement equality by value

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Domain.Enums; namespace DigitalData.MessagingService.Domain.Enums;
public enum AttachmentStatus public enum AttachmentStatus
{ {

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Domain.Enums; namespace DigitalData.MessagingService.Domain.Enums;
public enum AuthenticationType public enum AuthenticationType
{ {

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Domain.Enums; namespace DigitalData.MessagingService.Domain.Enums;
public enum EmailStatus public enum EmailStatus
{ {

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Domain.Enums; namespace DigitalData.MessagingService.Domain.Enums;
public enum ErrorCode public enum ErrorCode
{ {

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Domain.Enums; namespace DigitalData.MessagingService.Domain.Enums;
public enum ProcessType public enum ProcessType
{ {

View File

@@ -1,6 +1,6 @@
using DigitalData.EmailProfiler.Domain.Enums; using DigitalData.MessagingService.Domain.Enums;
namespace DigitalData.EmailProfiler.Domain.Exceptions; namespace DigitalData.MessagingService.Domain.Exceptions;
public class AttachmentProcessingException : DomainException public class AttachmentProcessingException : DomainException
{ {

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Domain.Exceptions; namespace DigitalData.MessagingService.Domain.Exceptions;
/// <summary> /// <summary>
/// Exception thrown when OAuth2 authentication fails. /// Exception thrown when OAuth2 authentication fails.

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Domain.Exceptions; namespace DigitalData.MessagingService.Domain.Exceptions;
/// <summary> /// <summary>
/// Exception thrown when DMS (windream) is not available or not configured properly. /// Exception thrown when DMS (windream) is not available or not configured properly.

View File

@@ -1,6 +1,6 @@
using DigitalData.EmailProfiler.Domain.Enums; using DigitalData.MessagingService.Domain.Enums;
namespace DigitalData.EmailProfiler.Domain.Exceptions; namespace DigitalData.MessagingService.Domain.Exceptions;
public class DomainException : Exception public class DomainException : Exception
{ {

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Domain.Exceptions; namespace DigitalData.MessagingService.Domain.Exceptions;
/// <summary> /// <summary>
/// Exception thrown when a PDF file is invalid or corrupted. /// Exception thrown when a PDF file is invalid or corrupted.

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Domain.Exceptions; namespace DigitalData.MessagingService.Domain.Exceptions;
/// <summary> /// <summary>
/// Exception thrown when a requested entity is not found. /// Exception thrown when a requested entity is not found.

View File

@@ -1,6 +1,6 @@
using DigitalData.EmailProfiler.Domain.Enums; using DigitalData.MessagingService.Domain.Enums;
namespace DigitalData.EmailProfiler.Domain.Exceptions; namespace DigitalData.MessagingService.Domain.Exceptions;
public class ValidationException : DomainException public class ValidationException : DomainException
{ {

View File

@@ -1,6 +1,6 @@
using DigitalData.EmailProfiler.Domain.ValueObjects; using DigitalData.MessagingService.Domain.ValueObjects;
namespace DigitalData.EmailProfiler.Domain.Services; namespace DigitalData.MessagingService.Domain.Services;
public interface IMessageIdGenerator public interface IMessageIdGenerator
{ {

View File

@@ -1,8 +1,8 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using DigitalData.EmailProfiler.Domain.Common; using DigitalData.MessagingService.Domain.Common;
using DigitalData.EmailProfiler.Domain.Exceptions; using DigitalData.MessagingService.Domain.Exceptions;
namespace DigitalData.EmailProfiler.Domain.ValueObjects; namespace DigitalData.MessagingService.Domain.ValueObjects;
/// <summary> /// <summary>
/// Value object representing an email address with validation /// Value object representing an email address with validation

View File

@@ -1,8 +1,8 @@
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text; using System.Text;
using DigitalData.EmailProfiler.Domain.Common; using DigitalData.MessagingService.Domain.Common;
namespace DigitalData.EmailProfiler.Domain.ValueObjects; namespace DigitalData.MessagingService.Domain.ValueObjects;
/// <summary> /// <summary>
/// Value object representing a unique message identifier with hash generation /// Value object representing a unique message identifier with hash generation

View File

@@ -1,13 +1,13 @@
using DigitalData.EmailProfiler.Application.Common.Interfaces; using DigitalData.MessagingService.Application.Common.Interfaces;
using DigitalData.EmailProfiler.Infrastructure.Messaging; using DigitalData.MessagingService.Infrastructure.Messaging;
using DigitalData.EmailProfiler.Infrastructure.Queue; using DigitalData.MessagingService.Infrastructure.Queue;
using DigitalData.EmailProfiler.Infrastructure.Services; using DigitalData.MessagingService.Infrastructure.Services;
using DigitalData.EmailProfiler.Infrastructure.Services.Background; using DigitalData.MessagingService.Infrastructure.Services.Background;
using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.DataProtection;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace DigitalData.EmailProfiler.Infrastructure; namespace DigitalData.MessagingService.Infrastructure;
/// <summary> /// <summary>
/// Dependency injection configuration for Infrastructure layer /// Dependency injection configuration for Infrastructure layer
@@ -41,7 +41,7 @@ public static class DependencyInjection
// --- Data Protection (for encryption) --- // --- Data Protection (for encryption) ---
services.AddDataProtection() services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"C:\ProgramData\EmailService\Keys")) .PersistKeysToFileSystem(new DirectoryInfo(@"C:\ProgramData\EmailService\Keys"))
.SetApplicationName("EmailProfiler"); .SetApplicationName("MessagingService");
// Register Background Workers // Register Background Workers
services.AddHostedService<AsyncInitWorker>(); services.AddHostedService<AsyncInitWorker>();

View File

@@ -7,8 +7,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\DigitalData.EmailProfiler.Domain\DigitalData.EmailProfiler.Domain.csproj" /> <ProjectReference Include="..\DigitalData.MessagingService.Domain\DigitalData.MessagingService.Domain.csproj" />
<ProjectReference Include="..\DigitalData.EmailProfiler.Application\DigitalData.EmailProfiler.Application.csproj" /> <ProjectReference Include="..\DigitalData.MessagingService.Application\DigitalData.MessagingService.Application.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Infrastructure.Messaging; namespace DigitalData.MessagingService.Infrastructure.Messaging;
/// <summary> /// <summary>
/// Configuration for RabbitMQ connection /// Configuration for RabbitMQ connection

View File

@@ -0,0 +1,11 @@
using Microsoft.EntityFrameworkCore;
namespace DigitalData.MessagingService.Infrastructure.Persistence;
/// <summary>
/// Entity Framework Core DbContext for MessagingService.
/// IMPORTANT: This context maps to a LEGACY database - NO schema modifications allowed!
/// </summary>
public class MessagingServiceDbContext(DbContextOptions<MessagingServiceDbContext> options) : DbContext(options)
{
}

View File

@@ -1,14 +1,14 @@
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
using DigitalData.EmailProfiler.Application.Common.Interfaces; using DigitalData.MessagingService.Application.Common.Interfaces;
using DigitalData.EmailProfiler.Infrastructure.Messaging; using DigitalData.MessagingService.Infrastructure.Messaging;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using RabbitMQ.Client; using RabbitMQ.Client;
using RabbitMQ.Client.Events; using RabbitMQ.Client.Events;
using DigitalData.EmailProfiler.Application.Common.Events; using DigitalData.MessagingService.Application.Common.Events;
namespace DigitalData.EmailProfiler.Infrastructure.Queue; namespace DigitalData.MessagingService.Infrastructure.Queue;
/// <summary> /// <summary>
/// RabbitMQ-based email queue implementation for outgoing emails. /// RabbitMQ-based email queue implementation for outgoing emails.

View File

@@ -1,17 +1,17 @@
using System.Linq.Expressions; using System.Linq.Expressions;
using AutoMapper; using AutoMapper;
using DigitalData.EmailProfiler.Application.Common.Interfaces; using DigitalData.MessagingService.Application.Common.Interfaces;
using DigitalData.EmailProfiler.Domain.Exceptions; using DigitalData.MessagingService.Domain.Exceptions;
using DigitalData.EmailProfiler.Infrastructure.Persistence; using DigitalData.MessagingService.Infrastructure.Persistence;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace DigitalData.EmailProfiler.Infrastructure.Repositories; namespace DigitalData.MessagingService.Infrastructure.Repositories;
/// <summary> /// <summary>
/// Generic repository implementation with AutoMapper-based CRUD operations. /// Generic repository implementation with AutoMapper-based CRUD operations.
/// IMPORTANT: Each operation auto-saves changes - NO explicit SaveChangesAsync needed! /// IMPORTANT: Each operation auto-saves changes - NO explicit SaveChangesAsync needed!
/// </summary> /// </summary>
public class Repository<TEntity>(EmailProfilerDbContext Context, IMapper Mapper) : IRepository<TEntity> where TEntity : class public class Repository<TEntity>(MessagingServiceDbContext Context, IMapper Mapper) : IRepository<TEntity> where TEntity : class
{ {
private readonly DbSet<TEntity> _dbSet = Context.Set<TEntity>(); private readonly DbSet<TEntity> _dbSet = Context.Set<TEntity>();

View File

@@ -1,9 +1,9 @@
using DigitalData.EmailProfiler.Application.Common.Interfaces; using DigitalData.MessagingService.Application.Common.Interfaces;
using DigitalData.EmailProfiler.Infrastructure.Queue; using DigitalData.MessagingService.Infrastructure.Queue;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace DigitalData.EmailProfiler.Infrastructure.Services.Background; namespace DigitalData.MessagingService.Infrastructure.Services.Background;
/// <summary> /// <summary>
/// A hosted background service responsible for initializing the outgoing email queue consumer. /// A hosted background service responsible for initializing the outgoing email queue consumer.

View File

@@ -1,7 +1,7 @@
using DigitalData.EmailProfiler.Application.Common.Interfaces; using DigitalData.MessagingService.Application.Common.Interfaces;
using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.DataProtection;
namespace DigitalData.EmailProfiler.Infrastructure.Services; namespace DigitalData.MessagingService.Infrastructure.Services;
/// <summary> /// <summary>
/// Encryption service using ASP.NET Core Data Protection API. /// Encryption service using ASP.NET Core Data Protection API.
@@ -9,7 +9,7 @@ namespace DigitalData.EmailProfiler.Infrastructure.Services;
/// </summary> /// </summary>
public class DataProtectionEncryptionService(IDataProtectionProvider Provider) : IEncryptionService public class DataProtectionEncryptionService(IDataProtectionProvider Provider) : IEncryptionService
{ {
private readonly IDataProtector Protector = Provider.CreateProtector("EmailProfiler.Passwords"); private readonly IDataProtector Protector = Provider.CreateProtector("MessagingService.Passwords");
public string Encrypt(string plainText) public string Encrypt(string plainText)
{ {

View File

@@ -1,8 +1,8 @@
using DevExpress.Pdf; using DevExpress.Pdf;
using DigitalData.EmailProfiler.Application.Common.Interfaces; using DigitalData.MessagingService.Application.Common.Interfaces;
using DigitalData.EmailProfiler.Domain.Exceptions; using DigitalData.MessagingService.Domain.Exceptions;
namespace DigitalData.EmailProfiler.Infrastructure.Services; namespace DigitalData.MessagingService.Infrastructure.Services;
/// <summary> /// <summary>
/// PDF processing service using DevExpress.Pdf. /// PDF processing service using DevExpress.Pdf.

View File

@@ -1,13 +1,13 @@
using System.Text; using System.Text;
using DigitalData.EmailProfiler.Application.Common.Dtos; using DigitalData.MessagingService.Application.Common.Dtos;
using DigitalData.EmailProfiler.Application.Common.Interfaces; using DigitalData.MessagingService.Application.Common.Interfaces;
using DigitalData.EmailProfiler.Domain.Exceptions; using DigitalData.MessagingService.Domain.Exceptions;
using Limilabs.Client.SMTP; using Limilabs.Client.SMTP;
using Limilabs.Mail; using Limilabs.Mail;
using Limilabs.Mail.Headers; using Limilabs.Mail.Headers;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
namespace DigitalData.EmailProfiler.Infrastructure.Services; namespace DigitalData.MessagingService.Infrastructure.Services;
/// <summary> /// <summary>
/// Email service using Limilabs Mail.dll for SMTP operations (send-only). /// Email service using Limilabs Mail.dll for SMTP operations (send-only).

View File

@@ -17,10 +17,10 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\DigitalData.EmailProfiler.API\DigitalData.EmailProfiler.API.csproj" /> <ProjectReference Include="..\..\src\DigitalData.MessagingService.API\DigitalData.MessagingService.API.csproj" />
<ProjectReference Include="..\..\src\DigitalData.EmailProfiler.Application\DigitalData.EmailProfiler.Application.csproj" /> <ProjectReference Include="..\..\src\DigitalData.MessagingService.Application\DigitalData.MessagingService.Application.csproj" />
<ProjectReference Include="..\..\src\DigitalData.EmailProfiler.Domain\DigitalData.EmailProfiler.Domain.csproj" /> <ProjectReference Include="..\..\src\DigitalData.MessagingService.Domain\DigitalData.MessagingService.Domain.csproj" />
<ProjectReference Include="..\..\src\DigitalData.EmailProfiler.Infrastructure\DigitalData.EmailProfiler.Infrastructure.csproj" /> <ProjectReference Include="..\..\src\DigitalData.MessagingService.Infrastructure\DigitalData.MessagingService.Infrastructure.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>