Plugins flexibility PR (#2129)

* Plugins flexibility PR

* Makes the BTCPayServerOptions.LoadArgs async to support Plugin hooks and actions
* relax the private set modifiers in the BTCPayNetwork
* Separate IPluginHookService from PluginService to reduce dependencies on DI
* fix some small bugs around image path
* Fix bug with new dbreeze migration where data dir was incorrect

* Update BTCPayServer/Plugins/PluginHookService.cs

Co-authored-by: rockstardev <5191402+rockstardev@users.noreply.github.com>

* Update BTCPayServer/Plugins/PluginHookService.cs

Co-authored-by: rockstardev <5191402+rockstardev@users.noreply.github.com>

Co-authored-by: rockstardev <5191402+rockstardev@users.noreply.github.com>
This commit is contained in:
Andrew Camilleri
2021-01-07 14:49:53 +01:00
committed by GitHub
parent e2e37a0db4
commit b8da6847b9
13 changed files with 92 additions and 61 deletions

View File

@@ -16,23 +16,19 @@ using Newtonsoft.Json;
namespace BTCPayServer.Plugins
{
public class PluginService: IPluginHookService
public class PluginService
{
private readonly IOptions<DataDirectories> _datadirs;
private readonly BTCPayServerOptions _options;
private readonly IOptions<DataDirectories> _dataDirectories;
private readonly BTCPayServerOptions _btcPayServerOptions;
private readonly HttpClient _githubClient;
private readonly IEnumerable<IPluginHookAction> _actions;
private readonly IEnumerable<IPluginHookFilter> _filters;
public PluginService(IEnumerable<IBTCPayServerPlugin> btcPayServerPlugins,
IHttpClientFactory httpClientFactory, IOptions<DataDirectories> datadirs, BTCPayServerOptions options, IEnumerable<IPluginHookAction> actions, IEnumerable<IPluginHookFilter> filters)
IHttpClientFactory httpClientFactory, BTCPayServerOptions btcPayServerOptions, IOptions<DataDirectories> dataDirectories)
{
LoadedPlugins = btcPayServerPlugins;
_githubClient = httpClientFactory.CreateClient();
_githubClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("btcpayserver", "1"));
_datadirs = datadirs;
_options = options;
_actions = actions;
_filters = filters;
_btcPayServerOptions = btcPayServerOptions;
_dataDirectories = dataDirectories;
}
public IEnumerable<IBTCPayServerPlugin> LoadedPlugins { get; }
@@ -40,7 +36,7 @@ namespace BTCPayServer.Plugins
public async Task<IEnumerable<AvailablePlugin>> GetRemotePlugins()
{
var resp = await _githubClient
.GetStringAsync(new Uri($"https://api.github.com/repos/{_options.PluginRemote}/contents"));
.GetStringAsync(new Uri($"https://api.github.com/repos/{_btcPayServerOptions.PluginRemote}/contents"));
var files = JsonConvert.DeserializeObject<GithubFile[]>(resp);
return await Task.WhenAll(files.Where(file => file.Name.EndsWith($"{PluginManager.BTCPayPluginSuffix}.json", StringComparison.InvariantCulture)).Select(async file =>
{
@@ -51,9 +47,9 @@ namespace BTCPayServer.Plugins
public async Task DownloadRemotePlugin(string plugin)
{
var dest = _datadirs.Value.PluginDir;
var dest = _dataDirectories.Value.PluginDir;
var resp = await _githubClient
.GetStringAsync(new Uri($"https://api.github.com/repos/{_options.PluginRemote}/contents"));
.GetStringAsync(new Uri($"https://api.github.com/repos/{_btcPayServerOptions.PluginRemote}/contents"));
var files = JsonConvert.DeserializeObject<GithubFile[]>(resp);
var ext = files.SingleOrDefault(file => file.Name == $"{plugin}{PluginManager.BTCPayPluginSuffix}");
if (ext is null)
@@ -68,19 +64,19 @@ namespace BTCPayServer.Plugins
public void InstallPlugin(string plugin)
{
var dest = _datadirs.Value.PluginDir;
var dest = _dataDirectories.Value.PluginDir;
UninstallPlugin(plugin);
PluginManager.QueueCommands(dest, ("install", plugin));
}
public void UpdatePlugin(string plugin)
{
var dest = _datadirs.Value.PluginDir;
var dest = _dataDirectories.Value.PluginDir;
PluginManager.QueueCommands(dest, ("update", plugin));
}
public async Task UploadPlugin(IFormFile plugin)
{
var dest = _datadirs.Value.PluginDir;
var dest = _dataDirectories.Value.PluginDir;
var filedest = Path.Combine(dest, plugin.FileName);
Directory.CreateDirectory(Path.GetDirectoryName(filedest));
if (Path.GetExtension(filedest) == PluginManager.BTCPayPluginSuffix)
@@ -92,7 +88,7 @@ namespace BTCPayServer.Plugins
public void UninstallPlugin(string plugin)
{
var dest = _datadirs.Value.PluginDir;
var dest = _dataDirectories.Value.PluginDir;
PluginManager.QueueCommands(dest, ("delete", plugin));
}
@@ -127,34 +123,12 @@ namespace BTCPayServer.Plugins
public (string command, string plugin)[] GetPendingCommands()
{
return PluginManager.GetPendingCommands(_datadirs.Value.PluginDir);
return PluginManager.GetPendingCommands(_dataDirectories.Value.PluginDir);
}
public void CancelCommands(string plugin)
{
PluginManager.CancelCommands(_datadirs.Value.PluginDir, plugin);
}
public async Task ApplyAction(string hook, object args)
{
var filters = _actions
.Where(filter => filter.Hook.Equals(hook, StringComparison.InvariantCultureIgnoreCase)).ToList();
foreach (IPluginHookAction pluginHookFilter in filters)
{
await pluginHookFilter.Execute(args);
}
}
public async Task<object> ApplyFilter(string hook, object args)
{
var filters = _filters
.Where(filter => filter.Hook.Equals(hook, StringComparison.InvariantCultureIgnoreCase)).ToList();
foreach (IPluginHookFilter pluginHookFilter in filters)
{
args = await pluginHookFilter.Execute(args);
}
return args;
PluginManager.CancelCommands(_dataDirectories.Value.PluginDir, plugin);
}
}
}