Rename PaymentModel to CheckoutModel

This commit is contained in:
nicolas.dorier 2024-10-07 19:58:08 +09:00
parent 2f287874e3
commit 968223a953
No known key found for this signature in database
GPG key ID: 6618763EF09186FE
25 changed files with 75 additions and 97 deletions

View file

@ -320,7 +320,7 @@ namespace BTCPayServer.Tests
var controller = tester.PayTester.GetController<UIInvoiceController>(null); var controller = tester.PayTester.GetController<UIInvoiceController>(null);
var checkout = var checkout =
(Models.InvoicingModels.PaymentModel)((JsonResult)controller.GetStatus(invoice.Id) (Models.InvoicingModels.CheckoutModel)((JsonResult)controller.GetStatus(invoice.Id)
.GetAwaiter().GetResult()).Value; .GetAwaiter().GetResult()).Value;
Assert.Single(checkout.AvailableCryptos); Assert.Single(checkout.AvailableCryptos);
Assert.Equal("LTC", checkout.PaymentMethodCurrency); Assert.Equal("LTC", checkout.PaymentMethodCurrency);
@ -337,7 +337,7 @@ namespace BTCPayServer.Tests
{ {
invoice = user.BitPay.GetInvoice(invoice.Id); invoice = user.BitPay.GetInvoice(invoice.Id);
Assert.Equal("paid", invoice.Status); Assert.Equal("paid", invoice.Status);
checkout = (Models.InvoicingModels.PaymentModel)((JsonResult)controller.GetStatus(invoice.Id) checkout = (Models.InvoicingModels.CheckoutModel)((JsonResult)controller.GetStatus(invoice.Id)
.GetAwaiter().GetResult()).Value; .GetAwaiter().GetResult()).Value;
Assert.Equal("Processing", checkout.Status); Assert.Equal("Processing", checkout.Status);
}); });
@ -475,7 +475,7 @@ namespace BTCPayServer.Tests
var controller = tester.PayTester.GetController<UIInvoiceController>(null); var controller = tester.PayTester.GetController<UIInvoiceController>(null);
var checkout = var checkout =
(Models.InvoicingModels.PaymentModel)((JsonResult)controller.GetStatus(invoice.Id, null) (Models.InvoicingModels.CheckoutModel)((JsonResult)controller.GetStatus(invoice.Id, null)
.GetAwaiter().GetResult()).Value; .GetAwaiter().GetResult()).Value;
Assert.Single(checkout.AvailableCryptos); Assert.Single(checkout.AvailableCryptos);
Assert.Equal("BTC", checkout.PaymentMethodCurrency); Assert.Equal("BTC", checkout.PaymentMethodCurrency);
@ -536,7 +536,7 @@ namespace BTCPayServer.Tests
}); });
controller = tester.PayTester.GetController<UIInvoiceController>(null); controller = tester.PayTester.GetController<UIInvoiceController>(null);
checkout = (Models.InvoicingModels.PaymentModel)((JsonResult)controller.GetStatus(invoice.Id, "LTC") checkout = (Models.InvoicingModels.CheckoutModel)((JsonResult)controller.GetStatus(invoice.Id, "LTC")
.GetAwaiter().GetResult()).Value; .GetAwaiter().GetResult()).Value;
Assert.Equal(2, checkout.AvailableCryptos.Count); Assert.Equal(2, checkout.AvailableCryptos.Count);
Assert.Equal("LTC", checkout.PaymentMethodCurrency); Assert.Equal("LTC", checkout.PaymentMethodCurrency);

View file

@ -2733,7 +2733,7 @@ namespace BTCPayServer.Tests
Assert.EndsWith($"/i/{newInvoice.Id}", newInvoice.CheckoutLink); Assert.EndsWith($"/i/{newInvoice.Id}", newInvoice.CheckoutLink);
var controller = tester.PayTester.GetController<UIInvoiceController>(user.UserId, user.StoreId); var controller = tester.PayTester.GetController<UIInvoiceController>(user.UserId, user.StoreId);
var model = (PaymentModel)((ViewResult)await controller.Checkout(newInvoice.Id)).Model; var model = (CheckoutModel)((ViewResult)await controller.Checkout(newInvoice.Id)).Model;
Assert.Equal("it-IT", model.DefaultLang); Assert.Equal("it-IT", model.DefaultLang);
Assert.Equal("http://toto.com/lol", model.MerchantRefLink); Assert.Equal("http://toto.com/lol", model.MerchantRefLink);

View file

@ -1587,14 +1587,14 @@ namespace BTCPayServer.Tests
ItemDesc = "Some description", ItemDesc = "Some description",
FullNotifications = true FullNotifications = true
}, Facade.Merchant); }, Facade.Merchant);
var checkout = (await user.GetController<UIInvoiceController>().Checkout(invoice.Id)).AssertViewModel<PaymentModel>(); var checkout = (await user.GetController<UIInvoiceController>().Checkout(invoice.Id)).AssertViewModel<CheckoutModel>();
Assert.Equal(lnMethod, checkout.PaymentMethodId); Assert.Equal(lnMethod, checkout.PaymentMethodId);
// If we change store's default, it should change the checkout's default // If we change store's default, it should change the checkout's default
vm.DefaultPaymentMethod = btcMethod; vm.DefaultPaymentMethod = btcMethod;
Assert.IsType<RedirectToActionResult>(user.GetController<UIStoresController>().CheckoutAppearance(vm) Assert.IsType<RedirectToActionResult>(user.GetController<UIStoresController>().CheckoutAppearance(vm)
.Result); .Result);
checkout = (await user.GetController<UIInvoiceController>().Checkout(invoice.Id)).AssertViewModel<PaymentModel>(); checkout = (await user.GetController<UIInvoiceController>().Checkout(invoice.Id)).AssertViewModel<CheckoutModel>();
Assert.Equal(btcMethod, checkout.PaymentMethodId); Assert.Equal(btcMethod, checkout.PaymentMethodId);
} }
@ -1625,7 +1625,7 @@ namespace BTCPayServer.Tests
// validate that invoice data model doesn't have lightning string initially // validate that invoice data model doesn't have lightning string initially
var res = await user.GetController<UIInvoiceController>().Checkout(invoice.Id); var res = await user.GetController<UIInvoiceController>().Checkout(invoice.Id);
var paymentMethodFirst = Assert.IsType<PaymentModel>( var paymentMethodFirst = Assert.IsType<CheckoutModel>(
Assert.IsType<ViewResult>(res).Model Assert.IsType<ViewResult>(res).Model
); );
Assert.DoesNotContain("&lightning=", paymentMethodFirst.InvoiceBitcoinUrlQR); Assert.DoesNotContain("&lightning=", paymentMethodFirst.InvoiceBitcoinUrlQR);
@ -1641,7 +1641,7 @@ namespace BTCPayServer.Tests
// validate that QR code now has both onchain and offchain payment urls // validate that QR code now has both onchain and offchain payment urls
res = await user.GetController<UIInvoiceController>().Checkout(invoice.Id); res = await user.GetController<UIInvoiceController>().Checkout(invoice.Id);
var paymentMethodUnified = Assert.IsType<PaymentModel>( var paymentMethodUnified = Assert.IsType<CheckoutModel>(
Assert.IsType<ViewResult>(res).Model Assert.IsType<ViewResult>(res).Model
); );
Assert.StartsWith("bitcoin:bcrt", paymentMethodUnified.InvoiceBitcoinUrl); Assert.StartsWith("bitcoin:bcrt", paymentMethodUnified.InvoiceBitcoinUrl);

View file

@ -1,6 +1,6 @@
@using BTCPayServer.Payments @using BTCPayServer.Payments
@model BTCPayServer.Components.InvoiceStatus.InvoiceStatusViewModel @model BTCPayServer.Components.InvoiceStatus.InvoiceStatusViewModel
@inject Dictionary<PaymentMethodId, IPaymentModelExtension> Extensions @inject Dictionary<PaymentMethodId, ICheckoutModelExtension> Extensions
@{ @{
var state = Model.State.ToString(); var state = Model.State.ToString();

View file

@ -694,7 +694,7 @@ namespace BTCPayServer.Controllers
if (invoiceId is null) if (invoiceId is null)
return NotFound(); return NotFound();
var model = await GetInvoiceModel(invoiceId, paymentMethodId == null ? null : PaymentMethodId.Parse(paymentMethodId), lang); var model = await GetCheckoutModel(invoiceId, paymentMethodId == null ? null : PaymentMethodId.Parse(paymentMethodId), lang);
if (model == null) if (model == null)
{ {
// see if the invoice actually exists and is in a state for which we do not display the checkout // see if the invoice actually exists and is in a state for which we do not display the checkout
@ -713,7 +713,7 @@ namespace BTCPayServer.Controllers
return View(model); return View(model);
} }
private async Task<PaymentModel?> GetInvoiceModel(string invoiceId, PaymentMethodId? paymentMethodId, string? lang) private async Task<CheckoutModel?> GetCheckoutModel(string invoiceId, PaymentMethodId? paymentMethodId, string? lang)
{ {
var invoice = await _InvoiceRepository.GetInvoice(invoiceId); var invoice = await _InvoiceRepository.GetInvoice(invoiceId);
if (invoice == null) if (invoice == null)
@ -822,7 +822,7 @@ namespace BTCPayServer.Controllers
if (prompt is null) if (prompt is null)
return null; return null;
if (activated) if (activated)
return await GetInvoiceModel(invoiceId, paymentMethodId, lang); return await GetCheckoutModel(invoiceId, paymentMethodId, lang);
var accounting = prompt.Calculate(); var accounting = prompt.Calculate();
@ -863,7 +863,7 @@ namespace BTCPayServer.Controllers
} }
string ShowMoney(decimal value) => MoneyExtensions.ShowMoney(value, prompt.RateDivisibility ?? prompt.Divisibility); string ShowMoney(decimal value) => MoneyExtensions.ShowMoney(value, prompt.RateDivisibility ?? prompt.Divisibility);
var model = new PaymentModel var model = new CheckoutModel
{ {
Activated = prompt.Activated, Activated = prompt.Activated,
PaymentMethodName = _prettyName.PrettyName(paymentMethodId), PaymentMethodName = _prettyName.PrettyName(paymentMethodId),
@ -914,7 +914,7 @@ namespace BTCPayServer.Controllers
.Select(kv => .Select(kv =>
{ {
var handler = _handlers[kv.PaymentMethodId]; var handler = _handlers[kv.PaymentMethodId];
return new PaymentModel.AvailableCrypto return new CheckoutModel.AvailableCrypto
{ {
Displayed = displayedPaymentMethods.Contains(kv.PaymentMethodId), Displayed = displayedPaymentMethods.Contains(kv.PaymentMethodId),
PaymentMethodId = kv.PaymentMethodId, PaymentMethodId = kv.PaymentMethodId,
@ -950,7 +950,7 @@ namespace BTCPayServer.Controllers
if (_paymentModelExtensions.TryGetValue(paymentMethodId, out var extension) && if (_paymentModelExtensions.TryGetValue(paymentMethodId, out var extension) &&
_handlers.TryGetValue(paymentMethodId, out var h)) _handlers.TryGetValue(paymentMethodId, out var h))
{ {
extension.ModifyPaymentModel(new PaymentModelContext(model, store, storeBlob, invoice, Url, prompt, h)); extension.ModifyCheckoutModel(new CheckoutModelContext(model, store, storeBlob, invoice, Url, prompt, h));
} }
return model; return model;
} }
@ -987,7 +987,7 @@ namespace BTCPayServer.Controllers
{ {
if (string.IsNullOrEmpty(paymentMethodId)) if (string.IsNullOrEmpty(paymentMethodId))
paymentMethodId = implicitPaymentMethodId; paymentMethodId = implicitPaymentMethodId;
var model = await GetInvoiceModel(invoiceId, paymentMethodId == null ? null : PaymentMethodId.Parse(paymentMethodId), lang); var model = await GetCheckoutModel(invoiceId, paymentMethodId == null ? null : PaymentMethodId.Parse(paymentMethodId), lang);
if (model == null) if (model == null)
return NotFound(); return NotFound();
return Json(model); return Json(model);

View file

@ -62,7 +62,7 @@ namespace BTCPayServer.Controllers
private readonly LinkGenerator _linkGenerator; private readonly LinkGenerator _linkGenerator;
private readonly IAuthorizationService _authorizationService; private readonly IAuthorizationService _authorizationService;
private readonly TransactionLinkProviders _transactionLinkProviders; private readonly TransactionLinkProviders _transactionLinkProviders;
private readonly Dictionary<PaymentMethodId, IPaymentModelExtension> _paymentModelExtensions; private readonly Dictionary<PaymentMethodId, ICheckoutModelExtension> _paymentModelExtensions;
private readonly PrettyNameProvider _prettyName; private readonly PrettyNameProvider _prettyName;
private readonly AppService _appService; private readonly AppService _appService;
private readonly IFileService _fileService; private readonly IFileService _fileService;
@ -97,7 +97,7 @@ namespace BTCPayServer.Controllers
DefaultRulesCollection defaultRules, DefaultRulesCollection defaultRules,
IAuthorizationService authorizationService, IAuthorizationService authorizationService,
TransactionLinkProviders transactionLinkProviders, TransactionLinkProviders transactionLinkProviders,
Dictionary<PaymentMethodId, IPaymentModelExtension> paymentModelExtensions, Dictionary<PaymentMethodId, ICheckoutModelExtension> paymentModelExtensions,
PrettyNameProvider prettyName) PrettyNameProvider prettyName)
{ {
_displayFormatter = displayFormatter; _displayFormatter = displayFormatter;

View file

@ -21,13 +21,13 @@ namespace BTCPayServer.Controllers
public class UIPublicLightningNodeInfoController : Controller public class UIPublicLightningNodeInfoController : Controller
{ {
private readonly BTCPayNetworkProvider _BtcPayNetworkProvider; private readonly BTCPayNetworkProvider _BtcPayNetworkProvider;
private readonly Dictionary<PaymentMethodId, IPaymentModelExtension> _paymentModelExtensions; private readonly Dictionary<PaymentMethodId, ICheckoutModelExtension> _paymentModelExtensions;
private readonly UriResolver _uriResolver; private readonly UriResolver _uriResolver;
private readonly PaymentMethodHandlerDictionary _handlers; private readonly PaymentMethodHandlerDictionary _handlers;
private readonly StoreRepository _StoreRepository; private readonly StoreRepository _StoreRepository;
public UIPublicLightningNodeInfoController(BTCPayNetworkProvider btcPayNetworkProvider, public UIPublicLightningNodeInfoController(BTCPayNetworkProvider btcPayNetworkProvider,
Dictionary<PaymentMethodId, IPaymentModelExtension> paymentModelExtensions, Dictionary<PaymentMethodId, ICheckoutModelExtension> paymentModelExtensions,
UriResolver uriResolver, UriResolver uriResolver,
PaymentMethodHandlerDictionary handlers, PaymentMethodHandlerDictionary handlers,
StoreRepository storeRepository) StoreRepository storeRepository)

View file

@ -70,7 +70,7 @@ namespace BTCPayServer.Controllers
private readonly LabelService _labelService; private readonly LabelService _labelService;
private readonly PaymentMethodHandlerDictionary _handlers; private readonly PaymentMethodHandlerDictionary _handlers;
private readonly DefaultRulesCollection _defaultRules; private readonly DefaultRulesCollection _defaultRules;
private readonly Dictionary<PaymentMethodId, IPaymentModelExtension> _paymentModelExtensions; private readonly Dictionary<PaymentMethodId, ICheckoutModelExtension> _paymentModelExtensions;
private readonly TransactionLinkProviders _transactionLinkProviders; private readonly TransactionLinkProviders _transactionLinkProviders;
private readonly PullPaymentHostedService _pullPaymentHostedService; private readonly PullPaymentHostedService _pullPaymentHostedService;
private readonly WalletHistogramService _walletHistogramService; private readonly WalletHistogramService _walletHistogramService;
@ -98,7 +98,7 @@ namespace BTCPayServer.Controllers
LabelService labelService, LabelService labelService,
DefaultRulesCollection defaultRules, DefaultRulesCollection defaultRules,
PaymentMethodHandlerDictionary handlers, PaymentMethodHandlerDictionary handlers,
Dictionary<PaymentMethodId, IPaymentModelExtension> paymentModelExtensions, Dictionary<PaymentMethodId, ICheckoutModelExtension> paymentModelExtensions,
TransactionLinkProviders transactionLinkProviders) TransactionLinkProviders transactionLinkProviders)
{ {
_currencyTable = currencyTable; _currencyTable = currencyTable;

View file

@ -390,8 +390,8 @@ namespace BTCPayServer.Hosting
o.GetRequiredService<IEnumerable<IPaymentMethodBitpayAPIExtension>>().ToDictionary(o => o.PaymentMethodId, o => o)); o.GetRequiredService<IEnumerable<IPaymentMethodBitpayAPIExtension>>().ToDictionary(o => o.PaymentMethodId, o => o));
services.AddSingleton<Dictionary<PaymentMethodId, IPaymentLinkExtension>>(o => services.AddSingleton<Dictionary<PaymentMethodId, IPaymentLinkExtension>>(o =>
o.GetRequiredService<IEnumerable<IPaymentLinkExtension>>().ToDictionary(o => o.PaymentMethodId, o => o)); o.GetRequiredService<IEnumerable<IPaymentLinkExtension>>().ToDictionary(o => o.PaymentMethodId, o => o));
services.AddSingleton<Dictionary<PaymentMethodId, IPaymentModelExtension>>(o => services.AddSingleton<Dictionary<PaymentMethodId, ICheckoutModelExtension>>(o =>
o.GetRequiredService<IEnumerable<IPaymentModelExtension>>().ToDictionary(o => o.PaymentMethodId, o => o)); o.GetRequiredService<IEnumerable<ICheckoutModelExtension>>().ToDictionary(o => o.PaymentMethodId, o => o));
services.AddHttpClient(LightningLikePayoutHandler.LightningLikePayoutHandlerOnionNamedClient) services.AddHttpClient(LightningLikePayoutHandler.LightningLikePayoutHandlerOnionNamedClient)
.ConfigurePrimaryHttpMessageHandler<Socks5HttpClientHandler>(); .ConfigurePrimaryHttpMessageHandler<Socks5HttpClientHandler>();
@ -630,8 +630,8 @@ o.GetRequiredService<IEnumerable<IPaymentLinkExtension>>().ToDictionary(o => o.P
(BitcoinLikePaymentHandler)ActivatorUtilities.CreateInstance(provider, typeof(BitcoinLikePaymentHandler), new object[] { network, pmi })); (BitcoinLikePaymentHandler)ActivatorUtilities.CreateInstance(provider, typeof(BitcoinLikePaymentHandler), new object[] { network, pmi }));
services.AddSingleton<IPaymentLinkExtension>(provider => services.AddSingleton<IPaymentLinkExtension>(provider =>
(IPaymentLinkExtension)ActivatorUtilities.CreateInstance(provider, typeof(BitcoinPaymentLinkExtension), new object[] { network, pmi })); (IPaymentLinkExtension)ActivatorUtilities.CreateInstance(provider, typeof(BitcoinPaymentLinkExtension), new object[] { network, pmi }));
services.AddSingleton<IPaymentModelExtension>(provider => services.AddSingleton<ICheckoutModelExtension>(provider =>
(BitcoinPaymentModelExtension)ActivatorUtilities.CreateInstance(provider, typeof(BitcoinPaymentModelExtension), new object[] { network, pmi })); (BitcoinCheckoutModelExtension)ActivatorUtilities.CreateInstance(provider, typeof(BitcoinCheckoutModelExtension), new object[] { network, pmi }));
services.AddSingleton<IPaymentMethodBitpayAPIExtension>(provider => services.AddSingleton<IPaymentMethodBitpayAPIExtension>(provider =>
(IPaymentMethodBitpayAPIExtension)ActivatorUtilities.CreateInstance(provider, typeof(BitcoinPaymentMethodBitpayAPIExtension), new object[] { pmi })); (IPaymentMethodBitpayAPIExtension)ActivatorUtilities.CreateInstance(provider, typeof(BitcoinPaymentMethodBitpayAPIExtension), new object[] { pmi }));
@ -651,8 +651,8 @@ o.GetRequiredService<IEnumerable<IPaymentLinkExtension>>().ToDictionary(o => o.P
(LightningLikePaymentHandler)ActivatorUtilities.CreateInstance(provider, typeof(LightningLikePaymentHandler), new object[] { network, pmi })); (LightningLikePaymentHandler)ActivatorUtilities.CreateInstance(provider, typeof(LightningLikePaymentHandler), new object[] { network, pmi }));
services.AddSingleton<IPaymentLinkExtension>(provider => services.AddSingleton<IPaymentLinkExtension>(provider =>
(IPaymentLinkExtension)ActivatorUtilities.CreateInstance(provider, typeof(LightningPaymentLinkExtension), new object[] { network, pmi })); (IPaymentLinkExtension)ActivatorUtilities.CreateInstance(provider, typeof(LightningPaymentLinkExtension), new object[] { network, pmi }));
services.AddSingleton<IPaymentModelExtension>(provider => services.AddSingleton<ICheckoutModelExtension>(provider =>
(IPaymentModelExtension)ActivatorUtilities.CreateInstance(provider, typeof(LightningPaymentModelExtension), new object[] { network, pmi })); (ICheckoutModelExtension)ActivatorUtilities.CreateInstance(provider, typeof(LNCheckoutModelExtension), new object[] { network, pmi }));
services.AddSingleton<IPaymentMethodBitpayAPIExtension>(provider => services.AddSingleton<IPaymentMethodBitpayAPIExtension>(provider =>
(IPaymentMethodBitpayAPIExtension)ActivatorUtilities.CreateInstance(provider, typeof(LightningPaymentMethodBitpayAPIExtension), new object[] { pmi })); (IPaymentMethodBitpayAPIExtension)ActivatorUtilities.CreateInstance(provider, typeof(LightningPaymentMethodBitpayAPIExtension), new object[] { pmi }));
var payoutMethodId = PayoutTypes.LN.GetPayoutMethodId(network.CryptoCode); var payoutMethodId = PayoutTypes.LN.GetPayoutMethodId(network.CryptoCode);
@ -666,8 +666,8 @@ o.GetRequiredService<IEnumerable<IPaymentLinkExtension>>().ToDictionary(o => o.P
(LNURLPayPaymentHandler)ActivatorUtilities.CreateInstance(provider, typeof(LNURLPayPaymentHandler), new object[] { network, pmi })); (LNURLPayPaymentHandler)ActivatorUtilities.CreateInstance(provider, typeof(LNURLPayPaymentHandler), new object[] { network, pmi }));
services.AddSingleton<IPaymentLinkExtension>(provider => services.AddSingleton<IPaymentLinkExtension>(provider =>
(IPaymentLinkExtension)ActivatorUtilities.CreateInstance(provider, typeof(LNURLPayPaymentLinkExtension), new object[] { network, pmi })); (IPaymentLinkExtension)ActivatorUtilities.CreateInstance(provider, typeof(LNURLPayPaymentLinkExtension), new object[] { network, pmi }));
services.AddSingleton<IPaymentModelExtension>(provider => services.AddSingleton<ICheckoutModelExtension>(provider =>
(IPaymentModelExtension)ActivatorUtilities.CreateInstance(provider, typeof(LNURLPayPaymentModelExtension), new object[] { network, pmi })); (ICheckoutModelExtension)ActivatorUtilities.CreateInstance(provider, typeof(LNURLCheckoutModelExtension), new object[] { network, pmi }));
services.AddSingleton<IPaymentMethodBitpayAPIExtension>(provider => services.AddSingleton<IPaymentMethodBitpayAPIExtension>(provider =>
(IPaymentMethodBitpayAPIExtension)ActivatorUtilities.CreateInstance(provider, typeof(LNURLPayPaymentMethodBitpayAPIExtension), new object[] { pmi })); (IPaymentMethodBitpayAPIExtension)ActivatorUtilities.CreateInstance(provider, typeof(LNURLPayPaymentMethodBitpayAPIExtension), new object[] { pmi }));
} }

View file

@ -7,7 +7,7 @@ using Newtonsoft.Json.Linq;
namespace BTCPayServer.Models.InvoicingModels namespace BTCPayServer.Models.InvoicingModels
{ {
public class PaymentModel public class CheckoutModel
{ {
public string CheckoutBodyComponentName { get; set; } public string CheckoutBodyComponentName { get; set; }
public class AvailableCrypto public class AvailableCrypto

View file

@ -12,7 +12,7 @@ using NBitcoin.DataEncoders;
namespace BTCPayServer.Payments.Bitcoin namespace BTCPayServer.Payments.Bitcoin
{ {
public class BitcoinPaymentModelExtension : IPaymentModelExtension public class BitcoinCheckoutModelExtension : ICheckoutModelExtension
{ {
public const string CheckoutBodyComponentName = "BitcoinCheckoutBody"; public const string CheckoutBodyComponentName = "BitcoinCheckoutBody";
private readonly PaymentMethodHandlerDictionary _handlers; private readonly PaymentMethodHandlerDictionary _handlers;
@ -23,7 +23,7 @@ namespace BTCPayServer.Payments.Bitcoin
private readonly IPaymentLinkExtension? lnurlPaymentLinkExtension; private readonly IPaymentLinkExtension? lnurlPaymentLinkExtension;
private readonly string? _bech32Prefix; private readonly string? _bech32Prefix;
public BitcoinPaymentModelExtension( public BitcoinCheckoutModelExtension(
PaymentMethodId paymentMethodId, PaymentMethodId paymentMethodId,
BTCPayNetwork network, BTCPayNetwork network,
IEnumerable<IPaymentLinkExtension> paymentLinkExtensions, IEnumerable<IPaymentLinkExtension> paymentLinkExtensions,
@ -45,7 +45,7 @@ namespace BTCPayServer.Payments.Bitcoin
public string Image => _Network.CryptoImagePath; public string Image => _Network.CryptoImagePath;
public string Badge => ""; public string Badge => "";
public PaymentMethodId PaymentMethodId { get; } public PaymentMethodId PaymentMethodId { get; }
public void ModifyPaymentModel(PaymentModelContext context) public void ModifyCheckoutModel(CheckoutModelContext context)
{ {
if (context is not { Handler: BitcoinLikePaymentHandler handler}) if (context is not { Handler: BitcoinLikePaymentHandler handler})
return; return;
@ -138,7 +138,7 @@ namespace BTCPayServer.Payments.Bitcoin
} }
} }
public static void PreparePaymentModelForAmountInSats(PaymentModel model, decimal rate, DisplayFormatter displayFormatter) public static void PreparePaymentModelForAmountInSats(CheckoutModel model, decimal rate, DisplayFormatter displayFormatter)
{ {
var satoshiCulture = new CultureInfo(CultureInfo.InvariantCulture.Name) var satoshiCulture = new CultureInfo(CultureInfo.InvariantCulture.Name)
{ {

View file

@ -4,20 +4,20 @@ using Microsoft.AspNetCore.Mvc;
namespace BTCPayServer.Payments namespace BTCPayServer.Payments
{ {
public record PaymentModelContext( public record CheckoutModelContext(
PaymentModel Model, CheckoutModel Model,
Data.StoreData Store, Data.StoreData Store,
Data.StoreBlob StoreBlob, Data.StoreBlob StoreBlob,
InvoiceEntity InvoiceEntity, InvoiceEntity InvoiceEntity,
IUrlHelper UrlHelper, IUrlHelper UrlHelper,
PaymentPrompt Prompt, PaymentPrompt Prompt,
IPaymentMethodHandler Handler); IPaymentMethodHandler Handler);
public interface IPaymentModelExtension public interface ICheckoutModelExtension
{ {
public PaymentMethodId PaymentMethodId { get; } public PaymentMethodId PaymentMethodId { get; }
string DisplayName { get; } string DisplayName { get; }
string Image { get; } string Image { get; }
string Badge { get; } string Badge { get; }
void ModifyPaymentModel(PaymentModelContext context); void ModifyCheckoutModel(CheckoutModelContext context);
} }
} }

View file

@ -8,9 +8,9 @@ using NBitcoin;
namespace BTCPayServer.Payments.LNURLPay namespace BTCPayServer.Payments.LNURLPay
{ {
public class LNURLPayPaymentModelExtension : IPaymentModelExtension public class LNURLCheckoutModelExtension : ICheckoutModelExtension
{ {
public LNURLPayPaymentModelExtension( public LNURLCheckoutModelExtension(
PaymentMethodId paymentMethodId, PaymentMethodId paymentMethodId,
BTCPayNetwork network, BTCPayNetwork network,
DisplayFormatter displayFormatter, DisplayFormatter displayFormatter,
@ -37,7 +37,7 @@ namespace BTCPayServer.Payments.LNURLPay
public string Badge => "⚡"; public string Badge => "⚡";
private const string UriScheme = "lightning:"; private const string UriScheme = "lightning:";
public void ModifyPaymentModel(PaymentModelContext context) public void ModifyCheckoutModel(CheckoutModelContext context)
{ {
if (context is not { Handler: LNURLPayPaymentHandler handler }) if (context is not { Handler: LNURLPayPaymentHandler handler })
return; return;
@ -48,11 +48,11 @@ namespace BTCPayServer.Payments.LNURLPay
context.Model.InvoiceBitcoinUrl = lnurl; context.Model.InvoiceBitcoinUrl = lnurl;
context.Model.InvoiceBitcoinUrlQR = lnurl.ToUpperInvariant().Replace(UriScheme.ToUpperInvariant(), UriScheme); context.Model.InvoiceBitcoinUrlQR = lnurl.ToUpperInvariant().Replace(UriScheme.ToUpperInvariant(), UriScheme);
} }
context.Model.CheckoutBodyComponentName = LightningPaymentModelExtension.CheckoutBodyComponentName; context.Model.CheckoutBodyComponentName = LNCheckoutModelExtension.CheckoutBodyComponentName;
context.Model.PeerInfo = handler.ParsePaymentPromptDetails(context.Prompt.Details).NodeInfo; context.Model.PeerInfo = handler.ParsePaymentPromptDetails(context.Prompt.Details).NodeInfo;
if (context.StoreBlob.LightningAmountInSatoshi && context.Model.PaymentMethodCurrency == "BTC") if (context.StoreBlob.LightningAmountInSatoshi && context.Model.PaymentMethodCurrency == "BTC")
{ {
BitcoinPaymentModelExtension.PreparePaymentModelForAmountInSats(context.Model, context.Prompt.Rate, _displayFormatter); BitcoinCheckoutModelExtension.PreparePaymentModelForAmountInSats(context.Model, context.Prompt.Rate, _displayFormatter);
} }
} }
} }

View file

@ -9,12 +9,12 @@ using System.Linq;
namespace BTCPayServer.Payments.Lightning namespace BTCPayServer.Payments.Lightning
{ {
public class LightningPaymentModelExtension : IPaymentModelExtension public class LNCheckoutModelExtension : ICheckoutModelExtension
{ {
public const string CheckoutBodyComponentName = "LightningCheckoutBody"; public const string CheckoutBodyComponentName = "LightningCheckoutBody";
private readonly DisplayFormatter _displayFormatter; private readonly DisplayFormatter _displayFormatter;
IPaymentLinkExtension _PaymentLinkExtension; IPaymentLinkExtension _PaymentLinkExtension;
public LightningPaymentModelExtension( public LNCheckoutModelExtension(
PaymentMethodId paymentMethodId, PaymentMethodId paymentMethodId,
BTCPayNetwork network, BTCPayNetwork network,
DisplayFormatter displayFormatter, DisplayFormatter displayFormatter,
@ -38,7 +38,7 @@ namespace BTCPayServer.Payments.Lightning
public string Image => Network.LightningImagePath; public string Image => Network.LightningImagePath;
public string Badge => "⚡"; public string Badge => "⚡";
public void ModifyPaymentModel(PaymentModelContext context) public void ModifyCheckoutModel(CheckoutModelContext context)
{ {
if (context is not { Handler: LightningLikePaymentHandler handler }) if (context is not { Handler: LightningLikePaymentHandler handler })
return; return;
@ -52,7 +52,7 @@ namespace BTCPayServer.Payments.Lightning
context.Model.PeerInfo = handler.ParsePaymentPromptDetails(paymentPrompt.Details).NodeInfo; context.Model.PeerInfo = handler.ParsePaymentPromptDetails(paymentPrompt.Details).NodeInfo;
if (context.StoreBlob.LightningAmountInSatoshi && context.Model.PaymentMethodCurrency == "BTC") if (context.StoreBlob.LightningAmountInSatoshi && context.Model.PaymentMethodCurrency == "BTC")
{ {
BitcoinPaymentModelExtension.PreparePaymentModelForAmountInSats(context.Model, paymentPrompt.Rate, _displayFormatter); BitcoinCheckoutModelExtension.PreparePaymentModelForAmountInSats(context.Model, paymentPrompt.Rate, _displayFormatter);
} }
} }
} }

View file

@ -67,8 +67,8 @@ public partial class AltcoinsPlugin
(IPaymentMethodHandler)ActivatorUtilities.CreateInstance(provider, typeof(MoneroLikePaymentMethodHandler), new object[] { network })); (IPaymentMethodHandler)ActivatorUtilities.CreateInstance(provider, typeof(MoneroLikePaymentMethodHandler), new object[] { network }));
services.AddSingleton<IPaymentLinkExtension>(provider => services.AddSingleton<IPaymentLinkExtension>(provider =>
(IPaymentLinkExtension)ActivatorUtilities.CreateInstance(provider, typeof(MoneroPaymentLinkExtension), new object[] { network, pmi })); (IPaymentLinkExtension)ActivatorUtilities.CreateInstance(provider, typeof(MoneroPaymentLinkExtension), new object[] { network, pmi }));
services.AddSingleton<IPaymentModelExtension>(provider => services.AddSingleton<ICheckoutModelExtension>(provider =>
(IPaymentModelExtension)ActivatorUtilities.CreateInstance(provider, typeof(MoneroPaymentModelExtension), new object[] { network, pmi })); (ICheckoutModelExtension)ActivatorUtilities.CreateInstance(provider, typeof(MoneroCheckoutModelExtension), new object[] { network, pmi }));
services.AddSingleton<IUIExtension>(new UIExtension("Monero/StoreNavMoneroExtension", "store-nav")); services.AddSingleton<IUIExtension>(new UIExtension("Monero/StoreNavMoneroExtension", "store-nav"));
services.AddSingleton<IUIExtension>(new UIExtension("Monero/StoreWalletsNavMoneroExtension", "store-wallets-nav")); services.AddSingleton<IUIExtension>(new UIExtension("Monero/StoreWalletsNavMoneroExtension", "store-wallets-nav"));

View file

@ -56,8 +56,8 @@ public partial class AltcoinsPlugin
(IPaymentMethodHandler)ActivatorUtilities.CreateInstance(provider, typeof(ZcashLikePaymentMethodHandler), new object[] { network })); (IPaymentMethodHandler)ActivatorUtilities.CreateInstance(provider, typeof(ZcashLikePaymentMethodHandler), new object[] { network }));
services.AddSingleton<IPaymentLinkExtension>(provider => services.AddSingleton<IPaymentLinkExtension>(provider =>
(IPaymentLinkExtension)ActivatorUtilities.CreateInstance(provider, typeof(ZcashPaymentLinkExtension), new object[] { network, pmi })); (IPaymentLinkExtension)ActivatorUtilities.CreateInstance(provider, typeof(ZcashPaymentLinkExtension), new object[] { network, pmi }));
services.AddSingleton<IPaymentModelExtension>(provider => services.AddSingleton<ICheckoutModelExtension>(provider =>
(IPaymentModelExtension)ActivatorUtilities.CreateInstance(provider, typeof(ZcashPaymentModelExtension), new object[] { network, pmi })); (ICheckoutModelExtension)ActivatorUtilities.CreateInstance(provider, typeof(ZcashCheckoutModelExtension), new object[] { network, pmi }));
services.AddSingleton<ZcashLikePaymentMethodHandler>(); services.AddSingleton<ZcashLikePaymentMethodHandler>();
services.AddSingleton<IPaymentMethodHandler>(provider => provider.GetRequiredService<ZcashLikePaymentMethodHandler>()); services.AddSingleton<IPaymentMethodHandler>(provider => provider.GetRequiredService<ZcashLikePaymentMethodHandler>());

View file

@ -8,13 +8,13 @@ using BTCPayServer.Services.Invoices;
namespace BTCPayServer.Services.Altcoins.Monero.Payments namespace BTCPayServer.Services.Altcoins.Monero.Payments
{ {
public class MoneroPaymentModelExtension : IPaymentModelExtension public class MoneroCheckoutModelExtension : ICheckoutModelExtension
{ {
private readonly BTCPayNetworkBase _network; private readonly BTCPayNetworkBase _network;
private readonly PaymentMethodHandlerDictionary _handlers; private readonly PaymentMethodHandlerDictionary _handlers;
private readonly IPaymentLinkExtension paymentLinkExtension; private readonly IPaymentLinkExtension paymentLinkExtension;
public MoneroPaymentModelExtension( public MoneroCheckoutModelExtension(
PaymentMethodId paymentMethodId, PaymentMethodId paymentMethodId,
IEnumerable<IPaymentLinkExtension> paymentLinkExtensions, IEnumerable<IPaymentLinkExtension> paymentLinkExtensions,
BTCPayNetworkBase network, BTCPayNetworkBase network,
@ -32,11 +32,11 @@ namespace BTCPayServer.Services.Altcoins.Monero.Payments
public string Image => _network.CryptoImagePath; public string Image => _network.CryptoImagePath;
public string Badge => ""; public string Badge => "";
public void ModifyPaymentModel(PaymentModelContext context) public void ModifyCheckoutModel(CheckoutModelContext context)
{ {
if (context is not { Handler: MoneroLikePaymentMethodHandler handler }) if (context is not { Handler: MoneroLikePaymentMethodHandler handler })
return; return;
context.Model.CheckoutBodyComponentName = BitcoinPaymentModelExtension.CheckoutBodyComponentName; context.Model.CheckoutBodyComponentName = BitcoinCheckoutModelExtension.CheckoutBodyComponentName;
if (context.Model.Activated) if (context.Model.Activated)
{ {
var details = context.InvoiceEntity.GetPayments(true) var details = context.InvoiceEntity.GetPayments(true)

View file

@ -8,13 +8,13 @@ using BTCPayServer.Services.Invoices;
namespace BTCPayServer.Services.Altcoins.Zcash.Payments namespace BTCPayServer.Services.Altcoins.Zcash.Payments
{ {
public class ZcashPaymentModelExtension : IPaymentModelExtension public class ZcashCheckoutModelExtension : ICheckoutModelExtension
{ {
private readonly BTCPayNetworkBase _network; private readonly BTCPayNetworkBase _network;
private readonly PaymentMethodHandlerDictionary _handlers; private readonly PaymentMethodHandlerDictionary _handlers;
private readonly IPaymentLinkExtension paymentLinkExtension; private readonly IPaymentLinkExtension paymentLinkExtension;
public ZcashPaymentModelExtension( public ZcashCheckoutModelExtension(
PaymentMethodId paymentMethodId, PaymentMethodId paymentMethodId,
IEnumerable<IPaymentLinkExtension> paymentLinkExtensions, IEnumerable<IPaymentLinkExtension> paymentLinkExtensions,
BTCPayNetworkBase network, BTCPayNetworkBase network,
@ -32,11 +32,11 @@ namespace BTCPayServer.Services.Altcoins.Zcash.Payments
public string Image => _network.CryptoImagePath; public string Image => _network.CryptoImagePath;
public string Badge => ""; public string Badge => "";
public void ModifyPaymentModel(PaymentModelContext context) public void ModifyCheckoutModel(CheckoutModelContext context)
{ {
if (context is not { Handler: ZcashLikePaymentMethodHandler handler }) if (context is not { Handler: ZcashLikePaymentMethodHandler handler })
return; return;
context.Model.CheckoutBodyComponentName = BitcoinPaymentModelExtension.CheckoutBodyComponentName; context.Model.CheckoutBodyComponentName = BitcoinCheckoutModelExtension.CheckoutBodyComponentName;
if (context.Model.Activated) if (context.Model.Activated)
{ {
var details = context.InvoiceEntity.GetPayments(true) var details = context.InvoiceEntity.GetPayments(true)

View file

@ -6,9 +6,9 @@ namespace BTCPayServer.Services
{ {
public class PrettyNameProvider public class PrettyNameProvider
{ {
private readonly Dictionary<PaymentMethodId, IPaymentModelExtension> _extensions; private readonly Dictionary<PaymentMethodId, ICheckoutModelExtension> _extensions;
public PrettyNameProvider(Dictionary<PaymentMethodId, IPaymentModelExtension> extensions) public PrettyNameProvider(Dictionary<PaymentMethodId, ICheckoutModelExtension> extensions)
{ {
_extensions = extensions; _extensions = extensions;
} }

View file

@ -2,9 +2,9 @@
@using BTCPayServer.Components.TruncateCenter @using BTCPayServer.Components.TruncateCenter
@using BTCPayServer.Abstractions.TagHelpers @using BTCPayServer.Abstractions.TagHelpers
@using BTCPayServer.Payments.Bitcoin @using BTCPayServer.Payments.Bitcoin
@model BTCPayServer.Models.InvoicingModels.PaymentModel @model BTCPayServer.Models.InvoicingModels.CheckoutModel
<template id="@BitcoinPaymentModelExtension.CheckoutBodyComponentName"> <template id="@BitcoinCheckoutModelExtension.CheckoutBodyComponentName">
@await Component.InvokeAsync("UiExtensionPoint", new {location = "checkout-bitcoin-pre-content", model = Model}) @await Component.InvokeAsync("UiExtensionPoint", new {location = "checkout-bitcoin-pre-content", model = Model})
<div class="payment-box"> <div class="payment-box">
<div v-if="model.invoiceBitcoinUrlQR" class="qr-container" :data-qr-value="model.invoiceBitcoinUrlQR" :data-clipboard="model.invoiceBitcoinUrl" data-clipboard-confirm-element="#Address_@Model.PaymentMethodId [data-clipboard]"> <div v-if="model.invoiceBitcoinUrlQR" class="qr-container" :data-qr-value="model.invoiceBitcoinUrlQR" :data-clipboard="model.invoiceBitcoinUrl" data-clipboard-confirm-element="#Address_@Model.PaymentMethodId [data-clipboard]">
@ -32,9 +32,9 @@
</template> </template>
<script> <script>
Vue.component(@Safe.Json(BitcoinPaymentModelExtension.CheckoutBodyComponentName), { Vue.component(@Safe.Json(BitcoinCheckoutModelExtension.CheckoutBodyComponentName), {
props: ['model', 'nfcSupported', 'nfcScanning', 'nfcErrorMessage'], props: ['model', 'nfcSupported', 'nfcScanning', 'nfcErrorMessage'],
template: @Safe.Json("#" + BitcoinPaymentModelExtension.CheckoutBodyComponentName), template: @Safe.Json("#" + BitcoinCheckoutModelExtension.CheckoutBodyComponentName),
components: { components: {
qrcode: VueQrcode qrcode: VueQrcode
}, },

View file

@ -1,7 +1,7 @@
@using BTCPayServer.Payments.Lightning @using BTCPayServer.Payments.Lightning
@model BTCPayServer.Models.InvoicingModels.PaymentModel @model BTCPayServer.Models.InvoicingModels.CheckoutModel
<template id="@LightningPaymentModelExtension.CheckoutBodyComponentName"> <template id="@LNCheckoutModelExtension.CheckoutBodyComponentName">
<div class="payment-box"> <div class="payment-box">
@await Component.InvokeAsync("UiExtensionPoint" , new { location="checkout-lightning-pre-content", model = Model}) @await Component.InvokeAsync("UiExtensionPoint" , new { location="checkout-lightning-pre-content", model = Model})
<div v-if="model.invoiceBitcoinUrlQR" class="qr-container" :data-qr-value="model.invoiceBitcoinUrlQR" :data-clipboard="model.invoiceBitcoinUrl" data-clipboard-confirm-element="#Lightning_@Model.PaymentMethodId [data-clipboard]"> <div v-if="model.invoiceBitcoinUrlQR" class="qr-container" :data-qr-value="model.invoiceBitcoinUrlQR" :data-clipboard="model.invoiceBitcoinUrl" data-clipboard-confirm-element="#Lightning_@Model.PaymentMethodId [data-clipboard]">
@ -24,9 +24,9 @@
</template> </template>
<script> <script>
Vue.component(@Safe.Json(LightningPaymentModelExtension.CheckoutBodyComponentName), { Vue.component(@Safe.Json(LNCheckoutModelExtension.CheckoutBodyComponentName), {
props: ['model', 'nfcSupported', 'nfcScanning', 'nfcErrorMessage'], props: ['model', 'nfcSupported', 'nfcScanning', 'nfcErrorMessage'],
template: @Safe.Json("#" + LightningPaymentModelExtension.CheckoutBodyComponentName), template: @Safe.Json("#" + LNCheckoutModelExtension.CheckoutBodyComponentName),
components: { components: {
qrcode: VueQrcode qrcode: VueQrcode
}, },

View file

@ -1,4 +1,4 @@
@model PaymentModel @model CheckoutModel
<style> <style>
#checkout-cheating form + form { margin-top: var(--btcpay-space-l); } #checkout-cheating form + form { margin-top: var(--btcpay-space-l); }

View file

@ -1,4 +1,4 @@
@model PaymentModel @model CheckoutModel
<div id="testing"> <div id="testing">
<hr class="my-3" /> <hr class="my-3" />

View file

@ -5,7 +5,7 @@
@inject IEnumerable<IUIExtension> UiExtensions @inject IEnumerable<IUIExtension> UiExtensions
@inject PaymentMethodHandlerDictionary PaymentMethodHandlerDictionary @inject PaymentMethodHandlerDictionary PaymentMethodHandlerDictionary
@inject BTCPayServer.Security.ContentSecurityPolicies Csp @inject BTCPayServer.Security.ContentSecurityPolicies Csp
@model PaymentModel @model CheckoutModel
@{ @{
Layout = null; Layout = null;
ViewData["Title"] = Model.HtmlTitle; ViewData["Title"] = Model.HtmlTitle;

View file

@ -1,4 +1,4 @@
@model PaymentModel @model CheckoutModel
@{ @{
Layout = null; Layout = null;
var displayedPaymentMethods = Model.AvailableCryptos.Where(a => a.Displayed).ToList(); var displayedPaymentMethods = Model.AvailableCryptos.Where(a => a.Displayed).ToList();
@ -18,28 +18,6 @@
@if (Model.Status == "new") @if (Model.Status == "new")
{ {
<h1 class="text-danger">This payment method requires javascript.</h1> <h1 class="text-danger">This payment method requires javascript.</h1>
@if (displayedPaymentMethods.Count > 1)
{
<div>
<hr />
<h2>Pay with:</h2>
<ul style="list-style-type: none;padding-left: 5px;">
@foreach (var crypto in displayedPaymentMethods)
{
<li style="height: 32px; line-height: 32px;">
<a asp-action="CheckoutNoScript" asp-route-invoiceId="@Model.InvoiceId" asp-route-paymentMethodId="@crypto.PaymentMethodId">
<img alt="@crypto.PaymentMethodName" src="@crypto.CryptoImage" style="vertical-align:middle; height:24px; text-decoration:none; margin-top: -3px;" asp-append-version="true" />
</a>
<a asp-action="CheckoutNoScript" asp-route-invoiceId="@Model.InvoiceId" asp-route-paymentMethodId="@crypto.PaymentMethodId" style="padding-top: 2px;">
@crypto.PaymentMethodName
@(crypto.IsLightning ? Html.Raw("&#9889;") : null)
(@crypto.CryptoCode)
</a>
</li>
}
</ul>
</div>
}
} }
else if (Model.Status == "paid" || Model.Status == "complete" || Model.Status == "confirmed") else if (Model.Status == "paid" || Model.Status == "complete" || Model.Status == "confirmed")
{ {