Lightning Address: Fix availability check and refactor option view (#4584)

As @petzsch rightfully assumed in #4578, the check took only the last available LN payment method into account, which in this case was LN on LTC. We now pass the crypto code as well and I refactored the checks as well as the option view.

Fixes #4578.
This commit is contained in:
d11n 2023-02-02 01:42:41 +01:00 committed by GitHub
parent ca1dac4cc3
commit e4f256d5cd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 35 additions and 71 deletions

View file

@ -148,48 +148,24 @@ namespace BTCPayServer.Data
#pragma warning restore CS0618
}
public static bool IsLightningEnabled(this StoreData storeData, BTCPayNetworkProvider networks)
public static bool IsLightningEnabled(this StoreData storeData, BTCPayNetworkProvider networks, string cryptoCode)
{
var paymentMethods = storeData.GetSupportedPaymentMethods(networks);
var lightningByCryptoCode = paymentMethods
.OfType<LightningSupportedPaymentMethod>()
.Where(method => method.PaymentId.PaymentType == LightningPaymentType.Instance)
.ToDictionary(c => c.CryptoCode.ToUpperInvariant());
var excludeFilters = storeData.GetStoreBlob().GetExcludedPaymentMethods();
var isLightningEnabled = false;
foreach (var paymentMethod in paymentMethods)
{
var paymentMethodId = paymentMethod.PaymentId;
switch (paymentMethodId.PaymentType)
{
// LNURLPayPaymentType is a subclass of LightningPaymentType, skip it
case LNURLPayPaymentType lnurlPayPaymentType:
break;
case LightningPaymentType _:
var lightning = lightningByCryptoCode.TryGet(paymentMethodId.CryptoCode);
isLightningEnabled = !excludeFilters.Match(paymentMethodId) && lightning != null;
break;
}
}
return isLightningEnabled;
return IsPaymentTypeEnabled(storeData, networks, cryptoCode, LightningPaymentType.Instance);
}
public static bool IsLNUrlEnabled(this StoreData storeData, BTCPayNetworkProvider networks)
public static bool IsLNUrlEnabled(this StoreData storeData, BTCPayNetworkProvider networks, string cryptoCode)
{
return IsPaymentTypeEnabled(storeData, networks, cryptoCode, LNURLPayPaymentType.Instance);
}
private static bool IsPaymentTypeEnabled(this StoreData storeData, BTCPayNetworkProvider networks, string cryptoCode, PaymentType paymentType)
{
var paymentMethods = storeData.GetSupportedPaymentMethods(networks);
var excludeFilters = storeData.GetStoreBlob().GetExcludedPaymentMethods();
var isLNUrlEnabled = false;
foreach (var paymentMethod in paymentMethods)
{
var paymentMethodId = paymentMethod.PaymentId;
if (paymentMethodId.PaymentType is LNURLPayPaymentType)
{
isLNUrlEnabled = !excludeFilters.Match(paymentMethodId);
}
}
return isLNUrlEnabled;
return paymentMethods.Any(method =>
method.PaymentId.CryptoCode == cryptoCode &&
method.PaymentId.PaymentType == paymentType &&
!excludeFilters.Match(method.PaymentId));
}
}
}

View file

@ -1,18 +1,14 @@
@using BTCPayServer.Payments.Lightning
@using BTCPayServer.Views.Stores
@using BTCPayServer.Abstractions.Extensions
@inject BTCPayNetworkProvider BTCPayNetworkProvider
@{
const string cryptoCode = "BTC";
var store = Context.GetStoreData();
var isLightningEnabled = store.IsLightningEnabled(BTCPayNetworkProvider);
var isLNUrlEnabled = store.IsLNUrlEnabled(BTCPayNetworkProvider);
var possible =
isLightningEnabled &&
isLNUrlEnabled &&
store.GetSupportedPaymentMethods(BTCPayNetworkProvider).OfType<LNURLPaySupportedPaymentMethod>().Any(type => type.CryptoCode == "BTC");
var isLightningEnabled = store.IsLightningEnabled(BTCPayNetworkProvider, cryptoCode);
var isLNUrlEnabled = store.IsLNUrlEnabled(BTCPayNetworkProvider, cryptoCode);
}
@if (possible)
@if (isLightningEnabled && isLNUrlEnabled)
{
<li class="nav-item">
<a asp-area="" asp-controller="UILNURL" asp-action="EditLightningAddress" asp-route-storeId="@store.Id" class="nav-link @ViewData.IsActivePage("LightningAddress", nameof(StoreNavPages))" id="StoreNav-LightningAddress">

View file

@ -1,18 +1,11 @@
@using BTCPayServer.Payments.Lightning
@inject BTCPayNetworkProvider BTCPayNetworkProvider
@{
const string cryptoCode = "BTC";
var store = Context.GetStoreData();
var cryptoCode = "BTC";
var isLightningEnabled = store.IsLightningEnabled(BTCPayNetworkProvider);
var isLNUrlEnabled = store.IsLNUrlEnabled(BTCPayNetworkProvider);
var possible =
isLightningEnabled &&
isLNUrlEnabled &&
store.GetSupportedPaymentMethods(BTCPayNetworkProvider).OfType<LNURLPaySupportedPaymentMethod>().Any(type => type.CryptoCode == cryptoCode);
var network = BTCPayNetworkProvider.GetNetwork<BTCPayNetwork>(cryptoCode);
var isLightningEnabled = store.IsLightningEnabled(BTCPayNetworkProvider, cryptoCode);
var isLNUrlEnabled = store.IsLNUrlEnabled(BTCPayNetworkProvider, cryptoCode);
}
@if (network?.SupportLightning is true) {
<li class="list-group-item bg-tile" id="lightning-address-option">
<div class="d-flex align-items-center">
<span class="d-flex flex-wrap flex-fill flex-column flex-sm-row">
@ -24,32 +17,31 @@
</strong>
</span>
<span class="d-flex align-items-center fw-semibold">
@if (possible)
@switch (isLightningEnabled)
{
<a id="lightning-address-setup-link" class="btn btn-primary btn-sm ms-4 px-3 py-1 fw-semibold" asp-controller="UILNURL" asp-action="EditLightningAddress" asp-route-storeId="@Context.GetRouteValue("storeId")">
Setup
</a>
}
else
{
if (!isLightningEnabled)
{
<a asp-controller="UIStores" asp-action="SetupLightningNode" asp-route-cryptoCode="@cryptoCode" asp-route-storeId="@store.Id" class="btn btn-link p-0">
You need to setup Lightning first
case true when isLNUrlEnabled:
<a asp-controller="UILNURL" asp-action="EditLightningAddress" asp-route-storeId="@store.Id" id="lightning-address-setup-link" class="btn btn-primary btn-sm ms-4 px-3 py-1 fw-semibold">
Setup
</a>
}
else
{
break;
case false:
<span class="d-flex align-items-center text-danger">
<span class="me-2 btcpay-status btcpay-status--disabled"></span>
<a asp-action="LightningSettings" asp-route-cryptoCode="BTC" asp-route-storeId="@store.Id" asp-fragment="ln-url">
<a asp-controller="UIStores" asp-action="SetupLightningNode" asp-route-cryptoCode="@cryptoCode" asp-route-storeId="@store.Id" class="btn btn-link p-0">
You need to setup Lightning first
</a>
</span>
break;
default:
<span class="d-flex align-items-center text-danger">
<span class="me-2 btcpay-status btcpay-status--disabled"></span>
<a asp-action="LightningSettings" asp-route-cryptoCode="BTC" asp-route-storeId="@store.Id" asp-fragment="ln-url" class="btn btn-link p-0">
You need LNURL configured first
</a>
</span>
}
break;
}
</span>
</div>
</li>
}