mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2025-12-17 22:14:26 +01:00
Add link to no stores error (#558)
* add link * safer status message * refactor * small view cleanup
This commit is contained in:
committed by
Nicolas Dorier
parent
a815fad3f1
commit
0c5b5ff49c
@@ -2312,6 +2312,42 @@ donation:
|
|||||||
Assert.Throws<InvalidOperationException>(() => fetch.GetRatesAsync().GetAwaiter().GetResult());
|
Assert.Throws<InvalidOperationException>(() => fetch.GetRatesAsync().GetAwaiter().GetResult());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
[Trait("Fast", "Fast")]
|
||||||
|
public void CheckParseStatusMessageModel()
|
||||||
|
{
|
||||||
|
var legacyStatus = "Error: some bad shit happened";
|
||||||
|
var parsed = new StatusMessageModel(legacyStatus);
|
||||||
|
Assert.Equal(legacyStatus, parsed.Message);
|
||||||
|
Assert.Equal(StatusMessageModel.StatusSeverity.Error, parsed.Severity);
|
||||||
|
|
||||||
|
var legacyStatus2 = "Some normal shit happened";
|
||||||
|
parsed = new StatusMessageModel(legacyStatus2);
|
||||||
|
Assert.Equal(legacyStatus2, parsed.Message);
|
||||||
|
Assert.Equal(StatusMessageModel.StatusSeverity.Success, parsed.Severity);
|
||||||
|
|
||||||
|
var newStatus = new StatusMessageModel()
|
||||||
|
{
|
||||||
|
Html = "<a href='xxx'>something new</a>",
|
||||||
|
Severity = StatusMessageModel.StatusSeverity.Info
|
||||||
|
};
|
||||||
|
parsed = new StatusMessageModel(newStatus.ToString());
|
||||||
|
Assert.Null(parsed.Message);
|
||||||
|
Assert.Equal(newStatus.Html, parsed.Html);
|
||||||
|
Assert.Equal(StatusMessageModel.StatusSeverity.Info, parsed.Severity);
|
||||||
|
|
||||||
|
var newStatus2 = new StatusMessageModel()
|
||||||
|
{
|
||||||
|
Message = "something new",
|
||||||
|
Severity = StatusMessageModel.StatusSeverity.Success
|
||||||
|
};
|
||||||
|
parsed = new StatusMessageModel(newStatus2.ToString());
|
||||||
|
Assert.Null(parsed.Html);
|
||||||
|
Assert.Equal(newStatus2.Message, parsed.Message);
|
||||||
|
Assert.Equal(StatusMessageModel.StatusSeverity.Success, parsed.Severity);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private static bool IsMapped(Invoice invoice, ApplicationDbContext ctx)
|
private static bool IsMapped(Invoice invoice, ApplicationDbContext ctx)
|
||||||
{
|
{
|
||||||
var h = BitcoinAddress.Create(invoice.BitcoinAddress, Network.RegTest).ScriptPubKey.Hash.ToString();
|
var h = BitcoinAddress.Create(invoice.BitcoinAddress, Network.RegTest).ScriptPubKey.Hash.ToString();
|
||||||
|
|||||||
@@ -73,7 +73,12 @@ namespace BTCPayServer.Controllers
|
|||||||
var stores = await _AppsHelper.GetOwnedStores(GetUserId());
|
var stores = await _AppsHelper.GetOwnedStores(GetUserId());
|
||||||
if (stores.Length == 0)
|
if (stores.Length == 0)
|
||||||
{
|
{
|
||||||
StatusMessage = "Error: You must have created at least one store";
|
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));
|
return RedirectToAction(nameof(ListApps));
|
||||||
}
|
}
|
||||||
var vm = new CreateAppViewModel();
|
var vm = new CreateAppViewModel();
|
||||||
@@ -88,7 +93,12 @@ namespace BTCPayServer.Controllers
|
|||||||
var stores = await _AppsHelper.GetOwnedStores(GetUserId());
|
var stores = await _AppsHelper.GetOwnedStores(GetUserId());
|
||||||
if (stores.Length == 0)
|
if (stores.Length == 0)
|
||||||
{
|
{
|
||||||
StatusMessage = "Error: You must own at least one store";
|
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));
|
return RedirectToAction(nameof(ListApps));
|
||||||
}
|
}
|
||||||
var selectedStore = vm.SelectedStore;
|
var selectedStore = vm.SelectedStore;
|
||||||
|
|||||||
80
BTCPayServer/Models/StatusMessageModel.cs
Normal file
80
BTCPayServer/Models/StatusMessageModel.cs
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
using System;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
|
namespace BTCPayServer.Models
|
||||||
|
{
|
||||||
|
public class StatusMessageModel
|
||||||
|
{
|
||||||
|
public StatusMessageModel()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public StatusMessageModel(string s)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(s))
|
||||||
|
return;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (s.StartsWith("{", StringComparison.InvariantCultureIgnoreCase) &&
|
||||||
|
s.EndsWith("}", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
{
|
||||||
|
var model = JObject.Parse(s).ToObject<StatusMessageModel>();
|
||||||
|
Html = model.Html;
|
||||||
|
Message = model.Message;
|
||||||
|
Severity = model.Severity;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ParseNonJsonStatus(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
ParseNonJsonStatus(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Message { get; set; }
|
||||||
|
public string Html { get; set; }
|
||||||
|
public StatusSeverity Severity { get; set; }
|
||||||
|
|
||||||
|
public string SeverityCSS
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
switch (Severity)
|
||||||
|
{
|
||||||
|
case StatusSeverity.Info:
|
||||||
|
return "info";
|
||||||
|
case StatusSeverity.Error:
|
||||||
|
return "danger";
|
||||||
|
case StatusSeverity.Success:
|
||||||
|
return "success";
|
||||||
|
default:
|
||||||
|
throw new ArgumentOutOfRangeException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return JObject.FromObject(this).ToString(Formatting.None);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ParseNonJsonStatus(string s)
|
||||||
|
{
|
||||||
|
Message = s;
|
||||||
|
Severity = s.StartsWith("Error", StringComparison.InvariantCultureIgnoreCase)
|
||||||
|
? StatusSeverity.Error
|
||||||
|
: StatusSeverity.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum StatusSeverity
|
||||||
|
{
|
||||||
|
Info,
|
||||||
|
Error,
|
||||||
|
Success
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,10 +1,17 @@
|
|||||||
@model string
|
@model string
|
||||||
|
|
||||||
@if(!String.IsNullOrEmpty(Model))
|
@if(!string.IsNullOrEmpty(Model))
|
||||||
{
|
{
|
||||||
var statusMessageClass = Model.StartsWith("Error") ? "danger" : "success";
|
var parsedModel = new StatusMessageModel(Model);
|
||||||
<div class="alert alert-@statusMessageClass alert-dismissible" role="alert">
|
<div class="alert alert-@parsedModel.SeverityCSS alert-dismissible" role="alert">
|
||||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||||
@Model
|
@if (!string.IsNullOrEmpty(parsedModel.Message))
|
||||||
|
{
|
||||||
|
@parsedModel.Message
|
||||||
|
}
|
||||||
|
@if (!string.IsNullOrEmpty(parsedModel.Html))
|
||||||
|
{
|
||||||
|
@Html.Raw(parsedModel.Html)
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user