mirror of
https://gitee.com/dotnetchina/OpenAuth.Net.git
synced 2026-03-30 21:23:25 +08:00
增加同步API资源到资源列表接口
This commit is contained in:
@@ -27,6 +27,7 @@
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Log4Net.AspNetCore" Version="3.1.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="5.0.0" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
|
||||
<PackageReference Include="Microsoft.OpenApi.Readers" Version="1.6.23" />
|
||||
<PackageReference Include="Moq" Version="4.13.1" />
|
||||
<PackageReference Include="NUnit" Version="3.13.1" />
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="3.17.0" />
|
||||
|
||||
@@ -17,6 +17,16 @@ namespace OpenAuth.App
|
||||
public class ResourceApp:SqlSugarBaseApp<SysResource>
|
||||
{
|
||||
private RevelanceManagerApp _revelanceApp;
|
||||
private ApiService _apiService;
|
||||
|
||||
private IAuth _auth;
|
||||
|
||||
public ResourceApp(ISqlSugarClient client, IAuth auth, RevelanceManagerApp revelanceApp, ApiService apiService) : base(client, auth)
|
||||
{
|
||||
_revelanceApp = revelanceApp;
|
||||
_apiService = apiService;
|
||||
_auth = auth;
|
||||
}
|
||||
|
||||
public void Add(AddOrUpdateResReq resource)
|
||||
{
|
||||
@@ -95,9 +105,38 @@ namespace OpenAuth.App
|
||||
return result;
|
||||
}
|
||||
|
||||
public ResourceApp(ISqlSugarClient client, IAuth auth, RevelanceManagerApp revelanceApp) : base(client, auth)
|
||||
/// <summary>
|
||||
/// 同步站点API到资源列表
|
||||
/// <para>读取站点API信息,如果资源列表中不存在,则添加</para>
|
||||
/// </summary>
|
||||
public async Task Sync()
|
||||
{
|
||||
_revelanceApp = revelanceApp;
|
||||
var apis = await _apiService.GetSwaggerEndpoints();
|
||||
var user = _auth.GetCurrentUser().User;
|
||||
foreach (var api in apis)
|
||||
{
|
||||
//检查资源是否存在
|
||||
var resource = Repository.GetFirst(u => u.Name == api.Path && u.TypeId == Define.API);
|
||||
if (resource != null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
resource = new SysResource
|
||||
{
|
||||
Name = api.Path,
|
||||
Disable = true,
|
||||
SortNo = 0,
|
||||
TypeId = Define.API,
|
||||
TypeName = "API接口",
|
||||
Description = api.Summary??"",
|
||||
CreateTime = DateTime.Now,
|
||||
CreateUserId = user.Id,
|
||||
CreateUserName = user.Name
|
||||
};
|
||||
CaculateCascade(resource);
|
||||
Repository.Insert(resource);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
99
OpenAuth.App/System/ApiService.cs
Normal file
99
OpenAuth.App/System/ApiService.cs
Normal file
@@ -0,0 +1,99 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.OpenApi.Readers;
|
||||
|
||||
public class ApiService
|
||||
{
|
||||
private readonly IHttpClientFactory _httpClientFactory;
|
||||
private readonly IConfiguration _configuration;
|
||||
|
||||
public ApiService(IHttpClientFactory httpClientFactory, IConfiguration configuration)
|
||||
{
|
||||
_httpClientFactory = httpClientFactory;
|
||||
_configuration = configuration;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有API接口信息
|
||||
/// <para>这个方法单元测试必须启动WebApi站点</para>
|
||||
/// </summary>
|
||||
public async Task<List<SwaggerEndpointInfo>> GetSwaggerEndpoints()
|
||||
{
|
||||
|
||||
var reader = new OpenApiStringReader();
|
||||
var client = _httpClientFactory.CreateClient();
|
||||
|
||||
var baseUrl = _configuration["AppSetting:HttpHost"]?.Replace("*", "localhost");
|
||||
|
||||
var apis = new List<SwaggerEndpointInfo>();
|
||||
var controllers = GetControllers();
|
||||
|
||||
foreach (var controller in controllers)
|
||||
{
|
||||
var groupname = GetSwaggerGroupName(controller);
|
||||
var swaggerJsonUrl = $"{baseUrl}/swagger/{groupname}/swagger.json";
|
||||
|
||||
var response = await client.GetAsync(swaggerJsonUrl).ConfigureAwait(false);
|
||||
|
||||
var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
|
||||
var document = reader.Read(content, out var diagnostic);
|
||||
//获取所有api
|
||||
var controllerApis = document.Paths
|
||||
.SelectMany(path => path.Value.Operations
|
||||
.Select(op => new SwaggerEndpointInfo(
|
||||
path.Key,
|
||||
op.Key.ToString(),
|
||||
op.Value.Summary,
|
||||
op.Value.Description,
|
||||
op.Value.Tags.FirstOrDefault()?.Name)));
|
||||
|
||||
apis.AddRange(controllerApis);
|
||||
}
|
||||
|
||||
return apis;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取控制器对应的swagger分组值
|
||||
/// </summary>
|
||||
private string GetSwaggerGroupName(Type controller)
|
||||
{
|
||||
var groupname = controller.Name.Replace("Controller", "");
|
||||
var apisetting = controller.GetCustomAttribute(typeof(ApiExplorerSettingsAttribute));
|
||||
if (apisetting != null)
|
||||
{
|
||||
groupname = ((ApiExplorerSettingsAttribute)apisetting).GroupName;
|
||||
}
|
||||
|
||||
return groupname;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有的控制器
|
||||
/// </summary>
|
||||
private List<Type> GetControllers()
|
||||
{
|
||||
var webApiAssembly = AppDomain.CurrentDomain.GetAssemblies()
|
||||
.FirstOrDefault(a => a.GetName().Name.Contains("OpenAuth.WebApi"));
|
||||
|
||||
var controlleractionlist = webApiAssembly.GetTypes()
|
||||
.Where(type => typeof(Microsoft.AspNetCore.Mvc.ControllerBase).IsAssignableFrom(type))
|
||||
.ToList();
|
||||
|
||||
return controlleractionlist;
|
||||
}
|
||||
}
|
||||
|
||||
public record SwaggerEndpointInfo(
|
||||
string Path,
|
||||
string HttpMethod,
|
||||
string Summary,
|
||||
string Description,
|
||||
string Tag);
|
||||
Reference in New Issue
Block a user