using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using BTCPayServer.Data; using BTCPayServer.Services.Invoices; namespace BTCPayServer.Payments { /// /// This class customize invoice creation by the creation of payment details for the PaymentMethod during invoice creation /// public interface IPaymentMethodHandler { /// /// Create needed to track payments of this invoice /// /// /// /// /// /// Task CreatePaymentMethodDetails(ISupportedPaymentMethod supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network, object preparePaymentObject); /// /// This method called before the rate have been fetched /// /// /// /// /// object PreparePayment(ISupportedPaymentMethod supportedPaymentMethod, StoreData store, BTCPayNetwork network); } public interface IPaymentMethodHandler : IPaymentMethodHandler where T : ISupportedPaymentMethod { Task CreatePaymentMethodDetails(T supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network, object preparePaymentObject); } public abstract class PaymentMethodHandlerBase : IPaymentMethodHandler where T : ISupportedPaymentMethod { public abstract Task CreatePaymentMethodDetails(T supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network, object preparePaymentObject); public virtual object PreparePayment(T supportedPaymentMethod, StoreData store, BTCPayNetwork network) { return null; } object IPaymentMethodHandler.PreparePayment(ISupportedPaymentMethod supportedPaymentMethod, StoreData store, BTCPayNetwork network) { if (supportedPaymentMethod is T method) { return PreparePayment(method, store, network); } throw new NotSupportedException("Invalid supportedPaymentMethod"); } Task IPaymentMethodHandler.CreatePaymentMethodDetails(ISupportedPaymentMethod supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network, object preparePaymentObject) { if (supportedPaymentMethod is T method) { return CreatePaymentMethodDetails(method, paymentMethod, store, network, preparePaymentObject); } throw new NotSupportedException("Invalid supportedPaymentMethod"); } } }