Browse Source

Merge pull request #15722 from abpframework/issue-15712

Remove route constraints before determining which endpoints to hide
pull/15737/head
liangshiwei 4 years ago
committed by GitHub
parent
commit
6f2da36b40
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 34
      framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/AbpSwashbuckleDocumentFilter.cs

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

@ -1,6 +1,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen; using Swashbuckle.AspNetCore.SwaggerGen;
@ -8,7 +10,9 @@ namespace Volo.Abp.Swashbuckle;
public class AbpSwashbuckleDocumentFilter : IDocumentFilter public class AbpSwashbuckleDocumentFilter : IDocumentFilter
{ {
protected string[] ActionUrlPrefixes = new[] {"Volo."}; protected virtual string[] ActionUrlPrefixes { get; set; } = new[] { "Volo." };
protected virtual string RegexConstraintPattern => @":regex\(([^()]*)\)";
public virtual void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context) public virtual void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
{ {
@ -17,7 +21,7 @@ public class AbpSwashbuckleDocumentFilter : IDocumentFilter
.Where(actionDescriptor => !string.IsNullOrEmpty(actionDescriptor.DisplayName) && .Where(actionDescriptor => !string.IsNullOrEmpty(actionDescriptor.DisplayName) &&
ActionUrlPrefixes.Any(actionUrlPrefix => !actionDescriptor.DisplayName.Contains(actionUrlPrefix))) ActionUrlPrefixes.Any(actionUrlPrefix => !actionDescriptor.DisplayName.Contains(actionUrlPrefix)))
.DistinctBy(actionDescriptor => actionDescriptor.AttributeRouteInfo?.Template) .DistinctBy(actionDescriptor => actionDescriptor.AttributeRouteInfo?.Template)
.Select(actionDescriptor => actionDescriptor.AttributeRouteInfo?.Template?.EnsureStartsWith('/').Replace("?", "")) .Select(RemoveRouteParameterConstraints)
.Where(actionUrl => !string.IsNullOrEmpty(actionUrl)) .Where(actionUrl => !string.IsNullOrEmpty(actionUrl))
.ToList(); .ToList();
@ -25,4 +29,30 @@ public class AbpSwashbuckleDocumentFilter : IDocumentFilter
.Paths .Paths
.RemoveAll(path => !actionUrls.Contains(path.Key)); .RemoveAll(path => !actionUrls.Contains(path.Key));
} }
protected virtual string RemoveRouteParameterConstraints(ActionDescriptor actionDescriptor)
{
var route = actionDescriptor.AttributeRouteInfo?.Template?.EnsureStartsWith('/').Replace("?", "");
if (string.IsNullOrWhiteSpace(route))
{
return route;
}
route = Regex.Replace(route, RegexConstraintPattern, "");
while (route.Contains(':'))
{
var startIndex = route.IndexOf(":", StringComparison.Ordinal);
var endIndex = route.IndexOf("}", startIndex);
if (endIndex == -1)
{
break;
}
route = route.Remove(startIndex, (endIndex - startIndex));
}
return route;
}
} }
Loading…
Cancel
Save