diff --git a/src/DigitalData.EmailProfiler.Application/Common/Mappings/EmailAccountMappingProfile.cs b/src/DigitalData.EmailProfiler.Application/Common/Mappings/EmailAccountMappingProfile.cs
new file mode 100644
index 0000000..2f12319
--- /dev/null
+++ b/src/DigitalData.EmailProfiler.Application/Common/Mappings/EmailAccountMappingProfile.cs
@@ -0,0 +1,27 @@
+using AutoMapper;
+using DigitalData.EmailProfiler.Application.Common.Dtos;
+using DigitalData.EmailProfiler.Application.Features.EmailAccounts.Commands;
+using DigitalData.EmailProfiler.Domain.Entities;
+
+namespace DigitalData.EmailProfiler.Application.Common.Mappings;
+
+///
+/// AutoMapper profile for EmailAccount entity mappings.
+///
+public class EmailAccountMappingProfile : Profile
+{
+ public EmailAccountMappingProfile()
+ {
+ // Command -> Entity (for Create)
+ CreateMap()
+ .ForMember(dest => dest.Id, opt => opt.Ignore()) // Auto-generated
+ .ForMember(dest => dest.AddedWhen, opt => opt.MapFrom(_ => DateTime.Now))
+ .ForMember(dest => dest.AddedWho, opt => opt.MapFrom(_ => "System")) // TODO: Get from user context
+ .ForMember(dest => dest.ChangedWhen, opt => opt.Ignore())
+ .ForMember(dest => dest.ChangedWho, opt => opt.Ignore())
+ .ForMember(dest => dest.Profiles, opt => opt.Ignore());
+
+ // Entity -> DTO (for Queries)
+ CreateMap();
+ }
+}
diff --git a/src/DigitalData.EmailProfiler.Application/Common/Mappings/EmailAttachmentMappingProfile.cs b/src/DigitalData.EmailProfiler.Application/Common/Mappings/EmailAttachmentMappingProfile.cs
new file mode 100644
index 0000000..89c8428
--- /dev/null
+++ b/src/DigitalData.EmailProfiler.Application/Common/Mappings/EmailAttachmentMappingProfile.cs
@@ -0,0 +1,51 @@
+using AutoMapper;
+using DigitalData.EmailProfiler.Application.Common.Dtos.EmailAttachments;
+using DigitalData.EmailProfiler.Domain.Entities;
+using DigitalData.EmailProfiler.Domain.Enums;
+
+namespace DigitalData.EmailProfiler.Application.Common.Mappings;
+
+///
+/// AutoMapper profile for EmailAttachment entity mappings.
+///
+public class EmailAttachmentMappingProfile : Profile
+{
+ public EmailAttachmentMappingProfile()
+ {
+ // DTO -> Entity (for Create)
+ CreateMap()
+ .ForMember(dest => dest.Id, opt => opt.Ignore()) // Auto-generated
+ .ForMember(dest => dest.Status, opt => opt.MapFrom(_ => AttachmentStatus.Pending.ToString()))
+ .ForMember(dest => dest.AddedWhen, opt => opt.MapFrom(_ => DateTime.Now))
+ .ForMember(dest => dest.IsEmbeddedFile, opt => opt.MapFrom(_ => false))
+ .ForMember(dest => dest.ParentAttachmentId, opt => opt.Ignore())
+ .ForMember(dest => dest.AttachmentPosition, opt => opt.MapFrom(_ => 0))
+ .ForMember(dest => dest.ValidationErrorCode, opt => opt.Ignore())
+ .ForMember(dest => dest.ValidationErrorMessage, opt => opt.Ignore())
+ .ForMember(dest => dest.Comment, opt => opt.Ignore())
+ .ForMember(dest => dest.EmailHistory, opt => opt.Ignore())
+ .ForMember(dest => dest.ParentAttachment, opt => opt.Ignore())
+ .ForMember(dest => dest.EmbeddedFiles, opt => opt.Ignore());
+
+ // DTO -> Entity (for Update Status)
+ CreateMap()
+ .ForMember(dest => dest.Id, opt => opt.Ignore())
+ .ForMember(dest => dest.EmailHistoryId, opt => opt.Ignore())
+ .ForMember(dest => dest.OriginalFileName, opt => opt.Ignore())
+ .ForMember(dest => dest.SavedFileName, opt => opt.Ignore())
+ .ForMember(dest => dest.FilePath, opt => opt.Ignore())
+ .ForMember(dest => dest.FileSize, opt => opt.Ignore())
+ .ForMember(dest => dest.Extension, opt => opt.Ignore())
+ .ForMember(dest => dest.IsEmbeddedFile, opt => opt.Ignore())
+ .ForMember(dest => dest.ParentAttachmentId, opt => opt.Ignore())
+ .ForMember(dest => dest.AttachmentPosition, opt => opt.Ignore())
+ .ForMember(dest => dest.Comment, opt => opt.Ignore())
+ .ForMember(dest => dest.AddedWhen, opt => opt.Ignore())
+ .ForMember(dest => dest.EmailHistory, opt => opt.Ignore())
+ .ForMember(dest => dest.ParentAttachment, opt => opt.Ignore())
+ .ForMember(dest => dest.EmbeddedFiles, opt => opt.Ignore());
+
+ // Entity -> DTO (for Queries)
+ CreateMap();
+ }
+}
diff --git a/src/DigitalData.EmailProfiler.Application/Common/Mappings/EmailHistoryMappingProfile.cs b/src/DigitalData.EmailProfiler.Application/Common/Mappings/EmailHistoryMappingProfile.cs
new file mode 100644
index 0000000..6f37a8a
--- /dev/null
+++ b/src/DigitalData.EmailProfiler.Application/Common/Mappings/EmailHistoryMappingProfile.cs
@@ -0,0 +1,59 @@
+using AutoMapper;
+using DigitalData.EmailProfiler.Application.Common.Dtos.EmailHistories;
+using DigitalData.EmailProfiler.Domain.Entities;
+using DigitalData.EmailProfiler.Domain.Enums;
+
+namespace DigitalData.EmailProfiler.Application.Common.Mappings;
+
+///
+/// AutoMapper profile for EmailHistory entity mappings.
+///
+public class EmailHistoryMappingProfile : Profile
+{
+ public EmailHistoryMappingProfile()
+ {
+ // DTO -> Entity (for Create)
+ CreateMap()
+ .ForMember(dest => dest.Id, opt => opt.Ignore()) // Auto-generated
+ .ForMember(dest => dest.EmailMessageId, opt => opt.Ignore()) // Auto-generated
+ .ForMember(dest => dest.Status, opt => opt.MapFrom(_ => EmailStatus.Processing.ToString()))
+ .ForMember(dest => dest.AddedWhen, opt => opt.MapFrom(_ => DateTime.Now))
+ .ForMember(dest => dest.ProcessedDate, opt => opt.Ignore())
+ .ForMember(dest => dest.ErrorCodeValue, opt => opt.Ignore())
+ .ForMember(dest => dest.ErrorMessage, opt => opt.Ignore())
+ .ForMember(dest => dest.WindreamDocumentId, opt => opt.Ignore())
+ .ForMember(dest => dest.Comment, opt => opt.Ignore())
+ .ForMember(dest => dest.WorkProcess, opt => opt.Ignore())
+ .ForMember(dest => dest.ImapUid, opt => opt.Ignore())
+ .ForMember(dest => dest.EmailSubstring1, opt => opt.Ignore())
+ .ForMember(dest => dest.EmailSubstring2, opt => opt.Ignore())
+ .ForMember(dest => dest.Profile, opt => opt.Ignore())
+ .ForMember(dest => dest.Attachments, opt => opt.Ignore());
+
+ // DTO -> Entity (for Update Status)
+ CreateMap()
+ .ForMember(dest => dest.Id, opt => opt.Ignore())
+ .ForMember(dest => dest.ProfileId, opt => opt.Ignore())
+ .ForMember(dest => dest.MessageIdHash, opt => opt.Ignore())
+ .ForMember(dest => dest.OriginalMessageId, opt => opt.Ignore())
+ .ForMember(dest => dest.SenderAddress, opt => opt.Ignore())
+ .ForMember(dest => dest.EmailDate, opt => opt.Ignore())
+ .ForMember(dest => dest.Subject, opt => opt.Ignore())
+ .ForMember(dest => dest.EmailBodyText, opt => opt.Ignore())
+ .ForMember(dest => dest.EmailBodyHtml, opt => opt.Ignore())
+ .ForMember(dest => dest.EmailMessageId, opt => opt.Ignore())
+ .ForMember(dest => dest.AddedWhen, opt => opt.Ignore())
+ .ForMember(dest => dest.WindreamDocumentId, opt => opt.Ignore())
+ .ForMember(dest => dest.Comment, opt => opt.Ignore())
+ .ForMember(dest => dest.WorkProcess, opt => opt.Ignore())
+ .ForMember(dest => dest.ImapUid, opt => opt.Ignore())
+ .ForMember(dest => dest.EmailSubstring1, opt => opt.Ignore())
+ .ForMember(dest => dest.EmailSubstring2, opt => opt.Ignore())
+ .ForMember(dest => dest.Profile, opt => opt.Ignore())
+ .ForMember(dest => dest.Attachments, opt => opt.Ignore());
+
+ // Entity -> DTO (for Queries)
+ CreateMap()
+ .ForMember(dest => dest.ProfileName, opt => opt.MapFrom(src => src.Profile != null ? src.Profile.ProfileName : null));
+ }
+}
diff --git a/src/DigitalData.EmailProfiler.Application/Common/Mappings/EmailProfileMappingProfile.cs b/src/DigitalData.EmailProfiler.Application/Common/Mappings/EmailProfileMappingProfile.cs
new file mode 100644
index 0000000..343f3ee
--- /dev/null
+++ b/src/DigitalData.EmailProfiler.Application/Common/Mappings/EmailProfileMappingProfile.cs
@@ -0,0 +1,45 @@
+using AutoMapper;
+using DigitalData.EmailProfiler.Application.Common.Dtos;
+using DigitalData.EmailProfiler.Application.Features.EmailProfiles.Commands;
+using DigitalData.EmailProfiler.Domain.Entities;
+
+namespace DigitalData.EmailProfiler.Application.Common.Mappings;
+
+///
+/// AutoMapper profile for EmailProfile entity mappings.
+///
+public class EmailProfileMappingProfile : Profile
+{
+ public EmailProfileMappingProfile()
+ {
+ // Command -> Entity (for Create)
+ CreateMap()
+ .ForMember(dest => dest.Id, opt => opt.Ignore()) // Auto-generated
+ .ForMember(dest => dest.AddedWhen, opt => opt.MapFrom(_ => DateTime.Now))
+ .ForMember(dest => dest.AddedWho, opt => opt.MapFrom(_ => "System")) // TODO: Get from user context
+ .ForMember(dest => dest.ChangedWhen, opt => opt.Ignore())
+ .ForMember(dest => dest.ChangedWho, opt => opt.Ignore())
+ .ForMember(dest => dest.LastPollTime, opt => opt.Ignore())
+ .ForMember(dest => dest.EmailAccount, opt => opt.Ignore())
+ .ForMember(dest => dest.EmailProcess, opt => opt.Ignore());
+
+ // Command -> Entity (for Update)
+ CreateMap()
+ .ForMember(dest => dest.Id, opt => opt.Ignore()) // Don't update ID
+ .ForMember(dest => dest.EmailAccountId, opt => opt.Ignore()) // Don't change account
+ .ForMember(dest => dest.ProcessId, opt => opt.Ignore()) // Don't change process
+ .ForMember(dest => dest.AddedWhen, opt => opt.Ignore())
+ .ForMember(dest => dest.AddedWho, opt => opt.Ignore())
+ .ForMember(dest => dest.ChangedWhen, opt => opt.MapFrom(_ => DateTime.Now))
+ .ForMember(dest => dest.ChangedWho, opt => opt.MapFrom(_ => "System")) // TODO: Get from user context
+ .ForMember(dest => dest.LastPollTime, opt => opt.Ignore())
+ .ForMember(dest => dest.EmailAccount, opt => opt.Ignore())
+ .ForMember(dest => dest.EmailProcess, opt => opt.Ignore());
+
+ // Entity -> DTO (for Queries)
+ CreateMap()
+ .ForMember(dest => dest.EmailAccountName, opt => opt.MapFrom(src => src.EmailAccount != null ? src.EmailAccount.AccountName : null))
+ .ForMember(dest => dest.ProcessName, opt => opt.MapFrom(src => src.EmailProcess != null ? src.EmailProcess.ProcessName : null))
+ .ForMember(dest => dest.LastPollTime, opt => opt.MapFrom(src => src.LastPollTime));
+ }
+}