using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using BTCPayServer.Models; using BTCPayServer.Models.StoreViewModels; using BTCPayServer.Security; using BTCPayServer.Services.Stores; using BTCPayServer.Services.Wallets; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using NBXplorer.DerivationStrategy; namespace BTCPayServer.Controllers { [Route("stores")] [Authorize(AuthenticationSchemes = Policies.CookieAuthentication)] [AutoValidateAntiforgeryToken] public partial class UserStoresController : Controller { private StoreRepository _Repo; private BTCPayNetworkProvider _NetworkProvider; private UserManager _UserManager; public UserStoresController( UserManager userManager, BTCPayNetworkProvider networkProvider, StoreRepository storeRepository) { _Repo = storeRepository; _NetworkProvider = networkProvider; _UserManager = userManager; } [HttpGet] [Route("create")] public IActionResult CreateStore() { return View(); } public string CreatedStoreId { get; set; } [HttpGet] [Route("{storeId}/me/delete")] public IActionResult DeleteStore(string storeId) { var store = HttpContext.GetStoreData(); if (store == null) return NotFound(); return View("Confirm", new ConfirmModel() { Title = "Delete store " + store.StoreName, Description = "This store will still be accessible to users sharing it", Action = "Delete" }); } [HttpPost] [Route("{storeId}/me/delete")] public async Task DeleteStorePost(string storeId) { var userId = GetUserId(); var store = HttpContext.GetStoreData(); if (store == null) return NotFound(); await _Repo.RemoveStore(storeId, userId); StatusMessage = "Store removed successfully"; return RedirectToAction(nameof(ListStores)); } [TempData] public string StatusMessage { get; set; } [HttpGet] public async Task ListStores() { StoresViewModel result = new StoresViewModel(); var stores = await _Repo.GetStoresByUserId(GetUserId()); for (int i = 0; i < stores.Length; i++) { var store = stores[i]; result.Stores.Add(new StoresViewModel.StoreViewModel() { Id = store.Id, Name = store.StoreName, WebSite = store.StoreWebsite, IsOwner = store.HasClaim(Policies.CanModifyStoreSettings.Key) }); } return View(result); } [HttpPost] [Route("create")] public async Task CreateStore(CreateStoreViewModel vm) { if (!ModelState.IsValid) { return View(vm); } var store = await _Repo.CreateStore(GetUserId(), vm.Name); CreatedStoreId = store.Id; StatusMessage = "Store successfully created"; return RedirectToAction(nameof(StoresController.UpdateStore), "Stores", new { storeId = store.Id }); } private string GetUserId() { return _UserManager.GetUserId(User); } } }