From 2a939b4cad01e362928fd70318596dff02ed9381 Mon Sep 17 00:00:00 2001 From: TekH Date: Tue, 6 Oct 2026 09:26:22 +0200 Subject: [PATCH] Add filtering logic for receiver suggestions Introduce `ReceiverFilterCriteria` to encapsulate filtering criteria for receivers, including normalization of `FullName` and `EmailAddress`. Add `ReceiverSuggestionFilterHandler` to filter `RecentReceiverSuggestionDto` objects based on the criteria. Includes methods for matching criteria and filtering suggestions. --- .../ReceiverFilterCriteria.cs | 25 ++++++++++++++++++ .../ReceiverSuggestionFilterHandler.cs | 26 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/Sender/ReceiverSuggestionFilter/ReceiverFilterCriteria.cs create mode 100644 EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/Sender/ReceiverSuggestionFilter/ReceiverSuggestionFilterHandler.cs diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/Sender/ReceiverSuggestionFilter/ReceiverFilterCriteria.cs b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/Sender/ReceiverSuggestionFilter/ReceiverFilterCriteria.cs new file mode 100644 index 00000000..fe8eddfc --- /dev/null +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/Sender/ReceiverSuggestionFilter/ReceiverFilterCriteria.cs @@ -0,0 +1,25 @@ +namespace EnvelopeGenerator.Server.Client.Components.Sender.ReceiverSuggestionFilter; + +public readonly record struct ReceiverFilterCriteria +{ + public readonly string FullName; + public readonly string EmailAddress; + + public ReceiverFilterCriteria(string? fullName = "", string? emailAddress = "") + { + FullName = Normalize(fullName); + EmailAddress = Normalize(emailAddress); + } + + public readonly bool Matches(ReceiverFilterCriteria criteria) + => FullName.Contains(criteria.FullName, StringComparison.Ordinal) + && EmailAddress.Contains(criteria.EmailAddress, StringComparison.Ordinal); + + private static string Normalize(string? text) + { + if (string.IsNullOrWhiteSpace(text)) + return string.Empty; + + return string.Concat(text.Where(c => !char.IsWhiteSpace(c))).ToLowerInvariant(); + } +} diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/Sender/ReceiverSuggestionFilter/ReceiverSuggestionFilterHandler.cs b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/Sender/ReceiverSuggestionFilter/ReceiverSuggestionFilterHandler.cs new file mode 100644 index 00000000..6f76e554 --- /dev/null +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/Sender/ReceiverSuggestionFilter/ReceiverSuggestionFilterHandler.cs @@ -0,0 +1,26 @@ +using EnvelopeGenerator.Application.Common.Dto.Receiver; + +namespace EnvelopeGenerator.Server.Client.Components.Sender.ReceiverSuggestionFilter; + +public class ReceiverSuggestionFilterHandler(IEnumerable suggestions) +{ + private readonly IReadOnlyList _entries = suggestions + .Where(x => !string.IsNullOrWhiteSpace(x.FullName) && !string.IsNullOrWhiteSpace(x.EmailAddress)) + .Select(x => new Entry(new ReceiverFilterCriteria(x.FullName, x.EmailAddress), x)) + .ToList(); + + private readonly record struct Entry(ReceiverFilterCriteria Criteria, RecentReceiverSuggestionDto Suggestion); + + public IEnumerable Filter(ReceiverFilterCriteria criteria) + { + return _entries + .Where(x => x.Criteria.Matches(criteria)) + .Select(x => x.Suggestion); + } + + public IEnumerable Filter(string fullName, string emailAddress) + { + var criteria = new ReceiverFilterCriteria(fullName, emailAddress); + return Filter(criteria); + } +}