Browse Source

Human Friendly Enum in Swagger

pull/17042/head
Masood Khoshgrd 3 years ago
parent
commit
725a04e171
  1. 2
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs
  2. 5
      framework/src/Volo.Abp.Swashbuckle/Microsoft/Extensions/DependencyInjection/AbpSwaggerGenOptionsExtensions.cs
  3. 16
      framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/AbpSwashbuckleDocumentFilter.cs
  4. 21
      framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/AbpSwashbuckleEnumSchemaFilter.cs

2
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs

@ -1,5 +1,6 @@
using System; using System;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
@ -19,6 +20,7 @@ public static class MvcCoreBuilderExtensions
options.JsonSerializerOptions.AllowTrailingCommas = true; options.JsonSerializerOptions.AllowTrailingCommas = true;
options.JsonSerializerOptions.Converters.Add(new AbpStringToEnumFactory()); options.JsonSerializerOptions.Converters.Add(new AbpStringToEnumFactory());
options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
options.JsonSerializerOptions.Converters.Add(new AbpStringToBooleanConverter()); options.JsonSerializerOptions.Converters.Add(new AbpStringToBooleanConverter());
options.JsonSerializerOptions.Converters.Add(new AbpStringToGuidConverter()); options.JsonSerializerOptions.Converters.Add(new AbpStringToGuidConverter());
options.JsonSerializerOptions.Converters.Add(new AbpNullableStringToGuidConverter()); options.JsonSerializerOptions.Converters.Add(new AbpNullableStringToGuidConverter());

5
framework/src/Volo.Abp.Swashbuckle/Microsoft/Extensions/DependencyInjection/AbpSwaggerGenOptionsExtensions.cs

@ -9,4 +9,9 @@ public static class AbpSwaggerGenOptionsExtensions
{ {
swaggerGenOptions.DocumentFilter<AbpSwashbuckleDocumentFilter>(); swaggerGenOptions.DocumentFilter<AbpSwashbuckleDocumentFilter>();
} }
public static void UserFriendlyEnums(this SwaggerGenOptions swaggerGenOptions)
{
swaggerGenOptions.SchemaFilter<AbpSwashbuckleEnumSchemaFilter>();
}
} }

16
framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/AbpSwashbuckleDocumentFilter.cs

@ -28,6 +28,22 @@ public class AbpSwashbuckleDocumentFilter : IDocumentFilter
swaggerDoc swaggerDoc
.Paths .Paths
.RemoveAll(path => !actionUrls.Contains(path.Key)); .RemoveAll(path => !actionUrls.Contains(path.Key));
foreach (OpenApiSchema schema in swaggerDoc.Components.Schemas.Values)
{
ICollection<OpenApiSchema> properties = schema.Properties?.Values;
if (properties != null)
{
foreach (OpenApiSchema property in properties)
{
List<object> propertyEnums = property.Enum?.Cast<object>().ToList();
if (propertyEnums != null && propertyEnums.Any())
{
property.Description += "<br><br><strong>Possible values:</strong><br>" + string.Join("<br>", propertyEnums);
}
}
}
}
} }
protected virtual string RemoveRouteParameterConstraints(ActionDescriptor actionDescriptor) protected virtual string RemoveRouteParameterConstraints(ActionDescriptor actionDescriptor)

21
framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/AbpSwashbuckleEnumSchemaFilter.cs

@ -0,0 +1,21 @@
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.Linq;
namespace Volo.Abp.Swashbuckle;
public class AbpSwashbuckleEnumSchemaFilter : ISchemaFilter
{
public void Apply(OpenApiSchema schema, SchemaFilterContext context)
{
if (context.Type.IsEnum)
{
schema.Enum.Clear();
Enum.GetNames(context.Type)
.ToList()
.ForEach(name => schema.Enum.Add(new OpenApiString($"{name}")));
}
}
}
Loading…
Cancel
Save