diff --git a/src/DigitalData.MessagingService.API/Middleware/ExceptionHandlingMiddleware.cs b/src/DigitalData.MessagingService.API/Middleware/ExceptionHandlingMiddleware.cs index bc311aa..c9d4abe 100644 --- a/src/DigitalData.MessagingService.API/Middleware/ExceptionHandlingMiddleware.cs +++ b/src/DigitalData.MessagingService.API/Middleware/ExceptionHandlingMiddleware.cs @@ -48,13 +48,7 @@ public class ExceptionHandlingMiddleware AuthenticationFailedException authEx => (HttpStatusCode.Unauthorized, authEx.Message), - - DmsNotAvailableException dmsEx => - (HttpStatusCode.ServiceUnavailable, dmsEx.Message), - - InvalidPdfException pdfEx => - (HttpStatusCode.BadRequest, pdfEx.Message), - + FluentValidation.ValidationException validationEx => (HttpStatusCode.BadRequest, FormatValidationErrors(validationEx)), diff --git a/src/DigitalData.MessagingService.Domain/Common/BaseEntity.cs b/src/DigitalData.MessagingService.Domain/Common/BaseEntity.cs deleted file mode 100644 index 9b59f1f..0000000 --- a/src/DigitalData.MessagingService.Domain/Common/BaseEntity.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace DigitalData.MessagingService.Domain.Common; - -public abstract class BaseEntity -{ - public DateTime? CreatedDate { get; set; } - public string? CreatedBy { get; set; } - public DateTime? ModifiedDate { get; set; } - public string? ModifiedBy { get; set; } -} diff --git a/src/DigitalData.MessagingService.Domain/Common/DomainConstants.cs b/src/DigitalData.MessagingService.Domain/Common/DomainConstants.cs deleted file mode 100644 index cafe165..0000000 --- a/src/DigitalData.MessagingService.Domain/Common/DomainConstants.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace DigitalData.MessagingService.Domain.Common; - -/// -/// Domain-wide constants -/// -public static class DomainConstants -{ - /// - /// Email processing constants - /// - public static class Email - { - /// - /// Maximum number of retry attempts for failed email sending - /// After this limit, email will be moved to Dead Letter Queue (DLQ) - /// - public const int MaxRetryCount = 3; - } -} diff --git a/src/DigitalData.MessagingService.Domain/Common/IAggregateRoot.cs b/src/DigitalData.MessagingService.Domain/Common/IAggregateRoot.cs deleted file mode 100644 index 797ec96..0000000 --- a/src/DigitalData.MessagingService.Domain/Common/IAggregateRoot.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace DigitalData.MessagingService.Domain.Common; - -/// -/// Marker interface for aggregate roots in DDD -/// -public interface IAggregateRoot -{ -} diff --git a/src/DigitalData.MessagingService.Domain/Common/ValueObject.cs b/src/DigitalData.MessagingService.Domain/Common/ValueObject.cs deleted file mode 100644 index 425a6ff..0000000 --- a/src/DigitalData.MessagingService.Domain/Common/ValueObject.cs +++ /dev/null @@ -1,43 +0,0 @@ -namespace DigitalData.MessagingService.Domain.Common; - -/// -/// Base class for value objects that implement equality by value -/// -public abstract class ValueObject -{ - protected abstract IEnumerable GetEqualityComponents(); - - public override bool Equals(object? obj) - { - if (obj == null || obj.GetType() != GetType()) - { - return false; - } - - var other = (ValueObject)obj; - return GetEqualityComponents().SequenceEqual(other.GetEqualityComponents()); - } - - public override int GetHashCode() - { - return GetEqualityComponents() - .Select(x => x?.GetHashCode() ?? 0) - .Aggregate((x, y) => x ^ y); - } - - public static bool operator ==(ValueObject? left, ValueObject? right) - { - if (left is null && right is null) - return true; - - if (left is null || right is null) - return false; - - return left.Equals(right); - } - - public static bool operator !=(ValueObject? left, ValueObject? right) - { - return !(left == right); - } -} diff --git a/src/DigitalData.MessagingService.Domain/DigitalData.MessagingService.Domain.csproj b/src/DigitalData.MessagingService.Domain/DigitalData.MessagingService.Domain.csproj index 3be23fe..13604a5 100644 --- a/src/DigitalData.MessagingService.Domain/DigitalData.MessagingService.Domain.csproj +++ b/src/DigitalData.MessagingService.Domain/DigitalData.MessagingService.Domain.csproj @@ -10,8 +10,4 @@ - - - - diff --git a/src/DigitalData.MessagingService.Domain/Enums/AttachmentStatus.cs b/src/DigitalData.MessagingService.Domain/Enums/AttachmentStatus.cs deleted file mode 100644 index e4a9dcb..0000000 --- a/src/DigitalData.MessagingService.Domain/Enums/AttachmentStatus.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace DigitalData.MessagingService.Domain.Enums; - -public enum AttachmentStatus -{ - Pending = 1, - Valid = 2, - Corrupt = 3, - Skipped = 4 -} diff --git a/src/DigitalData.MessagingService.Domain/Enums/AuthenticationType.cs b/src/DigitalData.MessagingService.Domain/Enums/AuthenticationType.cs deleted file mode 100644 index d1e91cc..0000000 --- a/src/DigitalData.MessagingService.Domain/Enums/AuthenticationType.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace DigitalData.MessagingService.Domain.Enums; - -public enum AuthenticationType -{ - UsernamePassword = 1, - OAuth2 = 2 -} diff --git a/src/DigitalData.MessagingService.Domain/Enums/EmailStatus.cs b/src/DigitalData.MessagingService.Domain/Enums/EmailStatus.cs deleted file mode 100644 index 31e28dd..0000000 --- a/src/DigitalData.MessagingService.Domain/Enums/EmailStatus.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace DigitalData.MessagingService.Domain.Enums; - -public enum EmailStatus -{ - Pending = 1, - Processing = 2, - Processed = 3, - Failed = 4, - PartiallyProcessed = 5, - Rejected = 6 -} diff --git a/src/DigitalData.MessagingService.Domain/Enums/ErrorCode.cs b/src/DigitalData.MessagingService.Domain/Enums/ErrorCode.cs deleted file mode 100644 index 789a04f..0000000 --- a/src/DigitalData.MessagingService.Domain/Enums/ErrorCode.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace DigitalData.MessagingService.Domain.Enums; - -public enum ErrorCode -{ - None = 0, - NoAttachments = 10001, - SenderValidationFailed = 10002, - EmbeddedFileAttachmentCorrupt = 10003, - NormalFileAttachmentCorrupt = 10004, - PdfStructureInvalid = 10005, - ImapConnectionFailed = 10006, - WindreamImportFailed = 10007, - DiskSpaceInsufficient = 10008, - DuplicateMessageId = 10009, - AttachmentExtractionFailed = 10010 -} diff --git a/src/DigitalData.MessagingService.Domain/Enums/ProcessType.cs b/src/DigitalData.MessagingService.Domain/Enums/ProcessType.cs deleted file mode 100644 index e54d84c..0000000 --- a/src/DigitalData.MessagingService.Domain/Enums/ProcessType.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace DigitalData.MessagingService.Domain.Enums; - -public enum ProcessType -{ - ProcessManager = 1, // Easy Approval workflow - AttachmentSniffer = 2, // General attachment extraction - ZugFeRDParser = 3 // Electronic invoice processing -} diff --git a/src/DigitalData.MessagingService.Domain/Exceptions/AttachmentProcessingException.cs b/src/DigitalData.MessagingService.Domain/Exceptions/AttachmentProcessingException.cs deleted file mode 100644 index 432f412..0000000 --- a/src/DigitalData.MessagingService.Domain/Exceptions/AttachmentProcessingException.cs +++ /dev/null @@ -1,15 +0,0 @@ -using DigitalData.MessagingService.Domain.Enums; - -namespace DigitalData.MessagingService.Domain.Exceptions; - -public class AttachmentProcessingException : DomainException -{ - public AttachmentProcessingException(ErrorCode errorCode, string message) : base(message, errorCode) - { - } - - public AttachmentProcessingException(ErrorCode errorCode, string message, Exception innerException) - : base(message, errorCode) - { - } -} diff --git a/src/DigitalData.MessagingService.Domain/Exceptions/DmsNotAvailableException.cs b/src/DigitalData.MessagingService.Domain/Exceptions/DmsNotAvailableException.cs deleted file mode 100644 index dedd6c1..0000000 --- a/src/DigitalData.MessagingService.Domain/Exceptions/DmsNotAvailableException.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace DigitalData.MessagingService.Domain.Exceptions; - -/// -/// Exception thrown when DMS (windream) is not available or not configured properly. -/// -public class DmsNotAvailableException : Exception -{ - public DmsNotAvailableException() - : base("DMS service is not available. windream COM components may not be registered.") - { - } - - public DmsNotAvailableException(string message) - : base(message) - { - } - - public DmsNotAvailableException(string message, Exception innerException) - : base(message, innerException) - { - } -} diff --git a/src/DigitalData.MessagingService.Domain/Exceptions/DomainException.cs b/src/DigitalData.MessagingService.Domain/Exceptions/DomainException.cs deleted file mode 100644 index 7a55a73..0000000 --- a/src/DigitalData.MessagingService.Domain/Exceptions/DomainException.cs +++ /dev/null @@ -1,21 +0,0 @@ -using DigitalData.MessagingService.Domain.Enums; - -namespace DigitalData.MessagingService.Domain.Exceptions; - -public class DomainException : Exception -{ - public ErrorCode? ErrorCode { get; } - - public DomainException(string message) : base(message) - { - } - - public DomainException(string message, ErrorCode errorCode) : base(message) - { - ErrorCode = errorCode; - } - - public DomainException(string message, Exception innerException) : base(message, innerException) - { - } -} diff --git a/src/DigitalData.MessagingService.Domain/Exceptions/InvalidPdfException.cs b/src/DigitalData.MessagingService.Domain/Exceptions/InvalidPdfException.cs deleted file mode 100644 index ac88008..0000000 --- a/src/DigitalData.MessagingService.Domain/Exceptions/InvalidPdfException.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace DigitalData.MessagingService.Domain.Exceptions; - -/// -/// Exception thrown when a PDF file is invalid or corrupted. -/// -public class InvalidPdfException : Exception -{ - public InvalidPdfException(string message) - : base(message) - { - } - - public InvalidPdfException(string message, Exception innerException) - : base(message, innerException) - { - } -} diff --git a/src/DigitalData.MessagingService.Domain/Exceptions/ValidationException.cs b/src/DigitalData.MessagingService.Domain/Exceptions/ValidationException.cs deleted file mode 100644 index 81f176a..0000000 --- a/src/DigitalData.MessagingService.Domain/Exceptions/ValidationException.cs +++ /dev/null @@ -1,18 +0,0 @@ -using DigitalData.MessagingService.Domain.Enums; - -namespace DigitalData.MessagingService.Domain.Exceptions; - -public class ValidationException : DomainException -{ - public ValidationException(string message) : base(message) - { - } - - public ValidationException(string message, ErrorCode errorCode) : base(message, errorCode) - { - } - - public ValidationException(string message, Exception innerException) : base(message, innerException) - { - } -} diff --git a/src/DigitalData.MessagingService.Domain/Services/MessageIdGenerator.cs b/src/DigitalData.MessagingService.Domain/Services/MessageIdGenerator.cs deleted file mode 100644 index 84313ec..0000000 --- a/src/DigitalData.MessagingService.Domain/Services/MessageIdGenerator.cs +++ /dev/null @@ -1,28 +0,0 @@ -using DigitalData.MessagingService.Domain.ValueObjects; - -namespace DigitalData.MessagingService.Domain.Services; - -public interface IMessageIdGenerator -{ - MessageId Generate(string originalMessageId, string sender, DateTime date, string subject); - List GenerateFallbackHashes(MessageId messageId); -} - -public class MessageIdGenerator : IMessageIdGenerator -{ - public MessageId Generate(string originalMessageId, string sender, DateTime date, string subject) - { - return MessageId.Create(originalMessageId, sender, date, subject); - } - - public List GenerateFallbackHashes(MessageId messageId) - { - // Legacy behavior: 10 variations for duplicate detection - var hashes = new List { messageId.Hash }; - - // Add variations (this is simplified - legacy had 10 variations) - // TODO: Implement exact legacy fallback algorithm if needed - - return hashes; - } -} diff --git a/src/DigitalData.MessagingService.Domain/ValueObjects/EmailAddress.cs b/src/DigitalData.MessagingService.Domain/ValueObjects/EmailAddress.cs deleted file mode 100644 index b33fb61..0000000 --- a/src/DigitalData.MessagingService.Domain/ValueObjects/EmailAddress.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using DigitalData.MessagingService.Domain.Common; -using DigitalData.MessagingService.Domain.Exceptions; - -namespace DigitalData.MessagingService.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.MessagingService.Domain/ValueObjects/MessageId.cs b/src/DigitalData.MessagingService.Domain/ValueObjects/MessageId.cs deleted file mode 100644 index 0bfecb0..0000000 --- a/src/DigitalData.MessagingService.Domain/ValueObjects/MessageId.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Security.Cryptography; -using System.Text; -using DigitalData.MessagingService.Domain.Common; - -namespace DigitalData.MessagingService.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; - } -}