@@ -644,15 +648,16 @@
| @tx.CreatedAt.ToTimeAgo() |
@tx.SubType.ToHumanReadable() |
-
- @tx.Status.ToHumanReadable()
- |
+ @tx.Status.ToHumanReadable() |
- @(tx.SourceCurrency == "BTC" ? Money.Satoshis(tx.SourceAmount).ToDecimal(MoneyUnit.BTC): tx.SourceAmount)@tx.SourceCurrency -> @tx.DestinationAmount @tx.DestinationCurrency
+
+ @(tx.SourceCurrency == "BTC" ? Money.Satoshis(tx.SourceAmount).ToDecimal(MoneyUnit.BTC) : tx.SourceAmount) @tx.SourceCurrency
+ -> @tx.DestinationAmount @tx.DestinationCurrency
+
|
}
-
+ s
}
diff --git a/Plugins/BTCPayServer.Plugins.DataErasure/BTCPayServer.Plugins.DataErasure.csproj b/Plugins/BTCPayServer.Plugins.DataErasure/BTCPayServer.Plugins.DataErasure.csproj
index 116b6d7..0e8d526 100644
--- a/Plugins/BTCPayServer.Plugins.DataErasure/BTCPayServer.Plugins.DataErasure.csproj
+++ b/Plugins/BTCPayServer.Plugins.DataErasure/BTCPayServer.Plugins.DataErasure.csproj
@@ -9,7 +9,7 @@
Data Erasure
Allows you to erase user data from invoices after a period of time.
- 1.0.2
+ 1.0.3
true
diff --git a/Plugins/BTCPayServer.Plugins.DataErasure/DataErasureController.cs b/Plugins/BTCPayServer.Plugins.DataErasure/DataErasureController.cs
index 56ae86f..7873def 100644
--- a/Plugins/BTCPayServer.Plugins.DataErasure/DataErasureController.cs
+++ b/Plugins/BTCPayServer.Plugins.DataErasure/DataErasureController.cs
@@ -12,6 +12,7 @@ namespace BTCPayServer.Plugins.DataErasure
public class DataErasureController : Controller
{
private readonly DataErasureService _dataErasureService;
+
public DataErasureController(DataErasureService dataErasureService)
{
_dataErasureService = dataErasureService;
@@ -31,10 +32,11 @@ namespace BTCPayServer.Plugins.DataErasure
{
if (_dataErasureService.IsRunning)
{
- TempData["ErrorMessage"] = "Data erasure is currently running and cannot be changed. Please try again later.";
+ TempData["ErrorMessage"] =
+ "Data erasure is currently running and cannot be changed. Please try again later.";
}
-
+
if (vm.Enabled)
{
if (!ModelState.IsValid)
@@ -46,7 +48,11 @@ namespace BTCPayServer.Plugins.DataErasure
switch (command)
{
-
+ case "cleardate":
+ await _dataErasureService.Set(storeId, vm, true);
+
+ TempData["SuccessMessage"] = "Data erasure settings modified and date cleared";
+ return RedirectToAction(nameof(Update), new {storeId});
case "save":
await _dataErasureService.Set(storeId, vm);
TempData["SuccessMessage"] = "Data erasure settings modified";
@@ -57,4 +63,4 @@ namespace BTCPayServer.Plugins.DataErasure
}
}
}
-}
+}
\ No newline at end of file
diff --git a/Plugins/BTCPayServer.Plugins.DataErasure/DataErasurePlugin.cs b/Plugins/BTCPayServer.Plugins.DataErasure/DataErasurePlugin.cs
index 73c9115..f0869b6 100644
--- a/Plugins/BTCPayServer.Plugins.DataErasure/DataErasurePlugin.cs
+++ b/Plugins/BTCPayServer.Plugins.DataErasure/DataErasurePlugin.cs
@@ -9,7 +9,7 @@ namespace BTCPayServer.Plugins.DataErasure
{
public override IBTCPayServerPlugin.PluginDependency[] Dependencies { get; } =
{
- new() { Identifier = nameof(BTCPayServer), Condition = ">=1.12.0" }
+ new() { Identifier = nameof(BTCPayServer), Condition = ">=2.0.0" }
};
public override void Execute(IServiceCollection applicationBuilder)
{
diff --git a/Plugins/BTCPayServer.Plugins.DataErasure/DataErasureService.cs b/Plugins/BTCPayServer.Plugins.DataErasure/DataErasureService.cs
index 4af9e9b..bbe648b 100644
--- a/Plugins/BTCPayServer.Plugins.DataErasure/DataErasureService.cs
+++ b/Plugins/BTCPayServer.Plugins.DataErasure/DataErasureService.cs
@@ -3,6 +3,7 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using BTCPayServer.Abstractions.Contracts;
+using BTCPayServer.Data;
using BTCPayServer.Services.Invoices;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
@@ -14,13 +15,15 @@ namespace BTCPayServer.Plugins.DataErasure
private readonly IStoreRepository _storeRepository;
private readonly ILogger
_logger;
private readonly InvoiceRepository _invoiceRepository;
+ private readonly ApplicationDbContextFactory _dbContextFactory;
public DataErasureService(IStoreRepository storeRepository, ILogger logger,
- InvoiceRepository invoiceRepository)
+ InvoiceRepository invoiceRepository, ApplicationDbContextFactory dbContextFactory)
{
_storeRepository = storeRepository;
_logger = logger;
_invoiceRepository = invoiceRepository;
+ _dbContextFactory = dbContextFactory;
}
public async Task Get(string storeId)
@@ -29,13 +32,16 @@ namespace BTCPayServer.Plugins.DataErasure
nameof(DataErasureSettings));
}
- public async Task Set(string storeId, DataErasureSettings settings)
+ public async Task Set(string storeId, DataErasureSettings settings, bool clearDate = false)
{
+ _cts?.Cancel();
await _runningLock.WaitAsync();
var existing = await Get(storeId);
- settings.LastRunCutoff = existing?.LastRunCutoff;
+ settings.LastRunCutoff = clearDate? null: existing?.LastRunCutoff;
await SetCore(storeId, settings);
_runningLock.Release();
+ _cts = new CancellationTokenSource();
+ _ = Run();
}
private async Task SetCore(string storeId, DataErasureSettings settings)
@@ -46,11 +52,11 @@ namespace BTCPayServer.Plugins.DataErasure
public bool IsRunning { get; private set; }
private readonly SemaphoreSlim _runningLock = new(1, 1);
- private async Task Run(CancellationToken cancellationToken)
+ private async Task Run()
{
- while (!cancellationToken.IsCancellationRequested)
+ while (!_cts.IsCancellationRequested)
{
- await _runningLock.WaitAsync(cancellationToken);
+ await _runningLock.WaitAsync(_cts.Token);
IsRunning = true;
@@ -58,53 +64,69 @@ namespace BTCPayServer.Plugins.DataErasure
await _storeRepository.GetSettingsAsync(nameof(DataErasureSettings));
foreach (var setting in settings.Where(setting => setting.Value.Enabled))
{
- var skip = 0;
var count = 0;
var cutoffDate = DateTimeOffset.UtcNow.Subtract(TimeSpan.FromDays(setting.Value.DaysToKeep));
- while (true)
+ if (setting.Value.EntirelyEraseInvoice)
{
- var invoices = await _invoiceRepository.GetInvoices(new InvoiceQuery()
- {
- StartDate = setting.Value.LastRunCutoff,
- EndDate = cutoffDate,
- StoreId = new[] {setting.Key},
- Skip = skip,
- Take = 100
- });
- foreach (var invoice in invoices)
- {
- //replace all buyer info with "erased"
- if (!string.IsNullOrEmpty(invoice.Metadata.BuyerAddress1))
- invoice.Metadata.BuyerAddress1 = "erased";
- if (!string.IsNullOrEmpty(invoice.Metadata.BuyerAddress2))
- invoice.Metadata.BuyerAddress2 = "erased";
- if (!string.IsNullOrEmpty(invoice.Metadata.BuyerCity))
- invoice.Metadata.BuyerCity = "erased";
- if (!string.IsNullOrEmpty(invoice.Metadata.BuyerCountry))
- invoice.Metadata.BuyerCountry = "erased";
- if (!string.IsNullOrEmpty(invoice.Metadata.BuyerEmail))
- invoice.Metadata.BuyerEmail = "erased";
- if (!string.IsNullOrEmpty(invoice.Metadata.BuyerName))
- invoice.Metadata.BuyerName = "erased";
- if (!string.IsNullOrEmpty(invoice.Metadata.BuyerPhone))
- invoice.Metadata.BuyerPhone = "erased";
- if (!string.IsNullOrEmpty(invoice.Metadata.BuyerState))
- invoice.Metadata.BuyerState = "erased";
- if (!string.IsNullOrEmpty(invoice.Metadata.BuyerZip))
- invoice.Metadata.BuyerZip = "erased";
- await _invoiceRepository.UpdateInvoiceMetadata(invoice.Id, invoice.StoreId,
- invoice.Metadata.ToJObject());
- count++;
- }
-
- if (invoices.Length < 100)
- {
- break;
- }
-
- skip += 100;
+ await using var db = _dbContextFactory.CreateContext();
+ db.Invoices.RemoveRange(db.Invoices.Where(i => i.StoreDataId == setting.Key && i.Created < cutoffDate && (setting.Value.LastRunCutoff == null || i.Created > setting.Value.LastRunCutoff)));
+ count = await db.SaveChangesAsync(_cts.Token);
}
- if(count > 0)
+ else
+ {
+
+
+
+ var skip = 0;
+ while (true)
+ {
+ var invoices = await _invoiceRepository.GetInvoices(new InvoiceQuery()
+ {
+ StartDate = setting.Value.LastRunCutoff,
+ EndDate = cutoffDate,
+ StoreId = new[] {setting.Key},
+ Skip = skip,
+ Take = 100
+ }, _cts.Token);
+
+
+
+ foreach (var invoice in invoices)
+ {
+ //replace all buyer info with "erased"
+ if (!string.IsNullOrEmpty(invoice.Metadata.BuyerAddress1))
+ invoice.Metadata.BuyerAddress1 = "erased";
+ if (!string.IsNullOrEmpty(invoice.Metadata.BuyerAddress2))
+ invoice.Metadata.BuyerAddress2 = "erased";
+ if (!string.IsNullOrEmpty(invoice.Metadata.BuyerCity))
+ invoice.Metadata.BuyerCity = "erased";
+ if (!string.IsNullOrEmpty(invoice.Metadata.BuyerCountry))
+ invoice.Metadata.BuyerCountry = "erased";
+ if (!string.IsNullOrEmpty(invoice.Metadata.BuyerEmail))
+ invoice.Metadata.BuyerEmail = "erased";
+ if (!string.IsNullOrEmpty(invoice.Metadata.BuyerName))
+ invoice.Metadata.BuyerName = "erased";
+ if (!string.IsNullOrEmpty(invoice.Metadata.BuyerPhone))
+ invoice.Metadata.BuyerPhone = "erased";
+ if (!string.IsNullOrEmpty(invoice.Metadata.BuyerState))
+ invoice.Metadata.BuyerState = "erased";
+ if (!string.IsNullOrEmpty(invoice.Metadata.BuyerZip))
+ invoice.Metadata.BuyerZip = "erased";
+ await _invoiceRepository.UpdateInvoiceMetadata(invoice.Id, invoice.StoreId,
+ invoice.Metadata.ToJObject());
+ count++;
+ }
+
+ if (invoices.Length < 100)
+ {
+ break;
+ }
+
+ skip += 100;
+ }
+ }
+
+ if (count > 0)
_logger.LogInformation($"Erased {count} invoice data for store {setting.Key}");
setting.Value.LastRunCutoff = cutoffDate;
await SetCore(setting.Key, setting.Value);
@@ -114,18 +136,30 @@ namespace BTCPayServer.Plugins.DataErasure
_runningLock.Release();
- await Task.Delay(TimeSpan.FromDays(1), cancellationToken);
+ await Task.Delay(TimeSpan.FromHours(1), _cts.Token);
+ }
+
+ try
+ {
+ _runningLock.Release();
+ }
+ catch (Exception e)
+ {
}
}
+ private CancellationTokenSource _cts;
+
public Task StartAsync(CancellationToken cancellationToken)
{
- _ = Run(cancellationToken);
+ _cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
+ _ = Run();
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
+ _cts?.Cancel();
return Task.CompletedTask;
}
}
diff --git a/Plugins/BTCPayServer.Plugins.DataErasure/DataErasureSettings.cs b/Plugins/BTCPayServer.Plugins.DataErasure/DataErasureSettings.cs
index 94a2dbb..f1256d5 100644
--- a/Plugins/BTCPayServer.Plugins.DataErasure/DataErasureSettings.cs
+++ b/Plugins/BTCPayServer.Plugins.DataErasure/DataErasureSettings.cs
@@ -7,5 +7,7 @@ namespace BTCPayServer.Plugins.DataErasure
public bool Enabled { get; set; }
public int DaysToKeep { get; set; }
public DateTimeOffset? LastRunCutoff { get; set; }
+
+ public bool EntirelyEraseInvoice { get; set; }
}
}
diff --git a/Plugins/BTCPayServer.Plugins.DataErasure/Views/DataErasure/Update.cshtml b/Plugins/BTCPayServer.Plugins.DataErasure/Views/DataErasure/Update.cshtml
index ba39cc4..d4a444d 100644
--- a/Plugins/BTCPayServer.Plugins.DataErasure/Views/DataErasure/Update.cshtml
+++ b/Plugins/BTCPayServer.Plugins.DataErasure/Views/DataErasure/Update.cshtml
@@ -36,9 +36,24 @@