UNIVPLMDataIntegration/Admin.NET/Plugins/Admin.NET.Plugin.PluginCore/Controllers/AppCenterController.cs

189 lines
6.2 KiB
C#
Raw Normal View History

// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
using PluginCore.AspNetCore.ResponseModel;
using PluginCore.Models;
using System.Net;
namespace PluginCore.AspNetCore.Controllers;
/// <summary>
/// 应用中心
/// <para>插件</para>
/// </summary>
[Route("api/plugincore/admin/[controller]/[action]")]
// [PluginCoreAdminAuthorize]
[ApiController]
[NonUnify]
public class AppCenterController : ControllerBase
{
#region Fields
private static Dictionary<string, Task> _pluginDownloadTasks;
#endregion Fields
#region Ctor
static AppCenterController()
{
_pluginDownloadTasks = new Dictionary<string, Task>();
}
public AppCenterController()
{
}
#endregion Ctor
#region Actions
#region
/// <summary>
/// 插件
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
[HttpGet, HttpPost]
public async Task<ActionResult<BaseResponseModel>> Plugins(string query = "")
{
BaseResponseModel responseDTO = new BaseResponseModel();
IList<PluginRegistryResponseModel> pluginRegistryModels = new List<PluginRegistryResponseModel>();
try
{
// 1. TODO: 从json文件中读取插件订阅源 registry url
string registryUrl = "";
// 2. TODO: 向订阅源发送 http get 获取插件列表信息 eg: http://rem-core-plugins-registry.moeci.com/?query=xxx
IList<string> remotePluginIds = new List<string>();
// 3. 根据本地已有 PluginId 插件情况 状态赋值
PluginConfigModel pluginConfigModel = PluginConfigModelFactory.Create();
// IList<string> localPluginIds = pluginConfigModel.EnabledPlugins.Concat(pluginConfigModel.DisabledPlugins).Concat(pluginConfigModel.UninstalledPlugins).ToList();
IList<string> localPluginIds = PluginPathProvider.AllPluginFolderName();
responseDTO.Code = 1;
responseDTO.Message = "获取远程插件数据成功";
responseDTO.Data = pluginRegistryModels;
}
catch (Exception ex)
{
responseDTO.Code = -1;
responseDTO.Message = "获取远程插件数据失败: " + ex.Message;
responseDTO.Data = pluginRegistryModels;
}
return await Task.FromResult(responseDTO);
}
#endregion
#region
[HttpGet, HttpPost]
public async Task<ActionResult<BaseResponseModel>> DownloadPlugin(string pluginDownloadUrl = "")
{
BaseResponseModel responseDTO = new BaseResponseModel();
#region
if (string.IsNullOrEmpty(pluginDownloadUrl))
{
responseDTO.Code = -1;
responseDTO.Message = "插件下载地址不正确";
return responseDTO;
}
// TODO: 效验是否本地已经存在相同pluginId的插件
#endregion
try
{
// 1.执行下载操作, TODO:存在问题,阻塞对性能不好,但不阻塞又不好通知用户插件下载进度,以及可能存在在插件下载过程中,用户再次点击下载
WebClient webClient = new WebClient();
// TODO: 插件下载文件路径
string pluginDownloadFilePath = "";
//webClient.DownloadFileAsync(new Uri(pluginDownloadFilePath), "");
Task task = webClient.DownloadFileTaskAsync(pluginDownloadUrl, pluginDownloadFilePath);
_pluginDownloadTasks.Add(pluginDownloadUrl, task);
webClient.DownloadFileCompleted += Plugin_DownloadFileCompleted;
webClient.DownloadProgressChanged += Plugin_DownloadProgressChanged;
webClient.Disposed += WebClient_Disposed;
responseDTO.Code = 1;
responseDTO.Message = "开始下载插件";
}
catch (Exception ex)
{
responseDTO.Code = -1;
responseDTO.Message = "下载插件失败: " + ex.Message;
}
return await Task.FromResult(responseDTO);
}
#endregion
#region
[HttpGet, HttpPost]
public async Task<ActionResult<BaseResponseModel>> DownloadPluginProgress()
{
BaseResponseModel responseDTO = new BaseResponseModel();
try
{
responseDTO.Data = new { };
responseDTO.Code = 1;
responseDTO.Message = "获取插件下载进度成功";
}
catch (Exception ex)
{
responseDTO.Code = -1;
responseDTO.Message = "获取插件下载进度失败: " + ex.Message;
}
return await Task.FromResult(responseDTO);
}
#endregion
#endregion Actions
#region Helpers
/// <summary>
/// 插件下载完成
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Plugin_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
Console.WriteLine("插件下载完成");
// 1.从 _pluginDownloadTasks 中移除
//_pluginDownloadTasks.Remove();
// 2. 解压插件
}
private void Plugin_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
Console.WriteLine($"插件下载进度改变: {e.ProgressPercentage}% {e.BytesReceived}/{e.TotalBytesToReceive}");
}
private void WebClient_Disposed(object sender, EventArgs e)
{
if (sender is WebClient webClient)
{
Console.WriteLine(webClient.BaseAddress);
}
Console.WriteLine(nameof(WebClient_Disposed) + ": " + sender.ToString());
}
#endregion Helpers
}