Can set lightning network as default payment method (close #290)

This commit is contained in:
nicolas.dorier
2019-01-31 19:07:38 +09:00
parent 90503a490c
commit cf6b17250a
6 changed files with 44 additions and 31 deletions

View File

@@ -190,7 +190,7 @@ namespace BTCPayServer.Controllers
id = invoiceId; id = invoiceId;
//// ////
var model = await GetInvoiceModel(invoiceId, paymentMethodId); var model = await GetInvoiceModel(invoiceId, paymentMethodId == null ? null : PaymentMethodId.Parse(paymentMethodId));
if (model == null) if (model == null)
return NotFound(); return NotFound();
@@ -213,31 +213,29 @@ namespace BTCPayServer.Controllers
return View(nameof(Checkout), model); return View(nameof(Checkout), model);
} }
private async Task<PaymentModel> GetInvoiceModel(string invoiceId, string paymentMethodIdStr) private async Task<PaymentModel> GetInvoiceModel(string invoiceId, PaymentMethodId paymentMethodId)
{ {
var invoice = await _InvoiceRepository.GetInvoice(invoiceId); var invoice = await _InvoiceRepository.GetInvoice(invoiceId);
if (invoice == null) if (invoice == null)
return null; return null;
var store = await _StoreRepository.FindStore(invoice.StoreId); var store = await _StoreRepository.FindStore(invoice.StoreId);
bool isDefaultCrypto = false; bool isDefaultPaymentId = false;
if (paymentMethodIdStr == null) if (paymentMethodId == null)
{ {
paymentMethodIdStr = store.GetDefaultCrypto(_NetworkProvider); paymentMethodId = store.GetDefaultPaymentId(_NetworkProvider);
isDefaultCrypto = true; isDefaultPaymentId = true;
} }
var paymentMethodId = PaymentMethodId.Parse(paymentMethodIdStr);
var network = _NetworkProvider.GetNetwork(paymentMethodId.CryptoCode); var network = _NetworkProvider.GetNetwork(paymentMethodId.CryptoCode);
if (network == null && isDefaultCrypto) if (network == null && isDefaultPaymentId)
{ {
network = _NetworkProvider.GetAll().FirstOrDefault(); network = _NetworkProvider.GetAll().FirstOrDefault();
paymentMethodId = new PaymentMethodId(network.CryptoCode, PaymentTypes.BTCLike); paymentMethodId = new PaymentMethodId(network.CryptoCode, PaymentTypes.BTCLike);
paymentMethodIdStr = paymentMethodId.ToString();
} }
if (invoice == null || network == null) if (invoice == null || network == null)
return null; return null;
if (!invoice.Support(paymentMethodId)) if (!invoice.Support(paymentMethodId))
{ {
if (!isDefaultCrypto) if (!isDefaultPaymentId)
return null; return null;
var paymentMethodTemp = invoice.GetPaymentMethods(_NetworkProvider) var paymentMethodTemp = invoice.GetPaymentMethods(_NetworkProvider)
.Where(c => paymentMethodId.CryptoCode == c.GetId().CryptoCode) .Where(c => paymentMethodId.CryptoCode == c.GetId().CryptoCode)
@@ -246,7 +244,6 @@ namespace BTCPayServer.Controllers
paymentMethodTemp = invoice.GetPaymentMethods(_NetworkProvider).First(); paymentMethodTemp = invoice.GetPaymentMethods(_NetworkProvider).First();
network = paymentMethodTemp.Network; network = paymentMethodTemp.Network;
paymentMethodId = paymentMethodTemp.GetId(); paymentMethodId = paymentMethodTemp.GetId();
paymentMethodIdStr = paymentMethodId.ToString();
} }
var paymentMethod = invoice.GetPaymentMethod(paymentMethodId, _NetworkProvider); var paymentMethod = invoice.GetPaymentMethod(paymentMethodId, _NetworkProvider);
@@ -375,7 +372,7 @@ namespace BTCPayServer.Controllers
[Route("invoice/status")] [Route("invoice/status")]
public async Task<IActionResult> GetStatus(string invoiceId, string paymentMethodId = null) public async Task<IActionResult> GetStatus(string invoiceId, string paymentMethodId = null)
{ {
var model = await GetInvoiceModel(invoiceId, paymentMethodId); var model = await GetInvoiceModel(invoiceId, paymentMethodId == null ? null : PaymentMethodId.Parse(paymentMethodId));
if (model == null) if (model == null)
return NotFound(); return NotFound();
return Json(model); return Json(model);

View File

@@ -141,9 +141,9 @@ namespace BTCPayServer.Controllers
{ {
var supportedMethods = store.GetSupportedPaymentMethods(_NetworkProvider); var supportedMethods = store.GetSupportedPaymentMethods(_NetworkProvider);
var currencyCodes = supportedMethods.Select(method => method.PaymentId.CryptoCode).Distinct(); var currencyCodes = supportedMethods.Select(method => method.PaymentId.CryptoCode).Distinct();
var defaultCrypto = store.GetDefaultCrypto(_NetworkProvider); var defaultPaymentId = store.GetDefaultPaymentId(_NetworkProvider);
currencyPairs = BuildCurrencyPairs(currencyCodes, defaultCrypto); currencyPairs = BuildCurrencyPairs(currencyCodes, defaultPaymentId.CryptoCode);
if (string.IsNullOrEmpty(currencyPairs)) if (string.IsNullOrEmpty(currencyPairs))
{ {

View File

@@ -331,7 +331,7 @@ namespace BTCPayServer.Controllers
{ {
var storeBlob = StoreData.GetStoreBlob(); var storeBlob = StoreData.GetStoreBlob();
var vm = new CheckoutExperienceViewModel(); var vm = new CheckoutExperienceViewModel();
vm.SetCryptoCurrencies(_ExplorerProvider, StoreData.GetDefaultCrypto(_NetworkProvider)); vm.SetCryptoCurrencies(_NetworkProvider, StoreData, StoreData.GetDefaultPaymentId(_NetworkProvider));
vm.SetLanguages(_LangService, storeBlob.DefaultLang); vm.SetLanguages(_LangService, storeBlob.DefaultLang);
vm.LightningMaxValue = storeBlob.LightningMaxValue?.ToString() ?? ""; vm.LightningMaxValue = storeBlob.LightningMaxValue?.ToString() ?? "";
vm.OnChainMinValue = storeBlob.OnChainMinValue?.ToString() ?? ""; vm.OnChainMinValue = storeBlob.OnChainMinValue?.ToString() ?? "";
@@ -365,12 +365,13 @@ namespace BTCPayServer.Controllers
} }
bool needUpdate = false; bool needUpdate = false;
var blob = StoreData.GetStoreBlob(); var blob = StoreData.GetStoreBlob();
if (StoreData.GetDefaultCrypto(_NetworkProvider) != model.DefaultCryptoCurrency) var defaultPaymentMethodId = model.DefaultPaymentMethod == null ? null : PaymentMethodId.Parse(model.DefaultPaymentMethod);
if (StoreData.GetDefaultPaymentId(_NetworkProvider) != defaultPaymentMethodId)
{ {
needUpdate = true; needUpdate = true;
StoreData.SetDefaultCrypto(model.DefaultCryptoCurrency); StoreData.SetDefaultPaymentId(defaultPaymentMethodId);
} }
model.SetCryptoCurrencies(_ExplorerProvider, model.DefaultCryptoCurrency); model.SetCryptoCurrencies(_NetworkProvider, StoreData, defaultPaymentMethodId);
model.SetLanguages(_LangService, model.DefaultLang); model.SetLanguages(_LangService, model.DefaultLang);
if (!ModelState.IsValid) if (!ModelState.IsValid)

View File

@@ -195,7 +195,7 @@ namespace BTCPayServer.Data
get; get;
set; set;
} }
[Obsolete("Use GetDefaultCrypto instead")] [Obsolete("Use GetDefaultPaymentId instead")]
public string DefaultCrypto { get; set; } public string DefaultCrypto { get; set; }
public List<PairedSINData> PairedSINs { get; set; } public List<PairedSINData> PairedSINs { get; set; }
public IEnumerable<APIKeyData> APIKeys { get; set; } public IEnumerable<APIKeyData> APIKeys { get; set; }
@@ -204,13 +204,14 @@ namespace BTCPayServer.Data
public List<Claim> AdditionalClaims { get; set; } = new List<Claim>(); public List<Claim> AdditionalClaims { get; set; } = new List<Claim>();
#pragma warning disable CS0618 #pragma warning disable CS0618
public string GetDefaultCrypto(BTCPayNetworkProvider networkProvider = null) public PaymentMethodId GetDefaultPaymentId(BTCPayNetworkProvider networkProvider = null)
{ {
return DefaultCrypto ?? (networkProvider == null ? "BTC" : GetSupportedPaymentMethods(networkProvider).Select(p => p.PaymentId.CryptoCode).FirstOrDefault() ?? "BTC"); var str = DefaultCrypto ?? (networkProvider == null ? "BTC" : GetSupportedPaymentMethods(networkProvider).Select(p => p.PaymentId.ToString()).FirstOrDefault() ?? "BTC");
return PaymentMethodId.Parse(str);
} }
public void SetDefaultCrypto(string defaultCryptoCurrency) public void SetDefaultPaymentId(PaymentMethodId defaultPaymentId)
{ {
DefaultCrypto = defaultCryptoCurrency; DefaultCrypto = defaultPaymentId.ToString();
} }
#pragma warning restore CS0618 #pragma warning restore CS0618

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using BTCPayServer.Payments;
using BTCPayServer.Services; using BTCPayServer.Services;
using BTCPayServer.Validation; using BTCPayServer.Validation;
using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.Rendering;
@@ -19,8 +20,8 @@ namespace BTCPayServer.Models.StoreViewModels
public SelectList CryptoCurrencies { get; set; } public SelectList CryptoCurrencies { get; set; }
public SelectList Languages { get; set; } public SelectList Languages { get; set; }
[Display(Name = "Default crypto currency on checkout")] [Display(Name = "Default the default payment method on checkout")]
public string DefaultCryptoCurrency { get; set; } public string DefaultPaymentMethod { get; set; }
[Display(Name = "Default language on checkout")] [Display(Name = "Default language on checkout")]
public string DefaultLang { get; set; } public string DefaultLang { get; set; }
[Display(Name = "Do not propose lightning payment if value of the invoice is above...")] [Display(Name = "Do not propose lightning payment if value of the invoice is above...")]
@@ -48,12 +49,25 @@ namespace BTCPayServer.Models.StoreViewModels
public string HtmlTitle { get; set; } public string HtmlTitle { get; set; }
public void SetCryptoCurrencies(ExplorerClientProvider explorerProvider, string defaultCrypto) public void SetCryptoCurrencies(BTCPayNetworkProvider networks, Data.StoreData storeData, PaymentMethodId paymentMethodId)
{ {
var choices = explorerProvider.GetAll().Select(o => new Format() { Name = o.Item1.CryptoCode, Value = o.Item1.CryptoCode }).ToArray(); var paymentIds = storeData.GetSupportedPaymentMethods(networks).Select(o => o.PaymentId)
var chosen = choices.FirstOrDefault(f => f.Value == defaultCrypto) ?? choices.FirstOrDefault(); .OrderByDescending(a => a.CryptoCode == "BTC")
.ThenBy(a => a.CryptoCode)
.ThenBy(a => a.PaymentType == PaymentTypes.LightningLike ? 1 : 0);
var choices = paymentIds.Select(o => new Format() { Name = GetDisplayName(networks, o), Value = o.ToString() }).ToArray();
var chosen = choices.FirstOrDefault(f => f.Value == paymentMethodId?.ToString()) ?? choices.FirstOrDefault();
CryptoCurrencies = new SelectList(choices, nameof(chosen.Value), nameof(chosen.Name), chosen); CryptoCurrencies = new SelectList(choices, nameof(chosen.Value), nameof(chosen.Name), chosen);
DefaultCryptoCurrency = chosen.Name; DefaultPaymentMethod = chosen.Value;
}
private string GetDisplayName(BTCPayNetworkProvider networks, PaymentMethodId paymentMethodId)
{
var display = networks.GetNetwork(paymentMethodId.CryptoCode)?.DisplayName ?? paymentMethodId.CryptoCode;
return paymentMethodId.PaymentType == PaymentTypes.BTCLike ?
display : $"{display} (Lightning)";
} }
public void SetLanguages(LanguageService langService, string defaultLang) public void SetLanguages(LanguageService langService, string defaultLang)

View File

@@ -31,8 +31,8 @@
<span asp-validation-for="HtmlTitle" class="text-danger"></span> <span asp-validation-for="HtmlTitle" class="text-danger"></span>
</div> </div>
<div class="form-group"> <div class="form-group">
<label asp-for="DefaultCryptoCurrency"></label> <label asp-for="DefaultPaymentMethod"></label>
<select asp-for="DefaultCryptoCurrency" asp-items="Model.CryptoCurrencies" class="form-control"></select> <select asp-for="DefaultPaymentMethod" asp-items="Model.CryptoCurrencies" class="form-control"></select>
</div> </div>
<div class="form-group"> <div class="form-group">
<label asp-for="DefaultLang"></label> <label asp-for="DefaultLang"></label>