| | | 1 | | using Microsoft.AspNetCore.Mvc; |
| | | 2 | | |
| | | 3 | | namespace OzonOrdersWeb.Extensions; |
| | | 4 | | |
| | | 5 | | public static class SwaggerExtensions |
| | | 6 | | { |
| | | 7 | | public static IServiceCollection AddStudio2Swagger(this IServiceCollection services) |
| | | 8 | | { |
| | 4 | 9 | | services.AddEndpointsApiExplorer(); |
| | 4 | 10 | | services.AddSwaggerGen(options => |
| | 4 | 11 | | { |
| | 4 | 12 | | options.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo |
| | 4 | 13 | | { |
| | 4 | 14 | | Title = "Studio2Prod API", |
| | 4 | 15 | | Version = "v1", |
| | 4 | 16 | | Description = "Внутренние machine-to-machine endpoint'ы Studio2Prod (импорт из внешних приложений и т.п. |
| | 4 | 17 | | }); |
| | 4 | 18 | | |
| | 4 | 19 | | // Документируем только настоящие [ApiController]-эндпоинты (api/...), а не сотни |
| | 4 | 20 | | // классических MVC-контроллеров приложения — среди них есть неоднозначные по HTTP-методу |
| | 4 | 21 | | // action'ы (несколько методов на одном маршруте), на которых генератор Swagger падает. |
| | 4 | 22 | | options.DocInclusionPredicate((docName, apiDesc) => |
| | 4 | 23 | | { |
| | 5504 | 24 | | if (apiDesc.ActionDescriptor is not Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor cad |
| | 5504 | 25 | | !cad.ControllerTypeInfo.IsDefined(typeof(ApiControllerAttribute), inherit: true)) |
| | 5264 | 26 | | return false; |
| | 4 | 27 | | |
| | 4 | 28 | | // API партнёров живёт в собственном документе и не смешивается с machine-to-machine контрактом v1. |
| | 240 | 29 | | var isPartnerApi = apiDesc.GroupName == PartnerOfficeExtensions.SwaggerDocName; |
| | 240 | 30 | | return docName == PartnerOfficeExtensions.SwaggerDocName ? isPartnerApi : !isPartnerApi; |
| | 4 | 31 | | }); |
| | 4 | 32 | | |
| | 4 | 33 | | options.SwaggerDoc(PartnerOfficeExtensions.SwaggerDocName, new Microsoft.OpenApi.Models.OpenApiInfo |
| | 4 | 34 | | { |
| | 4 | 35 | | Title = "PartnerOffice API", |
| | 4 | 36 | | Version = "v1", |
| | 4 | 37 | | Description = "API кабинета партнёра. Сначала вызовите POST /partner-api/auth/login: сессия хранится в c |
| | 4 | 38 | | "поэтому остальные методы в Swagger UI работают из того же окна. Видны только заказы, подх |
| | 4 | 39 | | }); |
| | 4 | 40 | | |
| | 4 | 41 | | var xmlDoc = Path.Combine(AppContext.BaseDirectory, $"{typeof(SwaggerExtensions).Assembly.GetName().Name}.xm |
| | 8 | 42 | | if (File.Exists(xmlDoc)) options.IncludeXmlComments(xmlDoc); |
| | 8 | 43 | | }); |
| | | 44 | | |
| | 4 | 45 | | return services; |
| | | 46 | | } |
| | | 47 | | } |