public async Task <IActionResult> Remove(int channelId) { var response = new StatusMessageModel(); var user = GetUser(); if (user == null) { return(Unauthorized("User not found.")); } if (!user.IsLogging(channelId)) { response.Message = "You are not currently logging this channel."; } else { var userChannel = user.UserChannels.FirstOrDefault(x => x.Channel.Id == channelId); if (userChannel == null) { response.Message = "You are not currently logging this channel."; } else { Database.UserChannels.Remove(userChannel); await Database.SaveChangesAsync(); response.Success = true; response.Message = "Channel was removed!"; } } return(Json(response)); }
public async Task <IActionResult> Update([FromBody] dynamic data) { var user = GetUser(); if (user == null) { return(Unauthorized("User not found.")); } var settings = JObject.Parse(data.ToString()); var response = new StatusMessageModel(); if (settings.ContainsKey("timezone")) { if (int.TryParse(settings["timezone"].ToString(), out int timezoneId)) { var timezone = Database.Timezones.FirstOrDefault(x => x.Id == timezoneId); if (timezone != null) { user.Timezone = timezone; } } } await Database.SaveChangesAsync(); response.Success = true; response.Message = "Settings have been saved!"; return(Json(response)); }
public static StatusMessageModel GetStatusMessageModel(this ITempDataDictionary tempData) { tempData.TryGetValue(WellKnownTempData.SuccessMessage, out var successMessage); tempData.TryGetValue(WellKnownTempData.ErrorMessage, out var errorMessage); tempData.TryGetValue("StatusMessageModel", out var model); if (successMessage != null || errorMessage != null) { var parsedModel = new StatusMessageModel(); parsedModel.Message = (string)successMessage ?? (string)errorMessage; if (successMessage != null) { parsedModel.Severity = StatusMessageModel.StatusSeverity.Success; } else { parsedModel.Severity = StatusMessageModel.StatusSeverity.Error; } return(parsedModel); } else if (model != null && model is string str) { return(JObject.Parse(str).ToObject <StatusMessageModel>()); } return(null); }
public async Task <IActionResult> CreateApp(CreateAppViewModel vm) { var stores = await _AppService.GetOwnedStores(GetUserId()); if (stores.Length == 0) { StatusMessage = new StatusMessageModel() { Html = $"Error: You need to create at least one store. <a href='{(Url.Action("CreateStore", "UserStores"))}'>Create store</a>", Severity = StatusMessageModel.StatusSeverity.Error }.ToString(); return(RedirectToAction(nameof(ListApps))); } var selectedStore = vm.SelectedStore; vm.SetStores(stores); vm.SelectedStore = selectedStore; if (!Enum.TryParse <AppType>(vm.SelectedAppType, out AppType appType)) { ModelState.AddModelError(nameof(vm.SelectedAppType), "Invalid App Type"); } if (!ModelState.IsValid) { return(View(vm)); } if (!stores.Any(s => s.Id == selectedStore)) { StatusMessage = "Error: You are not owner of this store"; return(RedirectToAction(nameof(ListApps))); } var appData = new AppData { StoreDataId = selectedStore, Name = vm.Name, AppType = appType.ToString() }; await _AppService.UpdateOrCreateApp(appData); StatusMessage = "App successfully created"; CreatedAppId = appData.Id; switch (appType) { case AppType.PointOfSale: return(RedirectToAction(nameof(UpdatePointOfSale), new { appId = appData.Id })); case AppType.Crowdfund: return(RedirectToAction(nameof(UpdateCrowdfund), new { appId = appData.Id })); default: return(RedirectToAction(nameof(ListApps))); } }
public static void SetStatusMessageModel(this ITempDataDictionary tempData, StatusMessageModel statusMessage) { if (statusMessage == null) { tempData.Remove("StatusMessageModel"); return; } tempData["StatusMessageModel"] = JObject.FromObject(statusMessage).ToString(Formatting.None); }
public static void SetStatusMessageModel(this ITempDataDictionary tempData, StatusMessageModel statusMessage) { if (statusMessage == null) { tempData.Remove("StatusMessageModel"); return; } tempData["StatusMessageModel"] = JsonSerializer.Serialize(statusMessage, new JsonSerializerOptions()); }
internal IWebElement FindAlertMessage(StatusMessageModel.StatusSeverity severity = StatusMessageModel.StatusSeverity.Success) { var el = Driver.FindElements(By.ClassName($"alert-{StatusMessageModel.ToString(severity)}")).FirstOrDefault(e => e.Displayed); if (el is null) { throw new NoSuchElementException($"Unable to find alert-{StatusMessageModel.ToString(severity)}"); } return(el); }
public async Task <IActionResult> Add(string channelName) { var response = new StatusMessageModel(); var user = GetUser(); if (user == null) { return(Unauthorized("User not found.")); } if (user.IsLogging(channelName)) { response.Message = "You are already logging this channel."; } else { //Check enough credits. if (user.Credits >= 1) { var channel = Database.Channels.FirstOrDefault(x => x.Name == channelName); if (channel == null) { //No channel found, so add it. var api = new TwitchAPI(); api.Settings.ClientId = "vrb2zs5y4cc94vknoalfgxygzacfcw"; var userChannel = (await api.V5.Users.GetUsersByNameAsync(new List <string> { channelName })).Matches.FirstOrDefault(); if (userChannel == null) { response.Message = "This channel does not exist."; return(Json(response)); } var newChannel = new Channel { Name = channelName }; Database.Channels.Add(newChannel); Database.SaveChanges(); channel = newChannel; } //Add channel to user's logged channels. Database.UserChannels.Add(new UserChannel { Channel = channel, User = user }); user.Credits--; Database.SaveChanges(); response.Success = true; response.Message = "Added channel to logs!"; } else { response.Message = "You don't have enough credits."; } } return(Json(response)); }
internal IWebElement FindAlertMessage(StatusMessageModel.StatusSeverity severity = StatusMessageModel.StatusSeverity.Success) { var className = $"alert-{StatusMessageModel.ToString(severity)}"; var el = Driver.FindElement(By.ClassName(className)) ?? Driver.WaitForElement(By.ClassName(className)); if (el is null) { throw new NoSuchElementException($"Unable to find {className}"); } return(el); }
internal void AssertHappyMessage(StatusMessageModel.StatusSeverity severity = StatusMessageModel.StatusSeverity.Success) { using var cts = new CancellationTokenSource(20_000); while (!cts.IsCancellationRequested) { var success = Driver.FindElements(By.ClassName($"alert-{StatusMessageModel.ToString(severity)}")).Any(el => el.Displayed); if (success) { return; } Thread.Sleep(100); } Logs.Tester.LogInformation(this.Driver.PageSource); Assert.True(false, $"Should have shown {severity} message"); }
public async Task <IActionResult> CreateApp() { var stores = await _AppService.GetOwnedStores(GetUserId()); if (stores.Length == 0) { StatusMessage = new StatusMessageModel() { Html = $"Error: Necesitas crear al menos una tienda.. <a href='{(Url.Action("CreateStore", "UserStores"))}'>Crear tienda</a>", Severity = StatusMessageModel.StatusSeverity.Error }.ToString(); return(RedirectToAction(nameof(ListApps))); } var vm = new CreateAppViewModel(); vm.SetStores(stores); return(View(vm)); }
public async Task <IActionResult> CreateApp() { var stores = await _AppsHelper.GetOwnedStores(GetUserId()); if (stores.Length == 0) { StatusMessage = new StatusMessageModel() { Html = $"Error: You must have created at least one store. <a href='{(Url.Action("CreateStore", "UserStores"))}'>Create store</a>", Severity = StatusMessageModel.StatusSeverity.Error }.ToString(); return(RedirectToAction(nameof(ListApps))); } var vm = new CreateAppViewModel(); vm.SetStores(stores); return(View(vm)); }
public async Task <IActionResult> Disable2fa(StatusMessageModel model) { var user = await _userManager.GetUserAsync(User); if (user == null) { return(NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.")); } var disable2faResult = await _userManager.SetTwoFactorEnabledAsync(user, false); if (!disable2faResult.Succeeded) { throw new InvalidOperationException($"Unexpected error occurred disabling 2FA for user with ID '{_userManager.GetUserId(User)}'."); } _logger.LogInformation("User with ID '{UserId}' has disabled 2fa.", _userManager.GetUserId(User)); model.StatusMessage = "2fa has been disabled. You can reenable 2fa when you setup an authenticator app"; return(RedirectToAction("TwoFactorAuthentication")); }
public async Task <IActionResult> ResetAuthenticator(StatusMessageModel model) { var user = await _userManager.GetUserAsync(User); if (user == null) { return(NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.")); } await _userManager.SetTwoFactorEnabledAsync(user, false); await _userManager.ResetAuthenticatorKeyAsync(user); _logger.LogInformation("User with ID '{UserId}' has reset their authentication app key.", user.Id); await _signInManager.RefreshSignInAsync(user); model.StatusMessage = "Your authenticator app key has been reset, you will need to configure your authenticator app using the new key."; return(RedirectToAction("EnableAuthenticator")); }
private async Task <IActionResult> SaveStorageProvider(IBaseStorageConfiguration viewModel, StorageProvider storageProvider) { if (!ModelState.IsValid) { return(View(viewModel)); } var data = (await _SettingsRepository.GetSettingAsync <StorageSettings>()) ?? new StorageSettings(); data.Provider = storageProvider; data.Configuration = JObject.FromObject(viewModel); await _SettingsRepository.UpdateSetting(data); TempData["StatusMessage"] = new StatusMessageModel() { Severity = StatusMessageModel.StatusSeverity.Success, Message = "Storage settings updated successfully" }.ToString(); return(View(viewModel)); }
public async Task <IActionResult> ConfirmEmailChange(string userId, string email, string code) { var model = new StatusMessageModel(); if (userId == null || email == null || code == null) { return(RedirectToAction("Index")); } var user = await _userManager.FindByIdAsync(userId); if (user == null) { return(NotFound($"Unable to load user with ID '{userId}'.")); } code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code)); var result = await _userManager.ChangeEmailAsync(user, email, code); if (!result.Succeeded) { model.StatusMessage = "Error changing email."; return(View(model)); } // In our UI email and user name are one and the same, so when we update the email // we need to update the user name. var setUserNameResult = await _userManager.SetUserNameAsync(user, email); if (!setUserNameResult.Succeeded) { model.StatusMessage = "Error changing user name."; return(View(model)); } await _signInManager.RefreshSignInAsync(user); model.StatusMessage = "Thank you for confirming your email change."; return(View(model)); }
public async Task <IActionResult> ConfirmEmail(string userId, string code) { var model = new StatusMessageModel(); if (userId == null || code == null) { return(RedirectToAction("Index")); } var user = await _userManager.FindByIdAsync(userId); if (user == null) { return(NotFound($"Unable to load user with ID '{userId}'.")); } code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code)); var result = await _userManager.ConfirmEmailAsync(user, code); model.StatusMessage = result.Succeeded ? "Thank you for confirming your email." : "Error confirming your email."; return(View(model)); }
internal IWebElement FindAlertMessage(StatusMessageModel.StatusSeverity severity = StatusMessageModel.StatusSeverity.Success) => Driver.FindElement(By.ClassName($"alert-{StatusMessageModel.ToString(severity)}"));
#pragma warning disable 1998 public async override global::System.Threading.Tasks.Task ExecuteAsync() { BeginContext(14, 1, true); WriteLiteral("\n"); EndContext(); #line 3 "C:\Users\Rolando\Desktop\BTCPAY\btcpayserver-master\btcpayserver-master\BTCPayServer\Views\Shared\_StatusMessage.cshtml" if (!string.IsNullOrEmpty(Model)) { var parsedModel = new StatusMessageModel(Model); #line default #line hidden BeginContext(104, 8, true); WriteLiteral(" <div"); EndContext(); BeginWriteAttribute("class", " class=\"", 112, "\"", 174, 4); WriteAttributeValue("", 120, "alert", 120, 5, true); WriteAttributeValue(" ", 125, "alert-", 126, 7, true); #line 6 "C:\Users\Rolando\Desktop\BTCPAY\btcpayserver-master\btcpayserver-master\BTCPayServer\Views\Shared\_StatusMessage.cshtml" WriteAttributeValue("", 132, parsedModel.SeverityCSS, 132, 24, false); #line default #line hidden WriteAttributeValue(" ", 156, "alert-dismissible", 157, 18, true); EndWriteAttribute(); BeginContext(175, 148, true); WriteLiteral(" role=\"alert\">\n <button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-label=\"Close\"><span aria-hidden=\"true\">×</span></button>\n"); EndContext(); #line 8 "C:\Users\Rolando\Desktop\BTCPAY\btcpayserver-master\btcpayserver-master\BTCPayServer\Views\Shared\_StatusMessage.cshtml" if (!string.IsNullOrEmpty(parsedModel.Message)) { #line default #line hidden BeginContext(403, 19, false); #line 10 "C:\Users\Rolando\Desktop\BTCPAY\btcpayserver-master\btcpayserver-master\BTCPayServer\Views\Shared\_StatusMessage.cshtml" Write(parsedModel.Message); #line default #line hidden EndContext(); #line 10 "C:\Users\Rolando\Desktop\BTCPAY\btcpayserver-master\btcpayserver-master\BTCPayServer\Views\Shared\_StatusMessage.cshtml" } #line default #line hidden BeginContext(433, 8, true); WriteLiteral(" "); EndContext(); #line 12 "C:\Users\Rolando\Desktop\BTCPAY\btcpayserver-master\btcpayserver-master\BTCPayServer\Views\Shared\_StatusMessage.cshtml" if (!string.IsNullOrEmpty(parsedModel.Html)) { #line default #line hidden BeginContext(510, 26, false); #line 14 "C:\Users\Rolando\Desktop\BTCPAY\btcpayserver-master\btcpayserver-master\BTCPayServer\Views\Shared\_StatusMessage.cshtml" Write(Html.Raw(parsedModel.Html)); #line default #line hidden EndContext(); #line 14 "C:\Users\Rolando\Desktop\BTCPAY\btcpayserver-master\btcpayserver-master\BTCPayServer\Views\Shared\_StatusMessage.cshtml" } #line default #line hidden BeginContext(547, 11, true); WriteLiteral(" </div>\n"); EndContext(); #line 17 "C:\Users\Rolando\Desktop\BTCPAY\btcpayserver-master\btcpayserver-master\BTCPayServer\Views\Shared\_StatusMessage.cshtml" } #line default #line hidden }
internal IWebElement FindAlertMessage(params StatusMessageModel.StatusSeverity[] severity) { var className = string.Join(", ", severity.Select(statusSeverity => $".alert-{StatusMessageModel.ToString(statusSeverity)}")); var el = Driver.FindElement(By.CssSelector(className)) ?? Driver.WaitForElement(By.CssSelector(className)); if (el is null) { throw new NoSuchElementException($"Unable to find {className}"); } return(el); }
public async Task <IActionResult> CreateApp(CreateAppViewModel vm) { var stores = await _AppsHelper.GetOwnedStores(GetUserId()); if (stores.Length == 0) { StatusMessage = new StatusMessageModel() { Html = $"Error: You must have created at least one store. <a href='{(Url.Action("CreateStore", "UserStores"))}'>Create store</a>", Severity = StatusMessageModel.StatusSeverity.Error }.ToString(); return(RedirectToAction(nameof(ListApps))); } var selectedStore = vm.SelectedStore; vm.SetStores(stores); vm.SelectedStore = selectedStore; if (!Enum.TryParse <AppType>(vm.SelectedAppType, out AppType appType)) { ModelState.AddModelError(nameof(vm.SelectedAppType), "Invalid App Type"); } if (!ModelState.IsValid) { return(View(vm)); } if (!stores.Any(s => s.Id == selectedStore)) { StatusMessage = "Error: You are not owner of this store"; return(RedirectToAction(nameof(ListApps))); } var id = Encoders.Base58.EncodeData(RandomUtils.GetBytes(20)); using (var ctx = _ContextFactory.CreateContext()) { var appData = new AppData() { Id = id }; appData.StoreDataId = selectedStore; appData.Name = vm.Name; appData.AppType = appType.ToString(); ctx.Apps.Add(appData); await ctx.SaveChangesAsync(); } StatusMessage = "App successfully created"; CreatedAppId = id; switch (appType) { case AppType.PointOfSale: return(RedirectToAction(nameof(UpdatePointOfSale), new { appId = id })); case AppType.Crowdfund: return(RedirectToAction(nameof(UpdateCrowdfund), new { appId = id })); default: return(RedirectToAction(nameof(ListApps))); } }
internal IWebElement FindAlertMessage(params StatusMessageModel.StatusSeverity[] severity) { var className = string.Join(", ", severity.Select(statusSeverity => $".alert-{StatusMessageModel.ToString(statusSeverity)}")); IWebElement el; try { var elements = Driver.FindElements(By.CssSelector(className)); el = elements.FirstOrDefault(e => e.Displayed); if (el is null) { el = elements.FirstOrDefault(); } if (el is null) { el = Driver.WaitForElement(By.CssSelector(className)); } } catch (NoSuchElementException) { el = Driver.WaitForElement(By.CssSelector(className)); } if (el is null) { throw new NoSuchElementException($"Unable to find {className}"); } if (!el.Displayed) { throw new ElementNotVisibleException($"{className} is present, but not displayed: {el.GetAttribute("id")} - Text: {el.Text}"); } return(el); }
#pragma warning disable 1998 public async override global::System.Threading.Tasks.Task ExecuteAsync() { BeginContext(15, 2, true); WriteLiteral("\r\n"); EndContext(); #line 3 "C:\Users\Rolando\Desktop\BTCPAY\banexcoinpay-master-github\banexcoinpay\BTCPayServer\Views\Shared\_StatusMessage.cshtml" if (!string.IsNullOrEmpty(Model)) { var parsedModel = new StatusMessageModel(Model); #line default #line hidden BeginContext(109, 8, true); WriteLiteral(" <div"); EndContext(); BeginWriteAttribute("class", " class=\"", 117, "\"", 179, 4); WriteAttributeValue("", 125, "alert", 125, 5, true); WriteAttributeValue(" ", 130, "alert-", 131, 7, true); #line 6 "C:\Users\Rolando\Desktop\BTCPAY\banexcoinpay-master-github\banexcoinpay\BTCPayServer\Views\Shared\_StatusMessage.cshtml" WriteAttributeValue("", 137, parsedModel.SeverityCSS, 137, 24, false); #line default #line hidden WriteAttributeValue(" ", 161, "alert-dismissible", 162, 18, true); EndWriteAttribute(); BeginContext(180, 150, true); WriteLiteral(" role=\"alert\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-label=\"Close\"><span aria-hidden=\"true\">×</span></button>\r\n"); EndContext(); #line 8 "C:\Users\Rolando\Desktop\BTCPAY\banexcoinpay-master-github\banexcoinpay\BTCPayServer\Views\Shared\_StatusMessage.cshtml" if (!string.IsNullOrEmpty(parsedModel.Message)) { #line default #line hidden BeginContext(412, 19, false); #line 10 "C:\Users\Rolando\Desktop\BTCPAY\banexcoinpay-master-github\banexcoinpay\BTCPayServer\Views\Shared\_StatusMessage.cshtml" Write(parsedModel.Message); #line default #line hidden EndContext(); #line 10 "C:\Users\Rolando\Desktop\BTCPAY\banexcoinpay-master-github\banexcoinpay\BTCPayServer\Views\Shared\_StatusMessage.cshtml" } #line default #line hidden BeginContext(444, 8, true); WriteLiteral(" "); EndContext(); #line 12 "C:\Users\Rolando\Desktop\BTCPAY\banexcoinpay-master-github\banexcoinpay\BTCPayServer\Views\Shared\_StatusMessage.cshtml" if (!string.IsNullOrEmpty(parsedModel.Html)) { #line default #line hidden BeginContext(523, 26, false); #line 14 "C:\Users\Rolando\Desktop\BTCPAY\banexcoinpay-master-github\banexcoinpay\BTCPayServer\Views\Shared\_StatusMessage.cshtml" Write(Html.Raw(parsedModel.Html)); #line default #line hidden EndContext(); #line 14 "C:\Users\Rolando\Desktop\BTCPAY\banexcoinpay-master-github\banexcoinpay\BTCPayServer\Views\Shared\_StatusMessage.cshtml" } #line default #line hidden BeginContext(562, 12, true); WriteLiteral(" </div>\r\n"); EndContext(); #line 17 "C:\Users\Rolando\Desktop\BTCPAY\banexcoinpay-master-github\banexcoinpay\BTCPayServer\Views\Shared\_StatusMessage.cshtml" } #line default #line hidden }
private async Task CanUploadRemoveFiles(ServerController controller) { var fileContent = "content"; var uploadFormFileResult = Assert.IsType <RedirectToActionResult>(await controller.CreateFile(TestUtils.GetFormFile("uploadtestfile.txt", fileContent))); Assert.True(uploadFormFileResult.RouteValues.ContainsKey("fileId")); var fileId = uploadFormFileResult.RouteValues["fileId"].ToString(); Assert.Equal("Files", uploadFormFileResult.ActionName); //check if file was uploaded and saved in db var viewFilesViewModel = Assert.IsType <ViewFilesViewModel>(Assert.IsType <ViewResult>(await controller.Files(fileId)).Model); Assert.NotEmpty(viewFilesViewModel.Files); Assert.Equal(fileId, viewFilesViewModel.SelectedFileId); Assert.NotEmpty(viewFilesViewModel.DirectFileUrl); //verify file is available and the same var net = new System.Net.WebClient(); var data = await net.DownloadStringTaskAsync(new Uri(viewFilesViewModel.DirectFileUrl)); Assert.Equal(fileContent, data); //create a temporary link to file var tmpLinkGenerate = Assert.IsType <RedirectToActionResult>(await controller.CreateTemporaryFileUrl(fileId, new ServerController.CreateTemporaryFileUrlViewModel() { IsDownload = true, TimeAmount = 1, TimeType = ServerController.CreateTemporaryFileUrlViewModel.TmpFileTimeType.Minutes })); Assert.True(tmpLinkGenerate.RouteValues.ContainsKey("StatusMessage")); var statusMessageModel = new StatusMessageModel(tmpLinkGenerate.RouteValues["StatusMessage"].ToString()); Assert.Equal(StatusMessageModel.StatusSeverity.Success, statusMessageModel.Severity); var index = statusMessageModel.Html.IndexOf("target='_blank'>"); var url = statusMessageModel.Html.Substring(index).ReplaceMultiple(new Dictionary <string, string>() { { "</a>", string.Empty }, { "target='_blank'>", string.Empty } }); //verify tmpfile is available and the same data = await net.DownloadStringTaskAsync(new Uri(url)); Assert.Equal(fileContent, data); //delete file Assert.Equal(StatusMessageModel.StatusSeverity.Success, new StatusMessageModel(Assert .IsType <RedirectToActionResult>(await controller.DeleteFile(fileId)) .RouteValues["statusMessage"].ToString()).Severity); //attempt to fetch deleted file viewFilesViewModel = Assert.IsType <ViewFilesViewModel>(Assert.IsType <ViewResult>(await controller.Files(fileId)).Model); Assert.Null(viewFilesViewModel.DirectFileUrl); Assert.Null(viewFilesViewModel.SelectedFileId); }
public async Task <IActionResult> CreateApp(CreateAppViewModel vm) { var stores = await _AppService.GetOwnedStores(GetUserId()); if (stores.Length == 0) { StatusMessage = new StatusMessageModel() { Html = $"Error: Necesitas crear al menos una tienda. <a href='{(Url.Action("CreateStore", "UserStores"))}'>Crear tienda</a>", Severity = StatusMessageModel.StatusSeverity.Error }.ToString(); return(RedirectToAction(nameof(ListApps))); } var selectedStore = vm.SelectedStore; vm.SetStores(stores); vm.SelectedStore = selectedStore; if (!Enum.TryParse <AppType>(vm.SelectedAppType, out AppType appType)) { ModelState.AddModelError(nameof(vm.SelectedAppType), "Tipo de aplicación no válido"); } if (!ModelState.IsValid) { return(View(vm)); } if (!stores.Any(s => s.Id == selectedStore)) { StatusMessage = "Error: No eres propietario de esta tienda."; return(RedirectToAction(nameof(ListApps))); } var id = Encoders.Base58.EncodeData(RandomUtils.GetBytes(20)); using (var ctx = _ContextFactory.CreateContext()) { var appData = new AppData() { Id = id }; appData.StoreDataId = selectedStore; appData.Name = vm.Name; appData.AppType = appType.ToString(); ctx.Apps.Add(appData); await ctx.SaveChangesAsync(); } StatusMessage = "Aplicación creada con éxito"; CreatedAppId = id; switch (appType) { case AppType.PointOfSale: return(RedirectToAction(nameof(UpdatePointOfSale), new { appId = id })); case AppType.Crowdfund: return(RedirectToAction(nameof(UpdateCrowdfund), new { appId = id })); default: return(RedirectToAction(nameof(ListApps))); } }