using Microsoft.AspNetCore.Mvc.Controllers;
|
using Microsoft.OpenApi.Models;
|
using Swashbuckle.AspNetCore.SwaggerGen;
|
using System;
|
using System.Collections.Generic;
|
using System.ComponentModel.DataAnnotations;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace FlexJobApi.Core
|
{
|
public class CustomOperationIdFilter : IOperationFilter
|
{
|
public void Apply(OpenApiOperation operation, OperationFilterContext context)
|
{
|
// 获取控制器和动作信息(Furion 中通过 ActionDescriptor 获取)
|
if (context.ApiDescription.ActionDescriptor is not ControllerActionDescriptor actionDescriptor)
|
return;
|
|
// 自定义 OperationId 规则:例如“控制器名_动作名”
|
var controllerName = actionDescriptor.ControllerName;
|
var actionName = actionDescriptor.ActionName;
|
|
// 设置最终的 OperationId
|
operation.OperationId = $"{controllerName}-{actionName}";
|
|
var returnType = context.MethodInfo.ReturnType;
|
|
if (returnType.IsGenericType && returnType.GetGenericTypeDefinition() == typeof(Task<>))
|
{
|
returnType = returnType.GetGenericArguments()[0];
|
}
|
|
// 步骤 3:替换 Swagger 响应类型为 Data 的类型
|
operation.Responses.Clear();
|
operation.Responses.Add("200", new OpenApiResponse
|
{
|
Description = "操作成功",
|
Content = new Dictionary<string, OpenApiMediaType>
|
{
|
["application/json"] = new OpenApiMediaType
|
{
|
Schema = context.SchemaGenerator.GenerateSchema(returnType, context.SchemaRepository)
|
}
|
}
|
});
|
}
|
}
|
}
|