fix file seller plugin

This commit is contained in:
Kukks
2023-09-07 10:04:18 +02:00
parent a15d6299be
commit 00c8f6003b
4 changed files with 82 additions and 74 deletions

View File

@@ -9,7 +9,7 @@
<PropertyGroup> <PropertyGroup>
<Product>File Seller</Product> <Product>File Seller</Product>
<Description>Allows you to sell files through the point of sale/crowdfund apps.</Description> <Description>Allows you to sell files through the point of sale/crowdfund apps.</Description>
<Version>1.0.1</Version> <Version>1.0.2</Version>
</PropertyGroup> </PropertyGroup>
<!-- Plugin development properties --> <!-- Plugin development properties -->
<PropertyGroup> <PropertyGroup>

View File

@@ -9,7 +9,7 @@ public class FileSellerPlugin : BaseBTCPayServerPlugin
{ {
public override IBTCPayServerPlugin.PluginDependency[] Dependencies { get; } = public override IBTCPayServerPlugin.PluginDependency[] Dependencies { get; } =
{ {
new() { Identifier = nameof(BTCPayServer), Condition = ">=1.11.1" } new() { Identifier = nameof(BTCPayServer), Condition = ">=1.11.4" }
}; };
public override void Execute(IServiceCollection applicationBuilder) public override void Execute(IServiceCollection applicationBuilder)
{ {

View File

@@ -15,16 +15,16 @@ using Newtonsoft.Json.Linq;
namespace BTCPayServer.Plugins.FileSeller namespace BTCPayServer.Plugins.FileSeller
{ {
public class FileSellerService:EventHostedServiceBase public class FileSellerService : EventHostedServiceBase
{ {
private readonly AppService _appService; private readonly AppService _appService;
private readonly FileService _fileService; private readonly FileService _fileService;
private readonly InvoiceRepository _invoiceRepository; private readonly InvoiceRepository _invoiceRepository;
private readonly StoredFileRepository _storedFileRepository; private readonly StoredFileRepository _storedFileRepository;
public FileSellerService(EventAggregator eventAggregator, public FileSellerService(EventAggregator eventAggregator,
ILogger<FileSellerService> logger, ILogger<FileSellerService> logger,
AppService appService, AppService appService,
FileService fileService, FileService fileService,
InvoiceRepository invoiceRepository, InvoiceRepository invoiceRepository,
StoredFileRepository storedFileRepository) : base(eventAggregator, logger) StoredFileRepository storedFileRepository) : base(eventAggregator, logger)
@@ -46,98 +46,106 @@ namespace BTCPayServer.Plugins.FileSeller
protected override async Task ProcessEvent(object evt, CancellationToken cancellationToken) protected override async Task ProcessEvent(object evt, CancellationToken cancellationToken)
{ {
if (evt is not InvoiceEvent invoiceEvent) return; if (evt is not InvoiceEvent invoiceEvent) return;
Dictionary<string, int> cartItems = null; List<PosCartItem> cartItems = null;
if (invoiceEvent.Name is not (InvoiceEvent.Completed or InvoiceEvent.MarkedCompleted or InvoiceEvent.Confirmed )) if (invoiceEvent.Name is not (InvoiceEvent.Completed or InvoiceEvent.MarkedCompleted
or InvoiceEvent.Confirmed))
{ {
return; return;
} }
var appIds = AppService.GetAppInternalTags(invoiceEvent.Invoice); var appIds = AppService.GetAppInternalTags(invoiceEvent.Invoice);
if (!appIds.Any()) if (!appIds.Any())
{ {
return; return;
} }
if(invoiceEvent.Invoice.Metadata.AdditionalData.TryGetValue("fileselleractivated", out var activated))
if (invoiceEvent.Invoice.Metadata.AdditionalData.TryGetValue("fileselleractivated", out var activated))
{ {
return; return;
} }
if ((!string.IsNullOrEmpty(invoiceEvent.Invoice.Metadata.ItemCode) || if ((!string.IsNullOrEmpty(invoiceEvent.Invoice.Metadata.ItemCode) ||
AppService.TryParsePosCartItems(invoiceEvent.Invoice.Metadata.PosData, out cartItems))) AppService.TryParsePosCartItems(invoiceEvent.Invoice.Metadata.PosData, out cartItems)))
{ {
var items = cartItems ?? new Dictionary<string, int>(); var items = cartItems ?? new List<PosCartItem>();
if (!string.IsNullOrEmpty(invoiceEvent.Invoice.Metadata.ItemCode)) if (!string.IsNullOrEmpty(invoiceEvent.Invoice.Metadata.ItemCode) &&
!items.Exists(cartItem => cartItem.Id == invoiceEvent.Invoice.Metadata.ItemCode))
{ {
items.TryAdd(invoiceEvent.Invoice.Metadata.ItemCode, 1); items.Add(new PosCartItem()
{
Id = invoiceEvent.Invoice.Metadata.ItemCode,
Count = 1,
Price = invoiceEvent.Invoice.Price
});
} }
var apps = (await _appService.GetApps(appIds)).Select(data => var apps = (await _appService.GetApps(appIds)).Select(data =>
{
switch (data.AppType)
{ {
switch (data.AppType) case PointOfSaleAppType.AppType:
{ var possettings = data.GetSettings<PointOfSaleSettings>();
case PointOfSaleAppType.AppType: return (Data: data, Settings: (object) possettings,
var possettings = data.GetSettings<PointOfSaleSettings>(); Items: AppService.Parse(possettings.Template));
return (Data: data, Settings: (object) possettings, case CrowdfundAppType.AppType:
Items: AppService.Parse(possettings.Template)); var cfsettings = data.GetSettings<CrowdfundSettings>();
case CrowdfundAppType.AppType: return (Data: data, Settings: cfsettings,
var cfsettings = data.GetSettings<CrowdfundSettings>(); Items: AppService.Parse(cfsettings.PerksTemplate));
return (Data: data, Settings: cfsettings, default:
Items: AppService.Parse(cfsettings.PerksTemplate)); return (null, null, null);
default: }
return (null, null, null); }).Where(tuple => tuple.Data != null && tuple.Items.Any(item =>
} item.AdditionalData?.ContainsKey("file") is true &&
}).Where(tuple => tuple.Data != null && tuple.Items.Any(item => items.Exists(cartItem => cartItem.Id == item.Id)));
item.AdditionalData?.ContainsKey("file") is true &&
items.ContainsKey(item.Id)));
var fileIds = new HashSet<string>(); var fileIds = new HashSet<string>();
foreach (var valueTuple in apps) foreach (var valueTuple in apps)
{
foreach (var item1 in valueTuple.Items.Where(item =>
item.AdditionalData?.ContainsKey("file") is true &&
items.Exists(cartItem => cartItem.Id == item.Id)))
{ {
foreach (var item1 in valueTuple.Items.Where(item => var fileId = item1.AdditionalData["file"].Value<string>();
item.AdditionalData?.ContainsKey("file") is true && fileIds.Add(fileId);
items.ContainsKey(item.Id))) }
{ }
var fileId = item1.AdditionalData["file"].Value<string>();
fileIds.Add(fileId); var loadedFiles = await _storedFileRepository.GetFiles(new StoredFileRepository.FilesQuery()
{
} Id = fileIds.ToArray()
});
var productLinkTasks = loadedFiles.ToDictionary(file => file,
file => _fileService.GetTemporaryFileUrl(UrlToUse, file.Id, DateTimeOffset.MaxValue, true));
var res = await Task.WhenAll(productLinkTasks.Values);
if (res.Any(s => !string.IsNullOrEmpty(s)))
{
var productTitleToFile = productLinkTasks.Select(pair => (pair.Key.FileName, pair.Value.Result))
.Where(s => s.Result is not null)
.ToDictionary(tuple => tuple.FileName, tuple => tuple.Result);
var receiptData = new JObject();
receiptData.Add("Downloadable Content", JObject.FromObject(productTitleToFile));
if (invoiceEvent.Invoice.Metadata.AdditionalData?.TryGetValue("receiptData",
out var existingReceiptData) is true &&
existingReceiptData is JObject existingReceiptDataObj)
{
receiptData.Merge(existingReceiptDataObj);
} }
var loadedFiles = await _storedFileRepository.GetFiles(new StoredFileRepository.FilesQuery() invoiceEvent.Invoice.Metadata.SetAdditionalData("receiptData", receiptData);
{ }
Id = fileIds.ToArray()
});
var productLinkTasks = loadedFiles.ToDictionary(file =>file,file => _fileService.GetTemporaryFileUrl(UrlToUse, file.Id, DateTimeOffset.MaxValue, true));
var res = await Task.WhenAll(productLinkTasks.Values);
if (res.Any(s => !string.IsNullOrEmpty(s)))
{
var productTitleToFile = productLinkTasks.Select(pair => (pair.Key.FileName, pair.Value.Result))
.Where(s => s.Result is not null)
.ToDictionary(tuple => tuple.FileName, tuple => tuple.Result);
var receiptData = new JObject();
receiptData.Add("Downloadable Content", JObject.FromObject(productTitleToFile) );
if (invoiceEvent.Invoice.Metadata.AdditionalData?.TryGetValue("receiptData",
out var existingReceiptData) is true && existingReceiptData is JObject existingReceiptDataObj )
{
receiptData.Merge(existingReceiptDataObj);
}
invoiceEvent.Invoice.Metadata.SetAdditionalData("receiptData", receiptData);
}
invoiceEvent.Invoice.Metadata.SetAdditionalData("fileselleractivated", "true");
await _invoiceRepository.UpdateInvoiceMetadata(invoiceEvent.InvoiceId, invoiceEvent.Invoice.StoreId,
invoiceEvent.Invoice.Metadata.ToJObject());
invoiceEvent.Invoice.Metadata.SetAdditionalData("fileselleractivated", "true");
await _invoiceRepository.UpdateInvoiceMetadata(invoiceEvent.InvoiceId, invoiceEvent.Invoice.StoreId,
invoiceEvent.Invoice.Metadata.ToJObject());
} }
await base.ProcessEvent(evt, cancellationToken); await base.ProcessEvent(evt, cancellationToken);
} }
} }