Add invoice notifications (#1674)

* Add invoice notifications

* fixeth le order

* comment-to-code auto commit

* reduce notifications
This commit is contained in:
Andrew Camilleri
2020-06-22 09:32:51 +02:00
committed by GitHub
parent 0dd1b668cd
commit 12e2b93ac9
4 changed files with 80 additions and 3 deletions

View File

@@ -12,6 +12,9 @@ using System.Collections.Concurrent;
using BTCPayServer.Events;
using BTCPayServer.Services.Invoices;
using System.Threading.Channels;
using BTCPayServer.Services.Notifications;
using BTCPayServer.Services.Notifications.Blobs;
using NBitpayClient;
namespace BTCPayServer.HostedServices
{
@@ -38,15 +41,18 @@ namespace BTCPayServer.HostedServices
InvoiceRepository _InvoiceRepository;
EventAggregator _EventAggregator;
ExplorerClientProvider _ExplorerClientProvider;
private readonly NotificationSender _notificationSender;
public InvoiceWatcher(
InvoiceRepository invoiceRepository,
EventAggregator eventAggregator,
ExplorerClientProvider explorerClientProvider)
ExplorerClientProvider explorerClientProvider,
NotificationSender notificationSender)
{
_InvoiceRepository = invoiceRepository ?? throw new ArgumentNullException(nameof(invoiceRepository));
_EventAggregator = eventAggregator ?? throw new ArgumentNullException(nameof(eventAggregator));
_ExplorerClientProvider = explorerClientProvider;
_notificationSender = notificationSender;
}
CompositeDisposable leases = new CompositeDisposable();
@@ -228,8 +234,13 @@ namespace BTCPayServer.HostedServices
{
Watch(b.InvoiceId);
}));
leases.Add(_EventAggregator.Subscribe<Events.InvoiceEvent>(b =>
leases.Add(_EventAggregator.Subscribe<Events.InvoiceEvent>(async b =>
{
if (InvoiceEventNotification.HandlesEvent(b.Name))
{
await _notificationSender.SendNotification(new StoreScope(b.Invoice.StoreId),
new InvoiceEventNotification(b.Invoice.Id, b.Name));
}
if (b.Name == InvoiceEvent.Created)
{
Watch(b.Invoice.Id);

View File

@@ -222,6 +222,7 @@ namespace BTCPayServer.Hosting
services.AddScoped<IAuthorizationHandler, CookieAuthorizationHandler>();
services.AddScoped<IAuthorizationHandler, BitpayAuthorizationHandler>();
services.AddSingleton<INotificationHandler, NewVersionNotification.Handler>();
services.AddSingleton<INotificationHandler, InvoiceEventNotification.Handler>();
services.TryAddSingleton<ExplorerClientProvider>();
services.TryAddSingleton<Bitpay>(o =>

View File

@@ -0,0 +1,65 @@
using System.Collections.Generic;
using System.Linq;
using BTCPayServer.Configuration;
using BTCPayServer.Controllers;
using BTCPayServer.Events;
using BTCPayServer.Models.NotificationViewModels;
using Microsoft.AspNetCore.Routing;
namespace BTCPayServer.Services.Notifications.Blobs
{
internal class InvoiceEventNotification
{
internal class Handler : NotificationHandler<InvoiceEventNotification>
{
private readonly LinkGenerator _linkGenerator;
private readonly BTCPayServerOptions _options;
public Handler(LinkGenerator linkGenerator, BTCPayServerOptions options)
{
_linkGenerator = linkGenerator;
_options = options;
}
public override string NotificationType => "invoicestate";
internal static Dictionary<string, string> TextMapping = new Dictionary<string, string>()
{
// {InvoiceEvent.PaidInFull, "was fully paid."},
{InvoiceEvent.PaidAfterExpiration, "was paid after expiration."},
{InvoiceEvent.ExpiredPaidPartial, "expired with partial payments."},
{InvoiceEvent.FailedToConfirm, "has payments that failed to confirm on time."},
// {InvoiceEvent.ReceivedPayment, "received a payment."},
{InvoiceEvent.Confirmed, "was confirmed paid."}
};
protected override void FillViewModel(InvoiceEventNotification notification,
NotificationViewModel vm)
{
var baseStr = $"Invoice {notification.InvoiceId.Substring(0, 5)}..";
vm.Body = $"{baseStr} {TextMapping[notification.Event]}";
vm.ActionLink = _linkGenerator.GetPathByAction(nameof(InvoiceController.Invoice),
"Invoice",
new {invoiceId = notification.InvoiceId}, _options.RootPath);
}
}
public InvoiceEventNotification()
{
}
public InvoiceEventNotification(string invoiceId, string invoiceEvent)
{
InvoiceId = invoiceId;
Event = invoiceEvent;
}
public static bool HandlesEvent(string invoiceEvent)
{
return Handler.TextMapping.Keys.Any(s => s == invoiceEvent);
}
public string InvoiceId { get; set; }
public string Event { get; set; }
}
}

View File

@@ -19,7 +19,7 @@
@notif.Body
</div>
<div class="text-left">
<small class="text-muted">@notif.Created.ToBrowserDate()</small>
<small class="text-muted">@notif.Created.ToTimeAgo()</small>
</div>
</a>
}