diff --git a/Finch/Mails/FileMailDispatcher.cs b/Finch/Mails/Dispatchers/FileMailDispatcher.cs similarity index 100% rename from Finch/Mails/FileMailDispatcher.cs rename to Finch/Mails/Dispatchers/FileMailDispatcher.cs diff --git a/Finch/Mails/IMailDispatcher.cs b/Finch/Mails/Dispatchers/IMailDispatcher.cs similarity index 94% rename from Finch/Mails/IMailDispatcher.cs rename to Finch/Mails/Dispatchers/IMailDispatcher.cs index 6dd5e4b5..1a74619f 100644 --- a/Finch/Mails/IMailDispatcher.cs +++ b/Finch/Mails/Dispatchers/IMailDispatcher.cs @@ -1,4 +1,4 @@ -namespace Finch.Mails; +namespace Finch.Mails.Dispatchers; public interface IMailDispatcher : IDisposable { diff --git a/Finch/Mails/LoggerMailDispatcher.cs b/Finch/Mails/Dispatchers/LoggerMailDispatcher.cs similarity index 95% rename from Finch/Mails/LoggerMailDispatcher.cs rename to Finch/Mails/Dispatchers/LoggerMailDispatcher.cs index 53239fe4..fda36f0f 100644 --- a/Finch/Mails/LoggerMailDispatcher.cs +++ b/Finch/Mails/Dispatchers/LoggerMailDispatcher.cs @@ -1,6 +1,6 @@ using Microsoft.Extensions.Logging; -namespace Finch.Mails; +namespace Finch.Mails.Dispatchers; /// /// Default implementation of an IMailSender which sends the mail to the attached logger diff --git a/Finch/Mails/Dispatchers/MailDispatcherResolver.cs b/Finch/Mails/Dispatchers/MailDispatcherResolver.cs new file mode 100644 index 00000000..b7de4f8e --- /dev/null +++ b/Finch/Mails/Dispatchers/MailDispatcherResolver.cs @@ -0,0 +1,23 @@ +namespace Finch.Mails.Dispatchers; + +public class MailDispatcherResolver(IEnumerable dispatchers) : IMailDispatcherResolver +{ + /// + public Task Resolve() + { + IMailDispatcher dispatcher = dispatchers + .OrderByDescending(x => x.Priority) + .FirstOrDefault(dispatcher => dispatcher.CanSend()); + + return Task.FromResult(dispatcher); + } +} + + +public interface IMailDispatcherResolver +{ + /// + /// Resolves a mail dispatcher to use for sending emails + /// + Task Resolve(); +} \ No newline at end of file diff --git a/Finch/Mails/Postmark/PostmarkDispatcher.cs b/Finch/Mails/Dispatchers/Postmark/PostmarkDispatcher.cs similarity index 98% rename from Finch/Mails/Postmark/PostmarkDispatcher.cs rename to Finch/Mails/Dispatchers/Postmark/PostmarkDispatcher.cs index e30d2ff6..c054a999 100644 --- a/Finch/Mails/Postmark/PostmarkDispatcher.cs +++ b/Finch/Mails/Dispatchers/Postmark/PostmarkDispatcher.cs @@ -4,13 +4,13 @@ using Microsoft.Extensions.Options; using PostmarkDotNet; using PostmarkDotNet.Model; -namespace Finch.Mails; +namespace Finch.Mails.Dispatchers.Postmark; public class PostmarkDispatcher : IMailDispatcher { /// public int Priority { get; } = 3; - + protected PostmarkClient Postmark { get; set; } protected PostmarkAdminClient PostmarkAdmin { get; set; } diff --git a/Finch/Mails/Postmark/PostmarkOptions.cs b/Finch/Mails/Dispatchers/Postmark/PostmarkOptions.cs similarity index 79% rename from Finch/Mails/Postmark/PostmarkOptions.cs rename to Finch/Mails/Dispatchers/Postmark/PostmarkOptions.cs index 43b4312b..c35bfe0a 100644 --- a/Finch/Mails/Postmark/PostmarkOptions.cs +++ b/Finch/Mails/Dispatchers/Postmark/PostmarkOptions.cs @@ -1,4 +1,4 @@ -namespace Finch.Mails; +namespace Finch.Mails.Dispatchers.Postmark; public class PostmarkOptions { diff --git a/Finch/Mails/Scaleway/ScalewayDispatcher.cs b/Finch/Mails/Dispatchers/Scaleway/ScalewayDispatcher.cs similarity index 99% rename from Finch/Mails/Scaleway/ScalewayDispatcher.cs rename to Finch/Mails/Dispatchers/Scaleway/ScalewayDispatcher.cs index 5d206695..fc84dde6 100644 --- a/Finch/Mails/Scaleway/ScalewayDispatcher.cs +++ b/Finch/Mails/Dispatchers/Scaleway/ScalewayDispatcher.cs @@ -9,13 +9,13 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Attachment = System.Net.Mail.Attachment; -namespace Finch.Mails.Scaleway; +namespace Finch.Mails.Dispatchers.Scaleway; public class ScalewayDispatcher : IMailDispatcher { /// public int Priority { get; } = 3; - + protected Queue Queue { get; } = new(); protected MailOptions Options { get; set; } diff --git a/Finch/Mails/Scaleway/ScalewayOptions.cs b/Finch/Mails/Dispatchers/Scaleway/ScalewayOptions.cs similarity index 83% rename from Finch/Mails/Scaleway/ScalewayOptions.cs rename to Finch/Mails/Dispatchers/Scaleway/ScalewayOptions.cs index 3c435fde..99690314 100644 --- a/Finch/Mails/Scaleway/ScalewayOptions.cs +++ b/Finch/Mails/Dispatchers/Scaleway/ScalewayOptions.cs @@ -1,4 +1,4 @@ -namespace Finch.Mails.Scaleway; +namespace Finch.Mails.Dispatchers.Scaleway; public class ScalewayOptions { diff --git a/Finch/Mails/Scaleway/ScalewayRequest.cs b/Finch/Mails/Dispatchers/Scaleway/ScalewayRequest.cs similarity index 96% rename from Finch/Mails/Scaleway/ScalewayRequest.cs rename to Finch/Mails/Dispatchers/Scaleway/ScalewayRequest.cs index f7d3d90e..0aa91f1f 100644 --- a/Finch/Mails/Scaleway/ScalewayRequest.cs +++ b/Finch/Mails/Dispatchers/Scaleway/ScalewayRequest.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace Finch.Mails.Scaleway; +namespace Finch.Mails.Dispatchers.Scaleway; public class ScalewayRequest { diff --git a/Finch/Mails/Scaleway/ScalewayResponse.cs b/Finch/Mails/Dispatchers/Scaleway/ScalewayResponse.cs similarity index 94% rename from Finch/Mails/Scaleway/ScalewayResponse.cs rename to Finch/Mails/Dispatchers/Scaleway/ScalewayResponse.cs index ad7d00f3..2b15de38 100644 --- a/Finch/Mails/Scaleway/ScalewayResponse.cs +++ b/Finch/Mails/Dispatchers/Scaleway/ScalewayResponse.cs @@ -1,4 +1,4 @@ -namespace Finch.Mails.Scaleway; +namespace Finch.Mails.Dispatchers.Scaleway; public class ScalewayResponse { diff --git a/Finch/Mails/FinchMailModule.cs b/Finch/Mails/FinchMailModule.cs index b83ced93..59344041 100644 --- a/Finch/Mails/FinchMailModule.cs +++ b/Finch/Mails/FinchMailModule.cs @@ -1,4 +1,6 @@ -using Finch.Mails.Scaleway; +using Finch.Mails.Dispatchers; +using Finch.Mails.Dispatchers.Postmark; +using Finch.Mails.Dispatchers.Scaleway; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -10,6 +12,7 @@ internal class FinchMailModule : FinchModule { services.AddHttpClient().RemoveAllLoggers(); services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/Finch/Mails/MailDispatcherResolver.cs b/Finch/Mails/MailDispatcherResolver.cs deleted file mode 100644 index aa62b3bd..00000000 --- a/Finch/Mails/MailDispatcherResolver.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Microsoft.Extensions.Options; - -namespace Finch.Mails; - -public class MailDispatcherResolver(IEnumerable dispatchers, IOptionsMonitor options) -{ - /// - public IMailDispatcher Resolve() - { - return dispatchers - .OrderByDescending(x => x.Priority) - .FirstOrDefault(dispatcher => dispatcher.CanSend()); - } -} \ No newline at end of file diff --git a/Finch/Mails/MailOptions.cs b/Finch/Mails/MailOptions.cs index 468c4841..0700725a 100644 --- a/Finch/Mails/MailOptions.cs +++ b/Finch/Mails/MailOptions.cs @@ -1,15 +1,10 @@ -namespace Finch.Mails; +using Finch.Mails.Dispatchers.Postmark; +using Finch.Mails.Dispatchers.Scaleway; + +namespace Finch.Mails; public class MailOptions { - //public string Host { get; set; } - - //public int Port { get; set; } - - //public string Username { get; set; } - - //public string Password { get; set; } - public string From { get; set; } public string FromName { get; set; } @@ -28,7 +23,7 @@ public class MailOptions public PostmarkOptions Postmark { get; set; } - public Scaleway.ScalewayOptions Scaleway { get; set; } + public ScalewayOptions Scaleway { get; set; } public Func BuildViewPath { get; set; } } \ No newline at end of file diff --git a/Finch/Mails/MailProvider.cs b/Finch/Mails/MailProvider.cs index 01e75e05..1845f45b 100644 --- a/Finch/Mails/MailProvider.cs +++ b/Finch/Mails/MailProvider.cs @@ -2,17 +2,18 @@ using System.Net.Mail; using System.Reflection; using System.Text; +using Finch.Mails.Dispatchers; using Microsoft.Extensions.Options; namespace Finch.Mails; -public class MailProvider(IFinchContext finch, IOptionsMonitor mailOptions, ILogger logger, IEnumerable dispatchers, IRazorRenderer renderer) : IMailProvider +public class MailProvider(IFinchContext finch, IOptionsMonitor mailOptions, ILogger logger, IMailDispatcherResolver dispatcherResolver, IRazorRenderer renderer) : IMailProvider { protected ILogger Logger { get; set; } = logger; protected IFinchContext Finch { get; set; } = finch; - protected IEnumerable Dispatchers { get; set; } = dispatchers; + protected IMailDispatcherResolver DispatcherResolver { get; set; } = dispatcherResolver; protected IRazorRenderer Renderer { get; set; } = renderer; @@ -24,7 +25,8 @@ public class MailProvider(IFinchContext finch, IOptionsMonitor mail /// public virtual async Task Send(Mail message, CancellationToken token = default) { - await Send(message, GetDispatcher(), token); + IMailDispatcher dispatcher = await DispatcherResolver.Resolve(); + await Send(message, dispatcher, token); } @@ -88,15 +90,6 @@ public class MailProvider(IFinchContext finch, IOptionsMonitor mail message.IsRendered = true; return message.Body; } - - - /// - protected IMailDispatcher GetDispatcher() - { - return Dispatchers - .OrderByDescending(x => x.Priority) - .FirstOrDefault(dispatcher => dispatcher.CanSend()); - } }