diff --git a/src/DigitalData.EmailProfiler.Domain/ValueObjects/EmailAddress.cs b/src/DigitalData.EmailProfiler.Domain/ValueObjects/EmailAddress.cs new file mode 100644 index 0000000..aa647f0 --- /dev/null +++ b/src/DigitalData.EmailProfiler.Domain/ValueObjects/EmailAddress.cs @@ -0,0 +1,45 @@ +using System.ComponentModel.DataAnnotations; +using DigitalData.EmailProfiler.Domain.Common; +using DigitalData.EmailProfiler.Domain.Exceptions; + +namespace DigitalData.EmailProfiler.Domain.ValueObjects; + +/// +/// Value object representing an email address with validation +/// +public class EmailAddress : ValueObject +{ + public string Value { get; private set; } + public string Domain { get; private set; } + public string LocalPart { get; private set; } + + private EmailAddress(string value) + { + Value = value; + var parts = value.Split('@'); + LocalPart = parts[0]; + Domain = parts[1]; + } + + public static EmailAddress Create(string email) + { + if (!IsValid(email)) + throw new DomainException($"Invalid email address: {email}"); + + return new EmailAddress(email.ToLowerInvariant()); + } + + private static bool IsValid(string email) + { + return !string.IsNullOrWhiteSpace(email) && + email.Contains('@') && + new EmailAddressAttribute().IsValid(email); + } + + protected override IEnumerable GetEqualityComponents() + { + yield return Value; + } + + public override string ToString() => Value; +} diff --git a/src/DigitalData.EmailProfiler.Domain/ValueObjects/MessageId.cs b/src/DigitalData.EmailProfiler.Domain/ValueObjects/MessageId.cs new file mode 100644 index 0000000..9b2789b --- /dev/null +++ b/src/DigitalData.EmailProfiler.Domain/ValueObjects/MessageId.cs @@ -0,0 +1,41 @@ +using System.Security.Cryptography; +using System.Text; +using DigitalData.EmailProfiler.Domain.Common; + +namespace DigitalData.EmailProfiler.Domain.ValueObjects; + +/// +/// Value object representing a unique message identifier with hash generation +/// Uses the same algorithm as legacy system for compatibility +/// +public class MessageId : ValueObject +{ + public string Value { get; private set; } + public string Hash { get; private set; } + + private MessageId(string value) + { + Value = value; + Hash = GenerateHash(value); + } + + public static MessageId Create(string originalMessageId, string sender, DateTime date, string subject) + { + var combined = $"{originalMessageId}|{sender}|{date:yyyyMMddHHmmss}|{subject}"; + return new MessageId(combined); + } + + private static string GenerateHash(string input) + { + // Same algorithm as legacy: SHA256 hash + using var sha256 = SHA256.Create(); + var bytes = Encoding.UTF8.GetBytes(input); + var hash = sha256.ComputeHash(bytes); + return Convert.ToBase64String(hash); + } + + protected override IEnumerable GetEqualityComponents() + { + yield return Value; + } +}