Beispiel #1
0
        public async Task CreateInvoice(ContributeToCrowdfund model)
        {
            model.RedirectToCheckout = false;
            _AppsPublicController.ControllerContext.HttpContext = Context.GetHttpContext();
            try
            {
                var result =
                    await _AppsPublicController.ContributeToCrowdfund(Context.Items["app"].ToString(), model);

                switch (result)
                {
                case OkObjectResult okObjectResult:
                    await Clients.Caller.SendCoreAsync(InvoiceCreated, new[] { okObjectResult.Value.ToString() });

                    break;

                case ObjectResult objectResult:
                    await Clients.Caller.SendCoreAsync(InvoiceError, new[] { objectResult.Value });

                    break;

                default:
                    await Clients.Caller.SendCoreAsync(InvoiceError, System.Array.Empty <object>());

                    break;
                }
            }
            catch (Exception)
            {
                await Clients.Caller.SendCoreAsync(InvoiceError, System.Array.Empty <object>());
            }
        }
        public async Task <IActionResult> ContributeToCrowdfund(string appId, ContributeToCrowdfund request, CancellationToken cancellationToken)
        {
            var app = await _AppService.GetApp(appId, AppType.Crowdfund, true);

            if (app == null)
            {
                return(NotFound());
            }
            var settings = app.GetSettings <CrowdfundSettings>();


            var isAdmin = await _AppService.GetAppDataIfOwner(GetUserId(), appId, AppType.Crowdfund) != null;

            if (!settings.Enabled && !isAdmin)
            {
                return(NotFound("Crowdfund is not currently active"));
            }

            var info = (ViewCrowdfundViewModel)await _AppService.GetAppInfo(appId);

            info.HubPath = AppHub.GetHubPath(this.Request);
            if (!isAdmin &&
                ((settings.StartDate.HasValue && DateTime.Now < settings.StartDate) ||
                 (settings.EndDate.HasValue && DateTime.Now > settings.EndDate) ||
                 (settings.EnforceTargetAmount &&
                  (info.Info.PendingProgressPercentage.GetValueOrDefault(0) +
                   info.Info.ProgressPercentage.GetValueOrDefault(0)) >= 100)))
            {
                return(NotFound("Crowdfund is not currently active"));
            }

            var store = await _AppService.GetStore(app);

            var title = settings.Title;
            var price = request.Amount;

            ViewPointOfSaleViewModel.Item choice = null;
            if (!string.IsNullOrEmpty(request.ChoiceKey))
            {
                var choices = _AppService.Parse(settings.PerksTemplate, settings.TargetCurrency);
                choice = choices.FirstOrDefault(c => c.Id == request.ChoiceKey);
                if (choice == null)
                {
                    return(NotFound("Incorrect option provided"));
                }
                title = choice.Title;
                price = choice.Price.Value;
                if (request.Amount > price)
                {
                    price = request.Amount;
                }
            }

            if (!isAdmin && (settings.EnforceTargetAmount && info.TargetAmount.HasValue && price >
                             (info.TargetAmount - (info.Info.CurrentAmount + info.Info.CurrentPendingAmount))))
            {
                return(NotFound("Contribution Amount is more than is currently allowed."));
            }

            store.AdditionalClaims.Add(new Claim(Policies.CanCreateInvoice.Key, store.Id));
            try
            {
                var invoice = await _InvoiceController.CreateInvoiceCore(new CreateInvoiceRequest()
                {
                    OrderId               = AppService.GetCrowdfundOrderId(appId),
                    Currency              = settings.TargetCurrency,
                    ItemCode              = request.ChoiceKey ?? string.Empty,
                    ItemDesc              = title,
                    BuyerEmail            = request.Email,
                    Price                 = price,
                    NotificationURL       = settings.NotificationUrl,
                    NotificationEmail     = settings.NotificationEmail,
                    FullNotifications     = true,
                    ExtendedNotifications = true,
                    RedirectURL           = request.RedirectUrl ??
                                            new Uri(new Uri(new Uri(HttpContext.Request.GetAbsoluteRoot()), _BtcPayServerOptions.RootPath), $"apps/{appId}/crowdfund").ToString()
                }, store, HttpContext.Request.GetAbsoluteRoot(),
                                                                         new List <string> {
                    AppService.GetAppInternalTag(appId)
                },
                                                                         cancellationToken : cancellationToken);

                if (request.RedirectToCheckout)
                {
                    return(RedirectToAction(nameof(InvoiceController.Checkout), "Invoice",
                                            new { invoiceId = invoice.Data.Id }));
                }
                else
                {
                    return(Ok(invoice.Data.Id));
                }
            }
            catch (BitpayHttpException e)
            {
                return(BadRequest(e.Message));
            }
        }
Beispiel #3
0
        public async Task <IActionResult> ContributeToCrowdfund(string appId, ContributeToCrowdfund request, CancellationToken cancellationToken)
        {
            var app = await _AppService.GetApp(appId, AppType.Crowdfund, true);

            if (app == null)
            {
                return(NotFound());
            }
            var settings = app.GetSettings <CrowdfundSettings>();

            var isAdmin = await _AppService.GetAppDataIfOwner(GetUserId(), appId, AppType.Crowdfund) != null;

            if (!settings.Enabled && !isAdmin)
            {
                return(NotFound("Crowdfund is not currently active"));
            }

            var info = await GetAppInfo(appId);

            if (!isAdmin &&
                ((settings.StartDate.HasValue && DateTime.Now < settings.StartDate) ||
                 (settings.EndDate.HasValue && DateTime.Now > settings.EndDate) ||
                 (settings.EnforceTargetAmount &&
                  (info.Info.PendingProgressPercentage.GetValueOrDefault(0) +
                   info.Info.ProgressPercentage.GetValueOrDefault(0)) >= 100)))
            {
                return(NotFound("Crowdfund is not currently active"));
            }

            var store = await _AppService.GetStore(app);

            var     title = settings.Title;
            decimal?price = request.Amount;
            Dictionary <string, InvoiceSupportedTransactionCurrency> paymentMethods = null;

            ViewPointOfSaleViewModel.Item choice = null;
            if (!string.IsNullOrEmpty(request.ChoiceKey))
            {
                var choices = _AppService.GetPOSItems(settings.PerksTemplate, settings.TargetCurrency);
                choice = choices.FirstOrDefault(c => c.Id == request.ChoiceKey);
                if (choice == null)
                {
                    return(NotFound("Incorrect option provided"));
                }
                title = choice.Title;

                if (choice.Price.Type == ViewPointOfSaleViewModel.Item.ItemPrice.ItemPriceType.Topup)
                {
                    price = null;
                }
                else
                {
                    price = choice.Price.Value;
                    if (request.Amount > price)
                    {
                        price = request.Amount;
                    }
                }
                if (choice.Inventory.HasValue)
                {
                    if (choice.Inventory <= 0)
                    {
                        return(NotFound("Option was out of stock"));
                    }
                }
                if (choice?.PaymentMethods?.Any() is true)
                {
                    paymentMethods = choice?.PaymentMethods.ToDictionary(s => s,
                                                                         s => new InvoiceSupportedTransactionCurrency()
                    {
                        Enabled = true
                    });
                }
            }
            else
            {
                if (request.Amount < 0)
                {
                    return(NotFound("Please provide an amount greater than 0"));
                }

                price = request.Amount;
            }

            if (!isAdmin && (settings.EnforceTargetAmount && info.TargetAmount.HasValue && price >
                             (info.TargetAmount - (info.Info.CurrentAmount + info.Info.CurrentPendingAmount))))
            {
                return(NotFound("Contribution Amount is more than is currently allowed."));
            }

            try
            {
                var invoice = await _InvoiceController.CreateInvoiceCore(new BitpayCreateInvoiceRequest()
                {
                    OrderId                        = AppService.GetCrowdfundOrderId(appId),
                    Currency                       = settings.TargetCurrency,
                    ItemCode                       = request.ChoiceKey ?? string.Empty,
                    ItemDesc                       = title,
                    BuyerEmail                     = request.Email,
                    Price                          = price,
                    NotificationURL                = settings.NotificationUrl,
                    FullNotifications              = true,
                    ExtendedNotifications          = true,
                    SupportedTransactionCurrencies = paymentMethods,
                    RedirectURL                    = request.RedirectUrl ??
                                                     new Uri(new Uri(new Uri(HttpContext.Request.GetAbsoluteRoot()), _BtcPayServerOptions.RootPath), $"apps/{appId}/crowdfund").ToString()
                }, store, HttpContext.Request.GetAbsoluteRoot(),
                                                                         new List <string> {
                    AppService.GetAppInternalTag(appId)
                },
                                                                         cancellationToken : cancellationToken);

                if (request.RedirectToCheckout)
                {
                    return(RedirectToAction(nameof(InvoiceController.Checkout), "Invoice",
                                            new { invoiceId = invoice.Data.Id }));
                }
                else
                {
                    return(Ok(invoice.Data.Id));
                }
            }
            catch (BitpayHttpException e)
            {
                return(BadRequest(e.Message));
            }
        }
        public async Task <IActionResult> ContributeToCrowdfund(string appId, ContributeToCrowdfund request)
        {
            var app = await _AppsHelper.GetApp(appId, AppType.Crowdfund, true);

            if (app == null)
            {
                return(NotFound());
            }
            var settings = app.GetSettings <CrowdfundSettings>();


            var isAdmin = await _AppsHelper.GetAppDataIfOwner(GetUserId(), appId, AppType.Crowdfund) != null;

            if (!settings.Enabled)
            {
                if (!isAdmin)
                {
                    return(NotFound("Crowdfund is not currently active"));
                }
            }

            var info = await _CrowdfundHubStreamer.GetCrowdfundInfo(appId);

            if (!isAdmin &&

                ((settings.StartDate.HasValue && DateTime.Now < settings.StartDate) ||
                 (settings.EndDate.HasValue && DateTime.Now > settings.EndDate) ||
                 (settings.EnforceTargetAmount &&
                  (info.Info.PendingProgressPercentage.GetValueOrDefault(0) +
                   info.Info.ProgressPercentage.GetValueOrDefault(0)) >= 100)))
            {
                return(NotFound("Crowdfund is not currently active"));
            }

            var store = await _AppsHelper.GetStore(app);

            var title = settings.Title;
            var price = request.Amount;

            ViewPointOfSaleViewModel.Item choice = null;
            if (!string.IsNullOrEmpty(request.ChoiceKey))
            {
                var choices = _AppsHelper.Parse(settings.PerksTemplate, settings.TargetCurrency);
                choice = choices.FirstOrDefault(c => c.Id == request.ChoiceKey);
                if (choice == null)
                {
                    return(NotFound("Incorrect option provided"));
                }
                title = choice.Title;
                price = choice.Price.Value;
                if (request.Amount > price)
                {
                    price = request.Amount;
                }
            }

            if (!isAdmin && (settings.EnforceTargetAmount && info.TargetAmount.HasValue && price >
                             (info.TargetAmount - (info.Info.CurrentAmount + info.Info.CurrentPendingAmount))))
            {
                return(NotFound("Contribution Amount is more than is currently allowed."));
            }

            store.AdditionalClaims.Add(new Claim(Policies.CanCreateInvoice.Key, store.Id));
            var invoice = await _InvoiceController.CreateInvoiceCore(new Invoice()
            {
                OrderId               = $"{CrowdfundHubStreamer.CrowdfundInvoiceOrderIdPrefix}{appId}",
                Currency              = settings.TargetCurrency,
                ItemCode              = request.ChoiceKey ?? string.Empty,
                ItemDesc              = title,
                BuyerEmail            = request.Email,
                Price                 = price,
                NotificationURL       = settings.NotificationUrl,
                FullNotifications     = true,
                ExtendedNotifications = true,
                RedirectURL           = request.RedirectUrl ?? Request.GetDisplayUrl(),
            }, store, HttpContext.Request.GetAbsoluteRoot());

            if (request.RedirectToCheckout)
            {
                return(RedirectToAction(nameof(InvoiceController.Checkout), "Invoice",
                                        new { invoiceId = invoice.Data.Id }));
            }
            else
            {
                return(Ok(invoice.Data.Id));
            }
        }