mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2026-02-01 04:14:28 +01:00
Add invoice notifications (#1674)
* Add invoice notifications * fixeth le order * comment-to-code auto commit * reduce notifications
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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 =>
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user