diff --git a/aspnet-core/services/LY.MicroService.Applications.Single/Messages/PlatformEmailSettingsAppService.cs b/aspnet-core/services/LY.MicroService.Applications.Single/Messages/PlatformEmailSettingsAppService.cs new file mode 100644 index 000000000..571a6d056 --- /dev/null +++ b/aspnet-core/services/LY.MicroService.Applications.Single/Messages/PlatformEmailSettingsAppService.cs @@ -0,0 +1,89 @@ +using Microsoft.AspNetCore.Authorization; +using Volo.Abp.Emailing; +using SendTestEmailInput = Volo.Abp.SettingManagement.SendTestEmailInput; +using SettingManagementPermissions = Volo.Abp.SettingManagement.SettingManagementPermissions; + +namespace LY.MicroService.Applications.Single.Messages; + +[Authorize(SettingManagementPermissions.Emailing)] +public class PlatformEmailSettingsAppService : SettingManagementAppServiceBase, IEmailSettingsAppService +{ + protected ISettingManager SettingManager { get; } + + protected IEmailSender EmailSender { get; } + + public PlatformEmailSettingsAppService(ISettingManager settingManager, IEmailSender emailSender) + { + SettingManager = settingManager; + EmailSender = emailSender; + } + + public virtual async Task GetAsync() + { + await CheckFeatureAsync(); + + var settingsDto = new EmailSettingsDto + { + SmtpHost = await SettingProvider.GetOrNullAsync(EmailSettingNames.Smtp.Host), + SmtpPort = Convert.ToInt32(await SettingProvider.GetOrNullAsync(EmailSettingNames.Smtp.Port)), + SmtpUserName = await SettingProvider.GetOrNullAsync(EmailSettingNames.Smtp.UserName), + SmtpDomain = await SettingProvider.GetOrNullAsync(EmailSettingNames.Smtp.Domain), + SmtpEnableSsl = Convert.ToBoolean(await SettingProvider.GetOrNullAsync(EmailSettingNames.Smtp.EnableSsl)), + SmtpUseDefaultCredentials = Convert.ToBoolean(await SettingProvider.GetOrNullAsync(EmailSettingNames.Smtp.UseDefaultCredentials)), + DefaultFromAddress = await SettingProvider.GetOrNullAsync(EmailSettingNames.DefaultFromAddress), + DefaultFromDisplayName = await SettingProvider.GetOrNullAsync(EmailSettingNames.DefaultFromDisplayName), + }; + + if (CurrentTenant.IsAvailable) + { + settingsDto.SmtpHost = await SettingManager.GetOrNullForTenantAsync(EmailSettingNames.Smtp.Host, CurrentTenant.GetId(), false); + settingsDto.SmtpUserName = await SettingManager.GetOrNullForTenantAsync(EmailSettingNames.Smtp.UserName, CurrentTenant.GetId(), false); + settingsDto.SmtpDomain = await SettingManager.GetOrNullForTenantAsync(EmailSettingNames.Smtp.Domain, CurrentTenant.GetId(), false); + } + + return settingsDto; + } + + public virtual async Task UpdateAsync(UpdateEmailSettingsDto input) + { + await CheckFeatureAsync(); + + await SettingManager.SetForTenantOrGlobalAsync(CurrentTenant.Id, EmailSettingNames.Smtp.Host, input.SmtpHost); + await SettingManager.SetForTenantOrGlobalAsync(CurrentTenant.Id, EmailSettingNames.Smtp.Port, input.SmtpPort.ToString()); + await SettingManager.SetForTenantOrGlobalAsync(CurrentTenant.Id, EmailSettingNames.Smtp.UserName, input.SmtpUserName); + if (!input.SmtpPassword.IsNullOrWhiteSpace()) + { + await SettingManager.SetForTenantOrGlobalAsync(CurrentTenant.Id, EmailSettingNames.Smtp.Password, input.SmtpPassword); + } + await SettingManager.SetForTenantOrGlobalAsync(CurrentTenant.Id, EmailSettingNames.Smtp.Domain, input.SmtpDomain); + await SettingManager.SetForTenantOrGlobalAsync(CurrentTenant.Id, EmailSettingNames.Smtp.EnableSsl, input.SmtpEnableSsl.ToString()); + await SettingManager.SetForTenantOrGlobalAsync(CurrentTenant.Id, EmailSettingNames.Smtp.UseDefaultCredentials, input.SmtpUseDefaultCredentials.ToString().ToLowerInvariant()); + await SettingManager.SetForTenantOrGlobalAsync(CurrentTenant.Id, EmailSettingNames.DefaultFromAddress, input.DefaultFromAddress); + await SettingManager.SetForTenantOrGlobalAsync(CurrentTenant.Id, EmailSettingNames.DefaultFromDisplayName, input.DefaultFromDisplayName); + } + + [Authorize(SettingManagementPermissions.EmailingTest)] + public virtual async Task SendTestEmailAsync(SendTestEmailInput input) + { + await CheckFeatureAsync(); + + try + { + await EmailSender.SendAsync(input.SenderEmailAddress, input.TargetEmailAddress, input.Subject, input.Body); + } + catch (Exception e) + { + Logger.LogError("Error sending test email: " + e); + throw new UserFriendlyException(L["MailSendingFailed"]); + } + } + + protected virtual async Task CheckFeatureAsync() + { + await FeatureChecker.CheckEnabledAsync(SettingManagementFeatures.Enable); + if (CurrentTenant.IsAvailable) + { + await FeatureChecker.CheckEnabledAsync(SettingManagementFeatures.AllowChangingEmailSettings); + } + } +}