btcpayserver/BTCPayServer/Controllers/UIAppsController.cs

186 lines
6.5 KiB
C#
Raw Normal View History

2020-06-29 04:44:35 +02:00
using System;
2018-04-03 04:50:41 +02:00
using System.Linq;
using System.Threading.Tasks;
using BTCPayServer.Abstractions.Constants;
using BTCPayServer.Client;
2021-12-31 08:59:02 +01:00
using BTCPayServer.Data;
2018-04-03 04:50:41 +02:00
using BTCPayServer.Models;
using BTCPayServer.Models.AppViewModels;
2018-08-22 10:26:49 +02:00
using BTCPayServer.Services.Apps;
using BTCPayServer.Services.Rates;
using BTCPayServer.Services.Stores;
using Microsoft.AspNetCore.Authorization;
2018-04-03 04:50:41 +02:00
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
namespace BTCPayServer.Controllers
{
[Authorize(Policy = Policies.CanModifyStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Cookie)]
2018-04-03 04:50:41 +02:00
[AutoValidateAntiforgeryToken]
[Route("apps")]
2022-01-07 04:32:00 +01:00
public partial class UIAppsController : Controller
2018-04-03 04:50:41 +02:00
{
2022-01-07 04:32:00 +01:00
public UIAppsController(
2018-04-03 04:50:41 +02:00
UserManager<ApplicationUser> userManager,
2018-12-28 17:38:20 +01:00
EventAggregator eventAggregator,
CurrencyNameTable currencies,
StoreRepository storeRepository,
AppService appService)
2018-04-03 04:50:41 +02:00
{
_userManager = userManager;
_eventAggregator = eventAggregator;
_currencies = currencies;
_storeRepository = storeRepository;
_appService = appService;
2018-04-03 04:50:41 +02:00
}
private readonly UserManager<ApplicationUser> _userManager;
private readonly EventAggregator _eventAggregator;
private readonly CurrencyNameTable _currencies;
private readonly StoreRepository _storeRepository;
private readonly AppService _appService;
public string CreatedAppId { get; set; }
2021-12-31 08:59:02 +01:00
[HttpGet("/stores/{storeId}/apps")]
public async Task<IActionResult> ListApps(
2021-12-31 08:59:02 +01:00
string storeId,
string sortOrder = null,
string sortOrderColumn = null
)
2018-04-03 04:50:41 +02:00
{
var store = GetCurrentStore();
var apps = await _appService.GetAllApps(GetUserId(), false, store.Id);
2021-12-31 08:59:02 +01:00
if (sortOrder != null && sortOrderColumn != null)
{
2021-12-31 08:59:02 +01:00
apps = apps.OrderByDescending(app =>
{
switch (sortOrderColumn)
{
case nameof(app.AppName):
return app.AppName;
case nameof(app.StoreName):
return app.StoreName;
case nameof(app.AppType):
return app.AppType;
default:
return app.Id;
}
}).ToArray();
switch (sortOrder)
{
case "desc":
ViewData[$"{sortOrderColumn}SortOrder"] = "asc";
break;
case "asc":
apps = apps.Reverse().ToArray();
ViewData[$"{sortOrderColumn}SortOrder"] = "desc";
break;
}
}
2021-12-31 08:59:02 +01:00
return View(new ListAppsViewModel
2018-04-03 04:50:41 +02:00
{
Apps = apps
});
}
[HttpGet("/stores/{storeId}/apps/create")]
public IActionResult CreateApp(string storeId)
2018-04-03 04:50:41 +02:00
{
return View(new CreateAppViewModel
2018-04-03 04:50:41 +02:00
{
StoreId = GetCurrentStore().Id
});
2018-04-03 04:50:41 +02:00
}
[HttpPost("/stores/{storeId}/apps/create")]
public async Task<IActionResult> CreateApp(string storeId, CreateAppViewModel vm)
2018-04-03 04:50:41 +02:00
{
var store = GetCurrentStore();
vm.StoreId = store.Id;
2018-04-03 04:50:41 +02:00
if (!Enum.TryParse(vm.SelectedAppType, out AppType appType))
2018-04-03 04:50:41 +02:00
ModelState.AddModelError(nameof(vm.SelectedAppType), "Invalid App Type");
if (!ModelState.IsValid)
{
return View(vm);
}
var appData = new AppData
2018-04-03 04:50:41 +02:00
{
StoreDataId = store.Id,
Name = vm.AppName,
AppType = appType.ToString()
};
var defaultCurrency = await GetStoreDefaultCurrentIfEmpty(appData.StoreDataId, null);
switch (appType)
{
case AppType.Crowdfund:
var emptyCrowdfund = new CrowdfundSettings { TargetCurrency = defaultCurrency };
appData.SetSettings(emptyCrowdfund);
break;
case AppType.PointOfSale:
var empty = new PointOfSaleSettings { Currency = defaultCurrency };
appData.SetSettings(empty);
break;
default:
throw new ArgumentOutOfRangeException();
}
await _appService.UpdateOrCreateApp(appData);
TempData[WellKnownTempData.SuccessMessage] = "App successfully created";
CreatedAppId = appData.Id;
2018-12-29 11:52:07 +01:00
return appType switch
2018-12-29 11:52:07 +01:00
{
AppType.PointOfSale => RedirectToAction(nameof(UpdatePointOfSale), new { appId = appData.Id }),
AppType.Crowdfund => RedirectToAction(nameof(UpdateCrowdfund), new { appId = appData.Id }),
_ => throw new ArgumentOutOfRangeException()
};
2018-04-03 04:50:41 +02:00
}
[HttpGet("{appId}/delete")]
public IActionResult DeleteApp(string appId)
2018-04-03 04:50:41 +02:00
{
var app = GetCurrentApp();
if (app == null)
2018-04-03 04:50:41 +02:00
return NotFound();
2021-12-31 08:59:02 +01:00
return View("Confirm", new ConfirmModel("Delete app", $"The app <strong>{app.Name}</strong> and its settings will be permanently deleted. Are you sure?", "Delete"));
2018-04-03 04:50:41 +02:00
}
[HttpPost("{appId}/delete")]
public async Task<IActionResult> DeleteAppPost(string appId)
{
var app = GetCurrentApp();
if (app == null)
return NotFound();
2021-12-31 08:59:02 +01:00
if (await _appService.DeleteApp(app))
TempData[WellKnownTempData.SuccessMessage] = "App deleted successfully.";
2021-12-31 08:59:02 +01:00
return RedirectToAction(nameof(UIStoresController.Dashboard), "UIStores", new { storeId = app.StoreDataId });
}
async Task<string> GetStoreDefaultCurrentIfEmpty(string storeId, string currency)
{
if (string.IsNullOrWhiteSpace(currency))
{
currency = (await _storeRepository.FindStore(storeId)).GetStoreBlob().DefaultCurrency;
}
return currency.Trim().ToUpperInvariant();
}
private string GetUserId() => _userManager.GetUserId(User);
private StoreData GetCurrentStore() => HttpContext.GetStoreData();
2021-12-31 08:59:02 +01:00
private AppData GetCurrentApp() => HttpContext.GetAppData();
2018-04-03 04:50:41 +02:00
}
}