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/tekh_softHSM_test.md
/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
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**:
```csharp
// src/DigitalData.EmailProfiler.Infrastructure/Queue/RabbitMqEmailQueue.cs
// src/DigitalData.MessagingService.Infrastructure/Queue/RabbitMqEmailQueue.cs
public class RabbitMqEmailQueue : IEmailQueue
{
private readonly IConnection _connection;
@@ -412,7 +412,7 @@ return Accepted(); // HTTP 202 - command queued for processing
**Example Command**:
```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 class CreateEmailProfileCommandHandler : IRequestHandler<CreateEmailProfileCommand, int>
@@ -498,7 +498,7 @@ public class LimilabsEmailService : IEmailService
**Status**: ✅ Complete - DbContext, Repository, Services, RabbitMQ, and DI implemented
**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
- ✅ 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)
@@ -517,7 +517,7 @@ public class LimilabsEmailService : IEmailService
**DbContext Example**:
```csharp
public class EmailProfilerDbContext : DbContext
public class MessagingServiceDbContext : DbContext
{
public DbSet<EmailAccount> EmailAccounts { get; set; }
public DbSet<EmailProfile> EmailProfiles { get; set; }
@@ -695,7 +695,7 @@ if (builder.Configuration["Hosting:Mode"] == "WindowsService")
Install as Windows Service:
```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
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}"
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
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
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
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
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
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{4F20FEFD-9289-42C6-ABA6-8DB236D74559}"
EndProject

View File

@@ -1,8 +1,8 @@
# EmailProfiler - Implementation Guide for AI Agents
# MessagingService - Implementation Guide for AI Agents
## 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
```
DigitalData.EmailProfiler/
DigitalData.MessagingService/
├── src/
│ ├── Domain/ ✅ COMPLETE
│ ├── Application/ 🚧 IN PROGRESS (5%)
@@ -56,15 +56,15 @@ DigitalData.EmailProfiler/
#### 2.1. Create Repository Interfaces
**Location**: `src/DigitalData.EmailProfiler.Application/Interfaces/Repositories/`
**Location**: `src/DigitalData.MessagingService.Application/Interfaces/Repositories/`
Create these files:
**IEmailProfileRepository.cs**:
```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
{
@@ -80,9 +80,9 @@ public interface IEmailProfileRepository
**IEmailAccountRepository.cs**:
```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
{
@@ -97,9 +97,9 @@ public interface IEmailAccountRepository
**IEmailHistoryRepository.cs**:
```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
{
@@ -116,11 +116,11 @@ public interface IEmailHistoryRepository
#### 2.2. Create Service Interfaces
**Location**: `src/DigitalData.EmailProfiler.Application/Interfaces/Services/`
**Location**: `src/DigitalData.MessagingService.Application/Interfaces/Services/`
**IEmailService.cs**:
```csharp
namespace DigitalData.EmailProfiler.Application.Interfaces.Services;
namespace DigitalData.MessagingService.Application.Interfaces.Services;
public interface IEmailService
{
@@ -169,13 +169,13 @@ public class EmailAttachmentData
#### 2.3. Create MediatR Commands
**Location**: `src/DigitalData.EmailProfiler.Application/EmailProfiles/Commands/`
**Location**: `src/DigitalData.MessagingService.Application/EmailProfiles/Commands/`
**CreateEmailProfileCommand.cs**:
```csharp
using MediatR;
namespace DigitalData.EmailProfiler.Application.EmailProfiles.Commands;
namespace DigitalData.MessagingService.Application.EmailProfiles.Commands;
public record CreateEmailProfileCommand(
string ProfileName,
@@ -213,15 +213,15 @@ public class CreateEmailProfileCommandHandler : IRequestHandler<CreateEmailProfi
#### 2.4. Create MediatR Queries
**Location**: `src/DigitalData.EmailProfiler.Application/EmailProfiles/Queries/`
**Location**: `src/DigitalData.MessagingService.Application/EmailProfiles/Queries/`
**GetEmailProfilesQuery.cs**:
```csharp
using MediatR;
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>>;
@@ -248,14 +248,14 @@ public class GetEmailProfilesQueryHandler : IRequestHandler<GetEmailProfilesQuer
#### 2.5. Create Validators
**Location**: `src/DigitalData.EmailProfiler.Application/EmailProfiles/Validators/`
**Location**: `src/DigitalData.MessagingService.Application/EmailProfiles/Validators/`
**CreateEmailProfileCommandValidator.cs**:
```csharp
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>
{
@@ -277,15 +277,15 @@ public class CreateEmailProfileCommandValidator : AbstractValidator<CreateEmailP
#### 2.6. Create AutoMapper Profiles
**Location**: `src/DigitalData.EmailProfiler.Application/Common/Mappings/`
**Location**: `src/DigitalData.MessagingService.Application/Common/Mappings/`
**MappingProfile.cs**:
```csharp
using AutoMapper;
using DigitalData.EmailProfiler.Domain.Entities;
using DigitalData.EmailProfiler.Application.Common.Dtos;
using DigitalData.MessagingService.Domain.Entities;
using DigitalData.MessagingService.Application.Common.Dtos;
namespace DigitalData.EmailProfiler.Application.Common.Mappings;
namespace DigitalData.MessagingService.Application.Common.Mappings;
public class MappingProfile : Profile
{
@@ -312,14 +312,14 @@ public class MappingProfile : Profile
#### 2.7. Create DependencyInjection.cs
**Location**: `src/DigitalData.EmailProfiler.Application/DependencyInjection.cs`
**Location**: `src/DigitalData.MessagingService.Application/DependencyInjection.cs`
```csharp
using Microsoft.Extensions.DependencyInjection;
using FluentValidation;
using System.Reflection;
namespace DigitalData.EmailProfiler.Application;
namespace DigitalData.MessagingService.Application;
public static class DependencyInjection
{
@@ -348,7 +348,7 @@ public static class DependencyInjection
#### 3.1. Add NuGet Packages
```bash
cd src/DigitalData.EmailProfiler.Infrastructure
cd src/DigitalData.MessagingService.Infrastructure
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
dotnet add package MailKit
@@ -360,18 +360,18 @@ dotnet add package Microsoft.AspNetCore.DataProtection
#### 3.2. Create DbContext
**Location**: `src/DigitalData.EmailProfiler.Infrastructure/Persistence/EmailProfilerDbContext.cs`
**Location**: `src/DigitalData.MessagingService.Infrastructure/Persistence/MessagingServiceDbContext.cs`
```csharp
using Microsoft.EntityFrameworkCore;
using DigitalData.EmailProfiler.Domain.Entities;
using DigitalData.MessagingService.Domain.Entities;
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<EmailProfile> EmailProfiles { get; set; }
@@ -420,21 +420,21 @@ public class EmailProfilerDbContext : DbContext
#### 3.3. Create Repositories
**Location**: `src/DigitalData.EmailProfiler.Infrastructure/Persistence/Repositories/`
**Location**: `src/DigitalData.MessagingService.Infrastructure/Persistence/Repositories/`
**EmailProfileRepository.cs**:
```csharp
using Microsoft.EntityFrameworkCore;
using DigitalData.EmailProfiler.Domain.Entities;
using DigitalData.EmailProfiler.Application.Interfaces.Repositories;
using DigitalData.MessagingService.Domain.Entities;
using DigitalData.MessagingService.Application.Interfaces.Repositories;
namespace DigitalData.EmailProfiler.Infrastructure.Persistence.Repositories;
namespace DigitalData.MessagingService.Infrastructure.Persistence.Repositories;
public class EmailProfileRepository : IEmailProfileRepository
{
private readonly EmailProfilerDbContext _context;
private readonly MessagingServiceDbContext _context;
public EmailProfileRepository(EmailProfilerDbContext context)
public EmailProfileRepository(MessagingServiceDbContext context)
{
_context = context;
}
@@ -516,17 +516,17 @@ Create similar repositories for **EmailAccountRepository**, **EmailHistoryReposi
#### 3.5. Create DependencyInjection.cs
**Location**: `src/DigitalData.EmailProfiler.Infrastructure/DependencyInjection.cs`
**Location**: `src/DigitalData.MessagingService.Infrastructure/DependencyInjection.cs`
```csharp
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using Microsoft.EntityFrameworkCore;
using DigitalData.EmailProfiler.Infrastructure.Persistence;
using DigitalData.EmailProfiler.Application.Interfaces.Repositories;
using DigitalData.EmailProfiler.Infrastructure.Persistence.Repositories;
using DigitalData.MessagingService.Infrastructure.Persistence;
using DigitalData.MessagingService.Application.Interfaces.Repositories;
using DigitalData.MessagingService.Infrastructure.Persistence.Repositories;
namespace DigitalData.EmailProfiler.Infrastructure;
namespace DigitalData.MessagingService.Infrastructure;
public static class DependencyInjection
{
@@ -535,7 +535,7 @@ public static class DependencyInjection
IConfiguration configuration)
{
// DbContext
services.AddDbContext<EmailProfilerDbContext>(options =>
services.AddDbContext<MessagingServiceDbContext>(options =>
options.UseSqlServer(
configuration.GetConnectionString("DefaultConnection"),
sqlOptions =>
@@ -572,7 +572,7 @@ public static class DependencyInjection
#### 4.1. Add NuGet Packages
```bash
cd src/DigitalData.EmailProfiler.API
cd src/DigitalData.MessagingService.API
dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Sinks.File
dotnet add package Serilog.Sinks.MSSqlServer
@@ -581,12 +581,12 @@ dotnet add package Scalar.AspNetCore
#### 4.2. Update Program.cs
**Location**: `src/DigitalData.EmailProfiler.API/Program.cs`
**Location**: `src/DigitalData.MessagingService.API/Program.cs`
```csharp
using DigitalData.EmailProfiler.API;
using DigitalData.EmailProfiler.Application;
using DigitalData.EmailProfiler.Infrastructure;
using DigitalData.MessagingService.API;
using DigitalData.MessagingService.Application;
using DigitalData.MessagingService.Infrastructure;
using Serilog;
using Scalar.AspNetCore;
@@ -639,7 +639,7 @@ app.MapControllers();
try
{
Log.Information("Starting EmailProfiler API");
Log.Information("Starting MessagingService API");
app.Run();
}
catch (Exception ex)
@@ -654,16 +654,16 @@ finally
#### 4.3. Create Controllers
**Location**: `src/DigitalData.EmailProfiler.API/Controllers/`
**Location**: `src/DigitalData.MessagingService.API/Controllers/`
**EmailProfilesController.cs**:
```csharp
using Microsoft.AspNetCore.Mvc;
using MediatR;
using DigitalData.EmailProfiler.Application.EmailProfiles.Commands;
using DigitalData.EmailProfiler.Application.EmailProfiles.Queries;
using DigitalData.MessagingService.Application.EmailProfiles.Commands;
using DigitalData.MessagingService.Application.EmailProfiles.Queries;
namespace DigitalData.EmailProfiler.API.Controllers;
namespace DigitalData.MessagingService.API.Controllers;
[ApiController]
[Route("api/[controller]")]
@@ -713,13 +713,13 @@ Create similar controllers for **EmailAccountsController**, **EmailHistoryContro
#### 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)
#### 4.5. Update appsettings.json
**Location**: `src/DigitalData.EmailProfiler.API/appsettings.json`
**Location**: `src/DigitalData.MessagingService.API/appsettings.json`
```json
{
@@ -758,7 +758,7 @@ Create similar controllers for **EmailAccountsController**, **EmailHistoryContro
#### 5.1. Add NuGet Packages
```bash
cd tests/DigitalData.EmailProfiler.Tests
cd tests/DigitalData.MessagingService.Tests
dotnet add package FakeItEasy
dotnet add package Bogus
dotnet add package FluentAssertions
@@ -768,15 +768,15 @@ dotnet add package Testcontainers.MsSql
#### 5.2. Create Unit Tests
**Location**: `tests/DigitalData.EmailProfiler.Tests/Unit/Domain/`
**Location**: `tests/DigitalData.MessagingService.Tests/Unit/Domain/`
**MessageIdGeneratorTests.cs**:
```csharp
using Xunit;
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
{
@@ -844,7 +844,7 @@ The README should include (in German):
**Template structure**:
```markdown
# DigitalData EmailProfiler
# DigitalData MessagingService
## Übersicht
[Application overview in German]
@@ -912,15 +912,15 @@ dotnet build
dotnet test
# Run API
cd src/DigitalData.EmailProfiler.API
cd src/DigitalData.MessagingService.API
dotnet run
# Create migration
cd src/DigitalData.EmailProfiler.Infrastructure
dotnet ef migrations add InitialCreate --startup-project ../DigitalData.EmailProfiler.API
cd src/DigitalData.MessagingService.Infrastructure
dotnet ef migrations add InitialCreate --startup-project ../DigitalData.MessagingService.API
# 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
**Overall Progress**: 75% Complete (3 of 4 phases done)
@@ -7,7 +7,7 @@
## 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
- 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**:
```
src/DigitalData.EmailProfiler.Domain/
src/DigitalData.MessagingService.Domain/
├── Entities/ (8 files)
├── ValueObjects/ (3 files)
├── Enums/ (5 files)
@@ -135,7 +135,7 @@ src/DigitalData.EmailProfiler.Domain/
**Files**:
```
src/DigitalData.EmailProfiler.Application/
src/DigitalData.MessagingService.Application/
├── EmailProfiles/Commands/ (3 files)
├── EmailProfiles/Queries/ (2 files)
├── EmailProfiles/Validators/ (2 files)
@@ -158,7 +158,7 @@ src/DigitalData.EmailProfiler.Application/
### Phase 3: Infrastructure Layer ✅ COMPLETE (100%)
**Database**:
-`EmailProfilerDbContext` - EF Core DbContext with 8 DbSets
-`MessagingServiceDbContext` - EF Core DbContext with 8 DbSets
- NO `OnModelCreating` override (attribute-only configuration)
- NO `SaveChangesAsync` override (Repository handles this)
- Connection string: `DefaultConnection` from appsettings
@@ -231,8 +231,8 @@ src/DigitalData.EmailProfiler.Application/
**Files**:
```
src/DigitalData.EmailProfiler.Infrastructure/
├── Persistence/EmailProfilerDbContext.cs
src/DigitalData.MessagingService.Infrastructure/
├── Persistence/MessagingServiceDbContext.cs
├── Repositories/Repository.cs
├── Services/ (6 files)
├── Messaging/ (3 files)
@@ -290,7 +290,7 @@ src/DigitalData.EmailProfiler.Infrastructure/
**Files**:
```
src/DigitalData.EmailProfiler.API/
src/DigitalData.MessagingService.API/
├── Controllers/ (3 files)
├── appsettings.json
├── appsettings.Secrets.json
@@ -311,7 +311,7 @@ src/DigitalData.EmailProfiler.API/
**Test Structure**:
```
tests/DigitalData.EmailProfiler.Tests/
tests/DigitalData.MessagingService.Tests/
├── Domain/
│ ├── Services/MessageIdGeneratorTests.cs
│ ├── ValueObjects/EmailAddressTests.cs
@@ -362,7 +362,7 @@ tests/DigitalData.EmailProfiler.Tests/
### 5. SQL Server Database ✅ AVAILABLE
**Status**: Legacy database exists
**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**:
```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**:
1. Build the solution: `dotnet build`
2. Review the Domain layer: `src/DigitalData.EmailProfiler.Domain/`
3. Review the Application layer: `src/DigitalData.EmailProfiler.Application/`
4. Review the Infrastructure layer: `src/DigitalData.EmailProfiler.Infrastructure/`
5. Review the API layer: `src/DigitalData.EmailProfiler.API/`
2. Review the Domain layer: `src/DigitalData.MessagingService.Domain/`
3. Review the Application layer: `src/DigitalData.MessagingService.Application/`
4. Review the Infrastructure layer: `src/DigitalData.MessagingService.Infrastructure/`
5. Review the API layer: `src/DigitalData.MessagingService.API/`
**What You Need to Complete**:
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 Microsoft.AspNetCore.Mvc;
namespace DigitalData.EmailProfiler.API.Controllers;
namespace DigitalData.MessagingService.API.Controllers;
/// <summary>
/// Email sending API controller

View File

@@ -4,7 +4,7 @@
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<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>
<ItemGroup>
@@ -21,9 +21,9 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DigitalData.EmailProfiler.Application\DigitalData.EmailProfiler.Application.csproj" />
<ProjectReference Include="..\DigitalData.EmailProfiler.Domain\DigitalData.EmailProfiler.Domain.csproj" />
<ProjectReference Include="..\DigitalData.EmailProfiler.Infrastructure\DigitalData.EmailProfiler.Infrastructure.csproj" />
<ProjectReference Include="..\DigitalData.MessagingService.Application\DigitalData.MessagingService.Application.csproj" />
<ProjectReference Include="..\DigitalData.MessagingService.Domain\DigitalData.MessagingService.Domain.csproj" />
<ProjectReference Include="..\DigitalData.MessagingService.Infrastructure\DigitalData.MessagingService.Infrastructure.csproj" />
</ItemGroup>
</Project>

View File

@@ -1,8 +1,8 @@
using System.Net;
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>
/// Global exception handling middleware

View File

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

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Application.Common.Dtos;
namespace DigitalData.MessagingService.Application.Common.Dtos;
/// <summary>
/// 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
{

View File

@@ -1,6 +1,6 @@
using MediatR;
namespace DigitalData.EmailProfiler.Application.Common.Interfaces;
namespace DigitalData.MessagingService.Application.Common.Interfaces;
/// <summary>
/// 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>
/// 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>
/// Encryption service interface for password encryption.

View File

@@ -1,7 +1,7 @@
using DigitalData.EmailProfiler.Application.Common.Events;
using DigitalData.EmailProfiler.Application.EmailSending.Commands;
using DigitalData.MessagingService.Application.Common.Events;
using DigitalData.MessagingService.Application.EmailSending.Commands;
namespace DigitalData.EmailProfiler.Application.Common.Interfaces;
namespace DigitalData.MessagingService.Application.Common.Interfaces;
/// <summary>
/// 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>
/// PDF processing service interface.

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,9 +1,9 @@
using AutoMapper;
using DigitalData.EmailProfiler.Application.Common.Events;
using DigitalData.EmailProfiler.Application.Common.Interfaces;
using DigitalData.MessagingService.Application.Common.Events;
using DigitalData.MessagingService.Application.Common.Interfaces;
using MediatR;
namespace DigitalData.EmailProfiler.Application.EmailSending.Commands;
namespace DigitalData.MessagingService.Application.EmailSending.Commands;
/// <summary>
/// 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;
namespace DigitalData.EmailProfiler.Application.EmailSending.Validators;
namespace DigitalData.MessagingService.Application.EmailSending.Validators;
/// <summary>
/// Validator for SendEmailCommand

View File

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

View File

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

View File

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

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Domain.Common;
namespace DigitalData.MessagingService.Domain.Common;
/// <summary>
/// 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
{

View File

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

View File

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

View File

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

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Domain.Enums;
namespace DigitalData.MessagingService.Domain.Enums;
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
{

View File

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

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Domain.Exceptions;
namespace DigitalData.MessagingService.Domain.Exceptions;
/// <summary>
/// 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
{

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Domain.Exceptions;
namespace DigitalData.MessagingService.Domain.Exceptions;
/// <summary>
/// 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>
/// 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
{

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
{

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,4 +1,4 @@
namespace DigitalData.EmailProfiler.Infrastructure.Messaging;
namespace DigitalData.MessagingService.Infrastructure.Messaging;
/// <summary>
/// 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.Json;
using DigitalData.EmailProfiler.Application.Common.Interfaces;
using DigitalData.EmailProfiler.Infrastructure.Messaging;
using DigitalData.MessagingService.Application.Common.Interfaces;
using DigitalData.MessagingService.Infrastructure.Messaging;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using RabbitMQ.Client;
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>
/// RabbitMQ-based email queue implementation for outgoing emails.

View File

@@ -1,17 +1,17 @@
using System.Linq.Expressions;
using AutoMapper;
using DigitalData.EmailProfiler.Application.Common.Interfaces;
using DigitalData.EmailProfiler.Domain.Exceptions;
using DigitalData.EmailProfiler.Infrastructure.Persistence;
using DigitalData.MessagingService.Application.Common.Interfaces;
using DigitalData.MessagingService.Domain.Exceptions;
using DigitalData.MessagingService.Infrastructure.Persistence;
using Microsoft.EntityFrameworkCore;
namespace DigitalData.EmailProfiler.Infrastructure.Repositories;
namespace DigitalData.MessagingService.Infrastructure.Repositories;
/// <summary>
/// Generic repository implementation with AutoMapper-based CRUD operations.
/// IMPORTANT: Each operation auto-saves changes - NO explicit SaveChangesAsync needed!
/// </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>();

View File

@@ -1,9 +1,9 @@
using DigitalData.EmailProfiler.Application.Common.Interfaces;
using DigitalData.EmailProfiler.Infrastructure.Queue;
using DigitalData.MessagingService.Application.Common.Interfaces;
using DigitalData.MessagingService.Infrastructure.Queue;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace DigitalData.EmailProfiler.Infrastructure.Services.Background;
namespace DigitalData.MessagingService.Infrastructure.Services.Background;
/// <summary>
/// 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;
namespace DigitalData.EmailProfiler.Infrastructure.Services;
namespace DigitalData.MessagingService.Infrastructure.Services;
/// <summary>
/// Encryption service using ASP.NET Core Data Protection API.
@@ -9,7 +9,7 @@ namespace DigitalData.EmailProfiler.Infrastructure.Services;
/// </summary>
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)
{

View File

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

View File

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

View File

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