1+ using Microsoft . Extensions . Logging ;
2+ using Swashbuckle . AspNetCore . Swagger ;
3+ using ZhonTai . Admin . Core . Configs ;
4+ using ZhonTai . Admin . Core . GrpcServices ;
5+ using ZhonTai . Admin . Core . GrpcServices . Dtos ;
6+
7+ namespace ZhonTai . Admin . Core . Handlers ;
8+
9+ /// <summary>
10+ /// Api文档处理器
11+ /// </summary>
12+ public class ApiDocumentHandler : IApiDocumentHandler
13+ {
14+ private readonly AppConfig _appConfig ;
15+ private readonly ISwaggerProvider _swaggerProvider ;
16+ private readonly IApiGrpcService _apiGrpcService ;
17+ private readonly ILogger < ApiDocumentHandler > _logger ;
18+
19+ public ApiDocumentHandler ( AppConfig appConfig , ISwaggerProvider swaggerProvider , IApiGrpcService apiGrpcService ,
20+ ILogger < ApiDocumentHandler > logger )
21+ {
22+ _appConfig = appConfig ;
23+ _swaggerProvider = swaggerProvider ;
24+ _apiGrpcService = apiGrpcService ;
25+ _logger = logger ;
26+ }
27+
28+ /// <summary>
29+ /// 同步Api文档
30+ /// </summary>
31+ /// <returns></returns>
32+ public async Task SyncAsync ( )
33+ {
34+ var projects = _appConfig . Swagger . Projects ;
35+ if ( projects == null || projects . Count == 0 )
36+ {
37+ return ;
38+ }
39+
40+ var tasks = projects . Select ( SyncProjectAsync ) ;
41+
42+ try
43+ {
44+ await Task . WhenAll ( tasks ) ;
45+ }
46+ catch ( Exception ex )
47+ {
48+ // 记录聚合异常
49+ if ( ex is AggregateException aggEx )
50+ {
51+ foreach ( var innerEx in aggEx . InnerExceptions )
52+ {
53+ _logger . LogError ( innerEx , "API文档同步失败" ) ;
54+ }
55+ }
56+ else
57+ {
58+ _logger . LogError ( ex , "API文档同步失败" ) ;
59+ }
60+ }
61+ }
62+
63+ private async Task SyncProjectAsync ( ProjectConfig project )
64+ {
65+ try
66+ {
67+ if ( project . AutoSyncToDb == false )
68+ {
69+ return ;
70+ }
71+
72+ var apis = new List < ApiSyncGrpcInput . Models . ApiSyncModel > ( ) ;
73+ var apiDocument = _swaggerProvider . GetSwagger ( project . Code . ToLower ( ) ) ;
74+
75+ apis . Add ( new ApiSyncGrpcInput . Models . ApiSyncModel ( )
76+ {
77+ Label = project . Name ,
78+ Path = project . Code . ToLower ( )
79+ } ) ;
80+ foreach ( var tag in apiDocument . Tags )
81+ {
82+ var apiSyncDto = new ApiSyncGrpcInput . Models . ApiSyncModel ( )
83+ {
84+ Label = tag . Description ,
85+ Path = project . Code . ToLower ( ) + "/" + tag . Name ,
86+ ParentPath = project . Code . ToLower ( ) ,
87+ } ;
88+ apis . Add ( apiSyncDto ) ;
89+ }
90+
91+ foreach ( var path in apiDocument . Paths )
92+ {
93+ foreach ( var openApiOperation in path . Value . Operations )
94+ {
95+ var apiSyncDto = new ApiSyncGrpcInput . Models . ApiSyncModel ( )
96+ {
97+ Path = path . Key ,
98+ ParentPath = project . Code . ToLower ( ) + "/" + openApiOperation . Value . Tags . First ( ) . Name ,
99+ HttpMethods = openApiOperation . Key . Method . ToLower ( ) ,
100+ Label = openApiOperation . Value . Summary
101+ } ;
102+ apis . Add ( apiSyncDto ) ;
103+ }
104+ }
105+
106+ if ( apis . Count == 0 )
107+ {
108+ return ;
109+ }
110+
111+ var apiSyncInput = new ApiSyncGrpcInput { Apis = apis } ;
112+ await _apiGrpcService . SyncAsync ( apiSyncInput ) ;
113+
114+ Console . WriteLine ( $ "{ project . Name } 同步{ apis . Count } 个接口成功") ;
115+ }
116+ catch ( Exception )
117+ {
118+ Console . WriteLine ( $ "{ project . Name } 同步失败") ;
119+ throw ;
120+ }
121+ }
122+ }
0 commit comments