Ejemplo n.º 1
0
 public async Task <IActionResult> CreatePullPayment(string storeId, CreatePullPaymentRequest request)
 {
     if (request is null)
     {
         ModelState.AddModelError(string.Empty, "Missing body");
         return(this.CreateValidationError(ModelState));
     }
     if (request.Amount <= 0.0m)
     {
         ModelState.AddModelError(nameof(request.Amount), "The amount should more than 0.");
     }
     if (request.Name is String name && name.Length > 50)
     {
         ModelState.AddModelError(nameof(request.Name), "The name should be maximum 50 characters.");
     }
     if (request.Currency is String currency)
     {
         request.Currency = currency.ToUpperInvariant().Trim();
         if (_currencyNameTable.GetCurrencyData(request.Currency, false) is null)
         {
             ModelState.AddModelError(nameof(request.Currency), "Invalid currency");
         }
     }
     else
     {
         ModelState.AddModelError(nameof(request.Currency), "This field is required");
     }
     if (request.ExpiresAt is DateTimeOffset expires && request.StartsAt is DateTimeOffset start && expires < start)
     {
         ModelState.AddModelError(nameof(request.ExpiresAt), $"expiresAt should be higher than startAt");
     }
     if (request.Period <= TimeSpan.Zero)
     {
         ModelState.AddModelError(nameof(request.Period), $"The period should be positive");
     }
     if (request.BOLT11Expiration <= TimeSpan.Zero)
     {
         ModelState.AddModelError(nameof(request.BOLT11Expiration), $"The BOLT11 expiration should be positive");
     }
     PaymentMethodId?[]? paymentMethods = null;
     if (request.PaymentMethods is { } paymentMethodsStr)
     {
         paymentMethods = paymentMethodsStr.Select(s =>
         {
             PaymentMethodId.TryParse(s, out var pmi);
             return(pmi);
         }).ToArray();
         var supported = (await _payoutHandlers.GetSupportedPaymentMethods(HttpContext.GetStoreData())).ToArray();
         for (int i = 0; i < paymentMethods.Length; i++)
         {
             if (!supported.Contains(paymentMethods[i]))
             {
                 request.AddModelError(paymentRequest => paymentRequest.PaymentMethods[i], "Invalid or unsupported payment method", this);
             }
         }
     }
Ejemplo n.º 2
0
        public async Task <IActionResult> CreatePullPayment(string storeId, CreatePullPaymentRequest request)
        {
            if (request is null)
            {
                ModelState.AddModelError(string.Empty, "Missing body");
                return(this.CreateValidationError(ModelState));
            }
            if (request.Amount <= 0.0m)
            {
                ModelState.AddModelError(nameof(request.Amount), "The amount should more than 0.");
            }
            if (request.Name is String name && name.Length > 50)
            {
                ModelState.AddModelError(nameof(request.Name), "The name should be maximum 50 characters.");
            }
            if (request.Currency is String currency)
            {
                request.Currency = currency.ToUpperInvariant().Trim();
                if (_currencyNameTable.GetCurrencyData(request.Currency, false) is null)
                {
                    ModelState.AddModelError(nameof(request.Currency), "Invalid currency");
                }
            }
            else
            {
                ModelState.AddModelError(nameof(request.Currency), "This field is required");
            }
            if (request.ExpiresAt is DateTimeOffset expires && request.StartsAt is DateTimeOffset start && expires < start)
            {
                ModelState.AddModelError(nameof(request.ExpiresAt), $"expiresAt should be higher than startAt");
            }
            if (request.Period <= TimeSpan.Zero)
            {
                ModelState.AddModelError(nameof(request.Period), $"The period should be positive");
            }
            PaymentMethodId[] paymentMethods = null;
            if (request.PaymentMethods is string[] paymentMethodsStr)
            {
                paymentMethods = paymentMethodsStr.Select(p => new PaymentMethodId(p, PaymentTypes.BTCLike)).ToArray();
                foreach (var p in paymentMethods)
                {
                    var n = _networkProvider.GetNetwork <BTCPayNetwork>(p.CryptoCode);
                    if (n is null)
                    {
                        ModelState.AddModelError(nameof(request.PaymentMethods), "Invalid payment method");
                    }
                    if (n.ReadonlyWallet)
                    {
                        ModelState.AddModelError(nameof(request.PaymentMethods), "Invalid payment method (We do not support the crypto currency for refund)");
                    }
                }
                if (paymentMethods.Any(p => _networkProvider.GetNetwork <BTCPayNetwork>(p.CryptoCode) is null))
                {
                    ModelState.AddModelError(nameof(request.PaymentMethods), "Invalid payment method");
                }
            }
            else
            {
                ModelState.AddModelError(nameof(request.PaymentMethods), "This field is required");
            }
            if (!ModelState.IsValid)
            {
                return(this.CreateValidationError(ModelState));
            }
            var ppId = await _pullPaymentService.CreatePullPayment(new HostedServices.CreatePullPayment()
            {
                StartsAt         = request.StartsAt,
                ExpiresAt        = request.ExpiresAt,
                Period           = request.Period,
                Name             = request.Name,
                Amount           = request.Amount,
                Currency         = request.Currency,
                StoreId          = storeId,
                PaymentMethodIds = paymentMethods
            });

            var pp = await _pullPaymentService.GetPullPayment(ppId, false);

            return(this.Ok(CreatePullPaymentData(pp)));
        }
        public async Task <PullPaymentData> CreatePullPayment(string storeId, CreatePullPaymentRequest request, CancellationToken cancellationToken = default)
        {
            var response = await _httpClient.SendAsync(CreateHttpRequest($"api/v1/stores/{HttpUtility.UrlEncode(storeId)}/pull-payments", bodyPayload : request, method : HttpMethod.Post), cancellationToken);

            return(await HandleResponse <PullPaymentData>(response));
        }
Ejemplo n.º 4
0
        public async Task <IActionResult> CreatePullPayment(string storeId, CreatePullPaymentRequest request)
        {
            if (request is null)
            {
                ModelState.AddModelError(string.Empty, "Missing body");
                return(this.CreateValidationError(ModelState));
            }
            if (request.Amount <= 0.0m)
            {
                ModelState.AddModelError(nameof(request.Amount), "The amount should more than 0.");
            }
            if (request.Name is String name && name.Length > 50)
            {
                ModelState.AddModelError(nameof(request.Name), "The name should be maximum 50 characters.");
            }
            BTCPayNetwork network = null;

            if (request.Currency is String currency)
            {
                network = _networkProvider.GetNetwork <BTCPayNetwork>(currency);
                if (network is null)
                {
                    ModelState.AddModelError(nameof(request.Currency), $"Only crypto currencies are supported this field. (More will be supported soon)");
                }
            }
            else
            {
                ModelState.AddModelError(nameof(request.Currency), "This field is required");
            }
            if (request.ExpiresAt is DateTimeOffset expires && request.StartsAt is DateTimeOffset start && expires < start)
            {
                ModelState.AddModelError(nameof(request.ExpiresAt), $"expiresAt should be higher than startAt");
            }
            if (request.Period <= TimeSpan.Zero)
            {
                ModelState.AddModelError(nameof(request.Period), $"The period should be positive");
            }
            if (request.PaymentMethods is string[] paymentMethods)
            {
                if (paymentMethods.Length != 1 && paymentMethods[0] != request.Currency)
                {
                    ModelState.AddModelError(nameof(request.PaymentMethods), "We expect this array to only contains the same element as the `currency` field. (More will be supported soon)");
                }
            }
            else
            {
                ModelState.AddModelError(nameof(request.PaymentMethods), "This field is required");
            }
            if (!ModelState.IsValid)
            {
                return(this.CreateValidationError(ModelState));
            }
            var ppId = await _pullPaymentService.CreatePullPayment(new HostedServices.CreatePullPayment()
            {
                StartsAt         = request.StartsAt,
                ExpiresAt        = request.ExpiresAt,
                Period           = request.Period,
                Name             = request.Name,
                Amount           = request.Amount,
                Currency         = network.CryptoCode,
                StoreId          = storeId,
                PaymentMethodIds = new[] { new PaymentMethodId(network.CryptoCode, PaymentTypes.BTCLike) }
            });

            var pp = await _pullPaymentService.GetPullPayment(ppId);

            return(this.Ok(CreatePullPaymentData(pp)));
        }