using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using BTCPayServer.Abstractions.Constants; using BTCPayServer.Abstractions.Extensions; using BTCPayServer.Abstractions.Models; using BTCPayServer.Client; using BTCPayServer.Controllers; using BTCPayServer.Data; using BTCPayServer.Plugins.Emails.Views; using BTCPayServer.Plugins.Emails.Views.Shared; using BTCPayServer.Services.Mails; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Routing; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Localization; namespace BTCPayServer.Plugins.Emails.Controllers; [Area(EmailsPlugin.Area)] [Route("server/rules")] [Authorize(AuthenticationSchemes = AuthenticationSchemes.Cookie)] [Authorize(Policy = Policies.CanModifyServerSettings, AuthenticationSchemes = AuthenticationSchemes.Cookie)] [AutoValidateAntiforgeryToken] public class UIServerEmailRulesController( EmailSenderFactory emailSenderFactory, IEnumerable triggers, ApplicationDbContextFactory dbContextFactory, IStringLocalizer stringLocalizer ) : UIEmailRuleControllerBase(dbContextFactory, stringLocalizer, emailSenderFactory) { [HttpGet("")] public Task ServerEmailRulesList() => EmailRulesListCore(CreateContext()); private EmailsRuleControllerContext CreateContext() => new() { EmailSettingsLink = Url.Action(nameof(UIServerEmailController.ServerEmailSettings), "UIServerEmail") ?? throw new InvalidOperationException("Bug 1928"), Rules = (ctx) => ctx.EmailRules.GetServerRules().ToListAsync(), Triggers = triggers.Where(t => t.ServerTrigger).ToList(), ModifyViewModel = (vm) => { vm.ShowCustomerEmailColumn = false; vm.ModifyPermission = Policies.CanModifyServerSettings; }, GetRule = (ctx, ruleId) => ctx.EmailRules.GetServerRule(ruleId), RedirectToRuleList = GoToServerRulesList }; private IActionResult GoToServerRulesList(string redirectUrl) { if (redirectUrl != null) return LocalRedirect(redirectUrl); return RedirectToAction(nameof(ServerEmailRulesList)); } [HttpGet("create")] public IActionResult ServerEmailRulesCreate( string trigger = null, string condition = null, string to = null, string redirectUrl = null) => EmailRulesCreateCore(CreateContext(), null, trigger, condition, to, redirectUrl); [HttpPost("create")] public Task ServerEmailRulesCreate(StoreEmailRuleViewModel model) => EmailRulesCreateCore(CreateContext(), model); [HttpGet("{ruleId}/edit")] public Task ServerEmailRulesEdit(long ruleId, string redirectUrl = null) => EmailRulesEditCore(CreateContext(), ruleId, redirectUrl); [HttpPost("{ruleId}/edit")] public Task ServerEmailRulesEdit(long ruleId, StoreEmailRuleViewModel model) => EmailRulesEditCore(CreateContext(), ruleId, model); [HttpPost("{ruleId}/delete")] public Task ServerEmailRulesDelete(long ruleId, string redirectUrl = null) => EmailRulesDeleteCore(CreateContext(), ruleId, redirectUrl); }