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)); } }
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)); } }