refactor: Rename EmailPorifler to MessagingService
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -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
|
||||
|
||||
14
AGENTS.md
14
AGENTS.md
@@ -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"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
30
STATUS.md
30
STATUS.md
@@ -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`
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
}
|
||||
@@ -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
|
||||
@@ -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>
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace DigitalData.EmailProfiler.Application.Common.Dtos;
|
||||
namespace DigitalData.MessagingService.Application.Common.Dtos;
|
||||
|
||||
/// <summary>
|
||||
/// DTO for EmailAccount query results.
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace DigitalData.EmailProfiler.Application.Common.Events;
|
||||
namespace DigitalData.MessagingService.Application.Common.Events;
|
||||
|
||||
public class OutgoingEmailEvent
|
||||
{
|
||||
@@ -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)
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace DigitalData.EmailProfiler.Application.Common.Interfaces;
|
||||
namespace DigitalData.MessagingService.Application.Common.Interfaces;
|
||||
|
||||
/// <summary>
|
||||
/// Email service interface for SMTP operations.
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace DigitalData.EmailProfiler.Application.Common.Interfaces;
|
||||
namespace DigitalData.MessagingService.Application.Common.Interfaces;
|
||||
|
||||
/// <summary>
|
||||
/// Encryption service interface for password encryption.
|
||||
@@ -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.
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace DigitalData.EmailProfiler.Application.Common.Interfaces;
|
||||
namespace DigitalData.MessagingService.Application.Common.Interfaces;
|
||||
|
||||
/// <summary>
|
||||
/// PDF processing service interface.
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -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>
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace DigitalData.EmailProfiler.Domain.Common;
|
||||
namespace DigitalData.MessagingService.Domain.Common;
|
||||
|
||||
public abstract class BaseEntity
|
||||
{
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace DigitalData.EmailProfiler.Domain.Common;
|
||||
namespace DigitalData.MessagingService.Domain.Common;
|
||||
|
||||
/// <summary>
|
||||
/// Domain-wide constants
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace DigitalData.EmailProfiler.Domain.Common;
|
||||
namespace DigitalData.MessagingService.Domain.Common;
|
||||
|
||||
/// <summary>
|
||||
/// Marker interface for aggregate roots in DDD
|
||||
@@ -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
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace DigitalData.EmailProfiler.Domain.Enums;
|
||||
namespace DigitalData.MessagingService.Domain.Enums;
|
||||
|
||||
public enum AttachmentStatus
|
||||
{
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace DigitalData.EmailProfiler.Domain.Enums;
|
||||
namespace DigitalData.MessagingService.Domain.Enums;
|
||||
|
||||
public enum AuthenticationType
|
||||
{
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace DigitalData.EmailProfiler.Domain.Enums;
|
||||
namespace DigitalData.MessagingService.Domain.Enums;
|
||||
|
||||
public enum EmailStatus
|
||||
{
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace DigitalData.EmailProfiler.Domain.Enums;
|
||||
namespace DigitalData.MessagingService.Domain.Enums;
|
||||
|
||||
public enum ErrorCode
|
||||
{
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace DigitalData.EmailProfiler.Domain.Enums;
|
||||
namespace DigitalData.MessagingService.Domain.Enums;
|
||||
|
||||
public enum ProcessType
|
||||
{
|
||||
@@ -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
|
||||
{
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace DigitalData.EmailProfiler.Domain.Exceptions;
|
||||
namespace DigitalData.MessagingService.Domain.Exceptions;
|
||||
|
||||
/// <summary>
|
||||
/// Exception thrown when OAuth2 authentication fails.
|
||||
@@ -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.
|
||||
@@ -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
|
||||
{
|
||||
@@ -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.
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace DigitalData.EmailProfiler.Domain.Exceptions;
|
||||
namespace DigitalData.MessagingService.Domain.Exceptions;
|
||||
|
||||
/// <summary>
|
||||
/// Exception thrown when a requested entity is not found.
|
||||
@@ -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
|
||||
{
|
||||
@@ -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
|
||||
{
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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>();
|
||||
@@ -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>
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace DigitalData.EmailProfiler.Infrastructure.Messaging;
|
||||
namespace DigitalData.MessagingService.Infrastructure.Messaging;
|
||||
|
||||
/// <summary>
|
||||
/// Configuration for RabbitMQ connection
|
||||
@@ -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)
|
||||
{
|
||||
}
|
||||
@@ -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.
|
||||
@@ -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>();
|
||||
|
||||
@@ -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.
|
||||
@@ -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)
|
||||
{
|
||||
@@ -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.
|
||||
@@ -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).
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user