Refactor by adding extension FindPayoutHandler (#2984)

This commit is contained in:
Nicolas Dorier
2021-10-18 15:00:38 +09:00
committed by GitHub
parent cf206e64a7
commit 262798d577
9 changed files with 23 additions and 12 deletions

View File

@@ -233,7 +233,7 @@ namespace BTCPayServer.Controllers.GreenField
return this.CreateValidationError(ModelState);
}
var payoutHandler = _payoutHandlers.FirstOrDefault(handler => handler.CanHandle(paymentMethodId));
var payoutHandler = _payoutHandlers.FindPayoutHandler(paymentMethodId);
if (payoutHandler is null)
{
ModelState.AddModelError(nameof(request.PaymentMethod), "Invalid payment method");

View File

@@ -198,7 +198,7 @@ namespace BTCPayServer.Controllers
// TODO: What if no option?
var refund = new RefundModel();
refund.Title = "Select a payment method";
refund.AvailablePaymentMethods = new SelectList(options.Select(id => new SelectListItem(id.ToPrettyString(), id.ToString())));
refund.AvailablePaymentMethods = new SelectList(options.Select(id => new SelectListItem(id.ToPrettyString(), id.ToString())), "Value", "Text");
refund.SelectedPaymentMethod = defaultRefund?.ToString() ?? options.Select(o => o.CryptoCode).First();
// Nothing to select, skip to next

View File

@@ -59,7 +59,7 @@ namespace BTCPayServer.Controllers
{
Entity = o,
Blob = o.GetBlob(_serializerSettings),
ProofBlob = _payoutHandlers.FirstOrDefault(handler => handler.CanHandle(o.GetPaymentMethodId()))?.ParseProof(o)
ProofBlob = _payoutHandlers.FindPayoutHandler(o.GetPaymentMethodId())?.ParseProof(o)
});
var cd = _currencyNameTable.GetCurrencyData(blob.Currency, false);
var totalPaid = payouts.Where(p => p.Entity.State != PayoutState.Cancelled).Select(p => p.Blob.Amount).Sum();
@@ -109,7 +109,7 @@ namespace BTCPayServer.Controllers
var paymentMethodId = ppBlob.SupportedPaymentMethods.FirstOrDefault(id => vm.SelectedPaymentMethod == id.ToString());
var payoutHandler = paymentMethodId is null? null: _payoutHandlers.FirstOrDefault(handler => handler.CanHandle(paymentMethodId));
var payoutHandler = paymentMethodId is null? null: _payoutHandlers.FindPayoutHandler(paymentMethodId);
if (payoutHandler is null)
{
ModelState.AddModelError(nameof(vm.SelectedPaymentMethod), $"Invalid destination with selected payment method");

View File

@@ -196,7 +196,7 @@ namespace BTCPayServer.Controllers
var storeId = walletId.StoreId;
var paymentMethodId = PaymentMethodId.Parse(vm.PaymentMethodId);
var handler = _payoutHandlers
.FirstOrDefault(handler => handler.CanHandle(paymentMethodId));
.FindPayoutHandler(paymentMethodId);
var commandState = Enum.Parse<PayoutState>(vm.Command.Split("-").First());
var payoutIds = vm.GetSelectedPayouts(commandState);
if (payoutIds.Length == 0)
@@ -429,7 +429,7 @@ namespace BTCPayServer.Controllers
Destination = payoutBlob.Destination
};
var handler = _payoutHandlers
.FirstOrDefault(handler => handler.CanHandle(item.Payout.GetPaymentMethodId()));
.FindPayoutHandler(item.Payout.GetPaymentMethodId());
var proofBlob = handler?.ParseProof(item.Payout);
m.ProofLink = proofBlob?.Link;
vm.Payouts.Add(m);

View File

@@ -104,7 +104,7 @@ namespace BTCPayServer.Data.Payouts.LightningLike
public async Task<IActionResult> ProcessLightningPayout(string cryptoCode, string[] payoutIds)
{
var pmi = new PaymentMethodId(cryptoCode, PaymentTypes.LightningLike);
var payoutHandler = _payoutHandlers.FirstOrDefault(handler => handler.CanHandle(pmi));
var payoutHandler = _payoutHandlers.FindPayoutHandler(pmi);
await using var ctx = _applicationDbContextFactory.CreateContext();

View File

@@ -152,6 +152,13 @@ namespace BTCPayServer
return transactions.Select(t => t.Result).Where(t => t != null).ToDictionary(o => o.Transaction.GetHash());
}
#nullable enable
public static IPayoutHandler? FindPayoutHandler(this IEnumerable<IPayoutHandler> handlers, PaymentMethodId paymentMethodId)
{
return handlers.FirstOrDefault(h => h.CanHandle(paymentMethodId));
}
#nullable restore
public static async Task<PSBT> UpdatePSBT(this ExplorerClientProvider explorerClientProvider, DerivationSchemeSettings derivationSchemeSettings, PSBT psbt)
{
var result = await explorerClientProvider.GetExplorerClient(psbt.Network.NetworkSet.CryptoCode).UpdatePSBTAsync(new UpdatePSBTRequest()

View File

@@ -296,7 +296,9 @@ namespace BTCPayServer.HostedServices
if (paymentMethod.CryptoCode == payout.PullPaymentData.GetBlob().Currency)
req.Rate = 1.0m;
var cryptoAmount = payoutBlob.Amount / req.Rate;
var payoutHandler = _payoutHandlers.First(handler => handler.CanHandle(paymentMethod));
var payoutHandler = _payoutHandlers.FindPayoutHandler(paymentMethod);
if (payoutHandler is null)
throw new InvalidOperationException($"No payout handler for {paymentMethod}");
var dest = await payoutHandler.ParseClaimDestination(paymentMethod, payoutBlob.Destination, false);
decimal minimumCryptoAmount = await payoutHandler.GetMinimumPayoutAmount(paymentMethod, dest.destination);
if (cryptoAmount < minimumCryptoAmount)
@@ -369,7 +371,7 @@ namespace BTCPayServer.HostedServices
}
var ppBlob = pp.GetBlob();
var payoutHandler =
_payoutHandlers.FirstOrDefault(handler => handler.CanHandle(req.ClaimRequest.PaymentMethodId));
_payoutHandlers.FindPayoutHandler(req.ClaimRequest.PaymentMethodId);
if (!ppBlob.SupportedPaymentMethods.Contains(req.ClaimRequest.PaymentMethodId) || payoutHandler is null)
{
req.Completion.TrySetResult(new ClaimRequest.ClaimResponse(ClaimRequest.ClaimResult.PaymentMethodNotSupported));

View File

@@ -66,7 +66,7 @@ namespace BTCPayServer.Services
return settings;
}
private T Deserialize<T>(string value)
private T? Deserialize<T>(string value) where T : class
{
return JsonConvert.DeserializeObject<T>(value);
}

View File

@@ -1,4 +1,4 @@
@using BTCPayServer.Client.Models
@using BTCPayServer.Client.Models
@using BTCPayServer.Payments
@model PayoutsModel
@@ -10,7 +10,9 @@
var paymentMethods = PayoutHandlers.GetSupportedPaymentMethods();
var stateActions = new List<(string Action, string Text)>();
var payoutHandler = PayoutHandlers.First(handler => handler.CanHandle(PaymentMethodId.Parse(Model.PaymentMethodId)));
var payoutHandler = PayoutHandlers.FindPayoutHandler(PaymentMethodId.Parse(Model.PaymentMethodId));
if (payoutHandler is null)
return;
stateActions.AddRange(payoutHandler.GetPayoutSpecificActions().Where(pair => pair.Key == Model.PayoutState).SelectMany(pair => pair.Value));
switch (Model.PayoutState)
{