Files
btcpayserver/BTCPayServer/Plugins/Emails/Controllers/UIServerEmailRulesController.cs
2025-11-12 08:49:48 +09:00

87 lines
3.3 KiB
C#

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<EmailTriggerViewModel> triggers,
ApplicationDbContextFactory dbContextFactory,
IStringLocalizer stringLocalizer
) : UIEmailRuleControllerBase(dbContextFactory, stringLocalizer, emailSenderFactory)
{
[HttpGet("")]
public Task<IActionResult> 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<IActionResult> ServerEmailRulesCreate(StoreEmailRuleViewModel model)
=> EmailRulesCreateCore(CreateContext(), model);
[HttpGet("{ruleId}/edit")]
public Task<IActionResult> ServerEmailRulesEdit(long ruleId, string redirectUrl = null)
=> EmailRulesEditCore(CreateContext(), ruleId, redirectUrl);
[HttpPost("{ruleId}/edit")]
public Task<IActionResult> ServerEmailRulesEdit(long ruleId, StoreEmailRuleViewModel model)
=> EmailRulesEditCore(CreateContext(), ruleId, model);
[HttpPost("{ruleId}/delete")]
public Task<IActionResult> ServerEmailRulesDelete(long ruleId, string redirectUrl = null)
=> EmailRulesDeleteCore(CreateContext(), ruleId, redirectUrl);
}