public async Task <IActionResult> Create(CreateFiatExchangeConversionViewModel viewModel) { var services = await GetServices(); viewModel.BTCPayServices = new SelectList(services.btcPayServices, nameof(ExternalServiceData.Id), nameof(ExternalServiceData.Name)); viewModel.ExchangeServices = new SelectList(services.exchangeServices, nameof(ExternalServiceData.Id), nameof(ExternalServiceData.Name)); if (viewModel.Action.Equals("add-item", StringComparison.InvariantCultureIgnoreCase)) { viewModel.Conditions.Add(new CreateFiatExchangeConversionViewModel.ConversionConditionItem()); return(View(viewModel)); } if (viewModel.Action.StartsWith("remove-item", StringComparison.InvariantCultureIgnoreCase)) { var index = int.Parse(viewModel.Action.Substring(viewModel.Action.IndexOf(":") + 1)); viewModel.Conditions.RemoveAt(index); return(View(viewModel)); } if (!viewModel.Conditions.Any()) { ModelState.AddModelError(nameof(viewModel.Conditions), "You need to add at least one conversion scenario!"); } if (ModelState.IsValid) { for (var index = 0; index < viewModel.Conditions.Count; index++) { var condition = viewModel.Conditions[index]; var serviceData = await _externalServiceManager.GetExternalServiceData(condition.ExchangeServiceId, GetUserId()); var exchangeService = new ExchangeService(serviceData); var symbols = (await exchangeService.ConstructClient().GetMarketSymbolsAsync()).ToArray(); if (!symbols.Contains(condition.MarketSymbol)) { viewModel.AddModelError( $"{nameof(viewModel.Conditions)}[{index}].{nameof(CreateFiatExchangeConversionViewModel.ConversionConditionItem.MarketSymbol)}", $"The market symbols you entered is invalid. Please choose from the following: {string.Join(",", symbols)}", ModelState); } } } if (!ModelState.IsValid) { return(View(viewModel)); } return(await SetItUp(viewModel)); }
private async Task <IActionResult> SetItUp(CreateFiatExchangeConversionViewModel vm) { var presetName = $"Generated_FiatExchangeConversion"; var recipe = new Recipe() { Name = presetName, Description = "Generated from a preset", UserId = _userManager.GetUserId(User), Enabled = false }; await _recipeManager.AddOrUpdateRecipe(recipe); var recipeTrigger = new RecipeTrigger() { ExternalServiceId = vm.SelectedBTCPayExternalServiceId, TriggerId = new InvoiceStatusChangedTrigger().Id, RecipeId = recipe.Id }; recipeTrigger.Set(new InvoiceStatusChangedTriggerParameters() { Conditions = new List <InvoiceStatusChangeCondition>() { new InvoiceStatusChangeCondition() { Status = vm.Status, ExceptionStatuses = InvoiceStatusChangedController.AllowedExceptionStatus.Select(item => item.Value).ToList() } } }); await _recipeManager.AddOrUpdateRecipeTrigger(recipeTrigger); var recipeActionGroup = new RecipeActionGroup() { RecipeId = recipe.Id }; foreach (var condition in vm.Conditions) { await _recipeManager.AddRecipeActionGroup(recipeActionGroup); var recipeActionGroupIndex = 0; var getPayments = new RecipeAction() { RecipeId = recipe.Id, RecipeActionGroupId = recipeActionGroup.Id, ActionId = new GetPaymentsFromInvoiceDataActionHandler().ActionId, ExternalServiceId = vm.SelectedBTCPayExternalServiceId, Order = recipeActionGroupIndex, DataJson = JsonConvert.SerializeObject(new GetPaymentsFromInvoiceData() { CryptoCode = condition.CryptoCode, InvoiceId = "{{TriggerData.Invoice.Id}}", PaymentType = "" }) }; recipeActionGroupIndex++; await _recipeManager.AddOrUpdateRecipeAction(getPayments); var tradeAction = new RecipeAction() { RecipeId = recipe.Id, RecipeActionGroupId = recipeActionGroup.Id, ActionId = new PlaceOrderDataActionHandler().ActionId, ExternalServiceId = condition.ExchangeServiceId, Order = recipeActionGroupIndex, DataJson = JsonConvert.SerializeObject(new PlaceOrderData() { Amount = "{{PreviousAction.Sum(" + nameof(InvoicePaymentInfo.Value) + ")}}", IsBuy = condition.IsBuy, MarketSymbol = condition.MarketSymbol, OrderType = OrderType.Market }) }; recipeActionGroupIndex++; await _recipeManager.AddOrUpdateRecipeAction(tradeAction); } return(RedirectToAction("EditRecipe", "Recipes", new { id = recipe.Id, statusMessage = "Preset generated. Recipe is currently disabled for now. Please verify details are correct before enabling!" })); }