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); + } +}