forked from loafle/openapi-generator-original
[Aspnetcore] use the term openapi (#7540)
* use openapi in aspnetcore * move back to other * add back file
This commit is contained in:
@@ -5,3 +5,4 @@ templateDir: modules/openapi-generator/src/main/resources/aspnetcore/3.0
|
||||
additionalProperties:
|
||||
packageGuid: '{3C799344-F285-4669-8FD5-7ED9B795D5C5}'
|
||||
aspnetCoreVersion: "3.1"
|
||||
userSecretsGuid: "76e9e993-9159-441c-9c5b-fe95e7f4f020"
|
||||
|
||||
Vendored
+9
-9
@@ -6,7 +6,7 @@ using Swashbuckle.AspNetCore.SwaggerGen;
|
||||
namespace {{packageName}}.Filters
|
||||
{
|
||||
/// <summary>
|
||||
/// BasePath Document Filter sets BasePath property of Swagger and removes it from the individual URL paths
|
||||
/// BasePath Document Filter sets BasePath property of OpenAPI and removes it from the individual URL paths
|
||||
/// </summary>
|
||||
public class BasePathFilter : IDocumentFilter
|
||||
{
|
||||
@@ -20,29 +20,29 @@ namespace {{packageName}}.Filters
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the BasePath of the Swagger Doc
|
||||
/// Gets the BasePath of the OpenAPI Doc
|
||||
/// </summary>
|
||||
/// <returns>The BasePath of the Swagger Doc</returns>
|
||||
/// <returns>The BasePath of the OpenAPI Doc</returns>
|
||||
public string BasePath { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Apply the filter
|
||||
/// </summary>
|
||||
/// <param name="swaggerDoc">OpenApiDocument</param>
|
||||
/// <param name="openapiDoc">OpenApiDocument</param>
|
||||
/// <param name="context">FilterContext</param>
|
||||
public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
|
||||
public void Apply(OpenApiDocument openapiDoc, DocumentFilterContext context)
|
||||
{
|
||||
//swaggerDoc.BasePath = BasePath;
|
||||
//openapiDoc.BasePath = BasePath;
|
||||
|
||||
var pathsToModify = swaggerDoc.Paths.Where(p => p.Key.StartsWith(BasePath)).ToList();
|
||||
var pathsToModify = openapiDoc.Paths.Where(p => p.Key.StartsWith(BasePath)).ToList();
|
||||
|
||||
foreach (var (key, value) in pathsToModify)
|
||||
{
|
||||
if (key.StartsWith(BasePath))
|
||||
{
|
||||
var newKey = Regex.Replace(key, $"^{BasePath}", string.Empty);
|
||||
swaggerDoc.Paths.Remove(key);
|
||||
swaggerDoc.Paths.Add(newKey, value);
|
||||
openapiDoc.Paths.Remove(key);
|
||||
openapiDoc.Paths.Add(newKey, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+8
-8
@@ -22,20 +22,20 @@ namespace {{packageName}}.Filters
|
||||
|
||||
foreach (var par in pars)
|
||||
{
|
||||
var swaggerParam = operation.Parameters.SingleOrDefault(p => p.Name == par.Name);
|
||||
var openapiParam = operation.Parameters.SingleOrDefault(p => p.Name == par.Name);
|
||||
|
||||
var attributes = ((ControllerParameterDescriptor)par.ParameterDescriptor).ParameterInfo.CustomAttributes.ToList();
|
||||
|
||||
// See https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/1147
|
||||
// and https://mikeralphson.github.io/openapi/2017/03/15/openapi3.0.0-rc0
|
||||
// Basically OpenAPI v3 body parameters are split out into RequestBody and the properties have moved to schema
|
||||
if (attributes.Any() && swaggerParam != null)
|
||||
if (attributes.Any() && openapiParam != null)
|
||||
{
|
||||
// Required - [Required]
|
||||
var requiredAttr = attributes.FirstOrDefault(p => p.AttributeType == typeof(RequiredAttribute));
|
||||
if (requiredAttr != null)
|
||||
{
|
||||
swaggerParam.Required = true;
|
||||
openapiParam.Required = true;
|
||||
}
|
||||
|
||||
// Regex Pattern [RegularExpression]
|
||||
@@ -43,7 +43,7 @@ namespace {{packageName}}.Filters
|
||||
if (regexAttr != null)
|
||||
{
|
||||
var regex = (string)regexAttr.ConstructorArguments[0].Value;
|
||||
swaggerParam.Schema.Pattern = regex;
|
||||
openapiParam.Schema.Pattern = regex;
|
||||
}
|
||||
|
||||
// String Length [StringLength]
|
||||
@@ -72,12 +72,12 @@ namespace {{packageName}}.Filters
|
||||
|
||||
if (minLength != null)
|
||||
{
|
||||
swaggerParam.Schema.MinLength = minLength;
|
||||
openapiParam.Schema.MinLength = minLength;
|
||||
}
|
||||
|
||||
if (maxLength != null)
|
||||
{
|
||||
swaggerParam.Schema.MaxLength = maxLength;
|
||||
openapiParam.Schema.MaxLength = maxLength;
|
||||
}
|
||||
|
||||
// Range [Range]
|
||||
@@ -87,8 +87,8 @@ namespace {{packageName}}.Filters
|
||||
var rangeMin = (int)rangeAttr.ConstructorArguments[0].Value;
|
||||
var rangeMax = (int)rangeAttr.ConstructorArguments[1].Value;
|
||||
|
||||
swaggerParam.Schema.MinLength = rangeMin;
|
||||
swaggerParam.Schema.MaxLength = rangeMax;
|
||||
openapiParam.Schema.MinLength = rangeMin;
|
||||
openapiParam.Schema.MaxLength = rangeMax;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -12,7 +12,7 @@
|
||||
"IIS Express": {
|
||||
"commandName": "IISExpress",
|
||||
"launchBrowser": true,
|
||||
"launchUrl": "swagger",
|
||||
"launchUrl": "openapi",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
@@ -20,7 +20,7 @@
|
||||
"OpenAPI": {
|
||||
"commandName": "Project",
|
||||
"launchBrowser": true,
|
||||
"launchUrl": "swagger",
|
||||
"launchUrl": "openapi",
|
||||
"applicationUrl": "https://localhost:5001;http://localhost:5000",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
@@ -29,9 +29,9 @@
|
||||
"Docker": {
|
||||
"commandName": "Docker",
|
||||
"launchBrowser": true,
|
||||
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
|
||||
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/openapi",
|
||||
"publishAllPorts": true,
|
||||
"useSSL": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+8
-6
@@ -104,11 +104,11 @@ namespace {{packageName}}
|
||||
c.CustomSchemaIds(type => type.FriendlyId(true));
|
||||
c.IncludeXmlComments($"{AppContext.BaseDirectory}{Path.DirectorySeparatorChar}{Assembly.GetEntryAssembly().GetName().Name}.xml");
|
||||
{{#basePathWithoutHost}}
|
||||
// Sets the basePath property in the Swagger document generated
|
||||
// Sets the basePath property in the OpenAPI document generated
|
||||
c.DocumentFilter<BasePathFilter>("{{{basePathWithoutHost}}}");
|
||||
{{/basePathWithoutHost}}
|
||||
|
||||
// Include DataAnnotation attributes on Controller Action parameters as Swagger validation rules (e.g required, pattern, ..)
|
||||
// Include DataAnnotation attributes on Controller Action parameters as OpenAPI validation rules (e.g required, pattern, ..)
|
||||
// Use [ValidateModelState] on Actions to actually validate it in C# as well!
|
||||
c.OperationFilter<GeneratePathParamsValidationFilter>();
|
||||
});
|
||||
@@ -141,14 +141,16 @@ namespace {{packageName}}
|
||||
{{#useSwashbuckle}}
|
||||
app.UseSwagger(c =>
|
||||
{
|
||||
c.RouteTemplate = "swagger/{documentName}/openapi.json";
|
||||
c.RouteTemplate = "openapi/{documentName}/openapi.json";
|
||||
})
|
||||
.UseSwaggerUI(c =>
|
||||
{
|
||||
//TODO: Either use the SwaggerGen generated Swagger contract (generated from C# classes)
|
||||
c.SwaggerEndpoint("/swagger/{{#version}}{{{version}}}{{/version}}{{^version}}v1{{/version}}/openapi.json", "{{#appName}}{{{appName}}}{{/appName}}{{^appName}}{{packageName}}{{/appName}}");
|
||||
// set route prefix to openapi, e.g. http://localhost:8080/openapi/index.html
|
||||
c.RoutePrefix = "openapi";
|
||||
//TODO: Either use the SwaggerGen generated OpenAPI contract (generated from C# classes)
|
||||
c.SwaggerEndpoint("/openapi/{{#version}}{{{version}}}{{/version}}{{^version}}v1{{/version}}/openapi.json", "{{#appName}}{{{appName}}}{{/appName}}{{^appName}}{{packageName}}{{/appName}}");
|
||||
|
||||
//TODO: Or alternatively use the original Swagger contract that's included in the static files
|
||||
//TODO: Or alternatively use the original OpenAPI contract that's included in the static files
|
||||
// c.SwaggerEndpoint("/openapi-original.json", "{{#appName}}{{{appName}}}{{/appName}}{{^appName}}{{packageName}}{{/appName}} Original");
|
||||
}){{/useSwashbuckle}};
|
||||
app.UseRouting();
|
||||
|
||||
@@ -1 +1 @@
|
||||
<meta http-equiv="refresh" content="0;URL='./swagger/'" />
|
||||
<meta http-equiv="refresh" content="0;URL='./openapi/'" />
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
Org.OpenAPITools.sln
|
||||
README.md
|
||||
build.bat
|
||||
build.sh
|
||||
src/Org.OpenAPITools/.gitignore
|
||||
src/Org.OpenAPITools/Attributes/ValidateModelStateAttribute.cs
|
||||
src/Org.OpenAPITools/Authentication/ApiAuthentication.cs
|
||||
src/Org.OpenAPITools/Controllers/PetApi.cs
|
||||
src/Org.OpenAPITools/Controllers/StoreApi.cs
|
||||
src/Org.OpenAPITools/Controllers/UserApi.cs
|
||||
src/Org.OpenAPITools/Converters/CustomEnumConverter.cs
|
||||
src/Org.OpenAPITools/Dockerfile
|
||||
src/Org.OpenAPITools/Filters/BasePathFilter.cs
|
||||
src/Org.OpenAPITools/Filters/GeneratePathParamsValidationFilter.cs
|
||||
src/Org.OpenAPITools/Models/ApiResponse.cs
|
||||
src/Org.OpenAPITools/Models/Category.cs
|
||||
src/Org.OpenAPITools/Models/Order.cs
|
||||
src/Org.OpenAPITools/Models/Pet.cs
|
||||
src/Org.OpenAPITools/Models/Tag.cs
|
||||
src/Org.OpenAPITools/Models/User.cs
|
||||
src/Org.OpenAPITools/OpenApi/TypeExtensions.cs
|
||||
src/Org.OpenAPITools/Org.OpenAPITools.csproj
|
||||
src/Org.OpenAPITools/Program.cs
|
||||
src/Org.OpenAPITools/Properties/launchSettings.json
|
||||
src/Org.OpenAPITools/Startup.cs
|
||||
src/Org.OpenAPITools/appsettings.json
|
||||
src/Org.OpenAPITools/wwwroot/README.md
|
||||
src/Org.OpenAPITools/wwwroot/index.html
|
||||
src/Org.OpenAPITools/wwwroot/openapi-original.json
|
||||
+9
-9
@@ -6,7 +6,7 @@ using Swashbuckle.AspNetCore.SwaggerGen;
|
||||
namespace Org.OpenAPITools.Filters
|
||||
{
|
||||
/// <summary>
|
||||
/// BasePath Document Filter sets BasePath property of Swagger and removes it from the individual URL paths
|
||||
/// BasePath Document Filter sets BasePath property of OpenAPI and removes it from the individual URL paths
|
||||
/// </summary>
|
||||
public class BasePathFilter : IDocumentFilter
|
||||
{
|
||||
@@ -20,29 +20,29 @@ namespace Org.OpenAPITools.Filters
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the BasePath of the Swagger Doc
|
||||
/// Gets the BasePath of the OpenAPI Doc
|
||||
/// </summary>
|
||||
/// <returns>The BasePath of the Swagger Doc</returns>
|
||||
/// <returns>The BasePath of the OpenAPI Doc</returns>
|
||||
public string BasePath { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Apply the filter
|
||||
/// </summary>
|
||||
/// <param name="swaggerDoc">OpenApiDocument</param>
|
||||
/// <param name="openapiDoc">OpenApiDocument</param>
|
||||
/// <param name="context">FilterContext</param>
|
||||
public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
|
||||
public void Apply(OpenApiDocument openapiDoc, DocumentFilterContext context)
|
||||
{
|
||||
//swaggerDoc.BasePath = BasePath;
|
||||
//openapiDoc.BasePath = BasePath;
|
||||
|
||||
var pathsToModify = swaggerDoc.Paths.Where(p => p.Key.StartsWith(BasePath)).ToList();
|
||||
var pathsToModify = openapiDoc.Paths.Where(p => p.Key.StartsWith(BasePath)).ToList();
|
||||
|
||||
foreach (var (key, value) in pathsToModify)
|
||||
{
|
||||
if (key.StartsWith(BasePath))
|
||||
{
|
||||
var newKey = Regex.Replace(key, $"^{BasePath}", string.Empty);
|
||||
swaggerDoc.Paths.Remove(key);
|
||||
swaggerDoc.Paths.Add(newKey, value);
|
||||
openapiDoc.Paths.Remove(key);
|
||||
openapiDoc.Paths.Add(newKey, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+8
-8
@@ -22,20 +22,20 @@ namespace Org.OpenAPITools.Filters
|
||||
|
||||
foreach (var par in pars)
|
||||
{
|
||||
var swaggerParam = operation.Parameters.SingleOrDefault(p => p.Name == par.Name);
|
||||
var openapiParam = operation.Parameters.SingleOrDefault(p => p.Name == par.Name);
|
||||
|
||||
var attributes = ((ControllerParameterDescriptor)par.ParameterDescriptor).ParameterInfo.CustomAttributes.ToList();
|
||||
|
||||
// See https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/1147
|
||||
// and https://mikeralphson.github.io/openapi/2017/03/15/openapi3.0.0-rc0
|
||||
// Basically OpenAPI v3 body parameters are split out into RequestBody and the properties have moved to schema
|
||||
if (attributes.Any() && swaggerParam != null)
|
||||
if (attributes.Any() && openapiParam != null)
|
||||
{
|
||||
// Required - [Required]
|
||||
var requiredAttr = attributes.FirstOrDefault(p => p.AttributeType == typeof(RequiredAttribute));
|
||||
if (requiredAttr != null)
|
||||
{
|
||||
swaggerParam.Required = true;
|
||||
openapiParam.Required = true;
|
||||
}
|
||||
|
||||
// Regex Pattern [RegularExpression]
|
||||
@@ -43,7 +43,7 @@ namespace Org.OpenAPITools.Filters
|
||||
if (regexAttr != null)
|
||||
{
|
||||
var regex = (string)regexAttr.ConstructorArguments[0].Value;
|
||||
swaggerParam.Schema.Pattern = regex;
|
||||
openapiParam.Schema.Pattern = regex;
|
||||
}
|
||||
|
||||
// String Length [StringLength]
|
||||
@@ -72,12 +72,12 @@ namespace Org.OpenAPITools.Filters
|
||||
|
||||
if (minLength != null)
|
||||
{
|
||||
swaggerParam.Schema.MinLength = minLength;
|
||||
openapiParam.Schema.MinLength = minLength;
|
||||
}
|
||||
|
||||
if (maxLength != null)
|
||||
{
|
||||
swaggerParam.Schema.MaxLength = maxLength;
|
||||
openapiParam.Schema.MaxLength = maxLength;
|
||||
}
|
||||
|
||||
// Range [Range]
|
||||
@@ -87,8 +87,8 @@ namespace Org.OpenAPITools.Filters
|
||||
var rangeMin = (int)rangeAttr.ConstructorArguments[0].Value;
|
||||
var rangeMax = (int)rangeAttr.ConstructorArguments[1].Value;
|
||||
|
||||
swaggerParam.Schema.MinLength = rangeMin;
|
||||
swaggerParam.Schema.MaxLength = rangeMax;
|
||||
openapiParam.Schema.MinLength = rangeMin;
|
||||
openapiParam.Schema.MaxLength = rangeMax;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<PreserveCompilationContext>true</PreserveCompilationContext>
|
||||
<AssemblyName>Org.OpenAPITools</AssemblyName>
|
||||
<PackageId>Org.OpenAPITools</PackageId>
|
||||
<UserSecretsId>5437bedb-0880-4b79-b60e-a06e28fd9ff2</UserSecretsId>
|
||||
<UserSecretsId>76e9e993-9159-441c-9c5b-fe95e7f4f020</UserSecretsId>
|
||||
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
|
||||
<DockerfileContext>..\..</DockerfileContext>
|
||||
</PropertyGroup>
|
||||
|
||||
+4
-4
@@ -12,7 +12,7 @@
|
||||
"IIS Express": {
|
||||
"commandName": "IISExpress",
|
||||
"launchBrowser": true,
|
||||
"launchUrl": "swagger",
|
||||
"launchUrl": "openapi",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
@@ -20,7 +20,7 @@
|
||||
"OpenAPI": {
|
||||
"commandName": "Project",
|
||||
"launchBrowser": true,
|
||||
"launchUrl": "swagger",
|
||||
"launchUrl": "openapi",
|
||||
"applicationUrl": "https://localhost:5001;http://localhost:5000",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
@@ -29,9 +29,9 @@
|
||||
"Docker": {
|
||||
"commandName": "Docker",
|
||||
"launchBrowser": true,
|
||||
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
|
||||
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/openapi",
|
||||
"publishAllPorts": true,
|
||||
"useSSL": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -97,10 +97,10 @@ namespace Org.OpenAPITools
|
||||
});
|
||||
c.CustomSchemaIds(type => type.FriendlyId(true));
|
||||
c.IncludeXmlComments($"{AppContext.BaseDirectory}{Path.DirectorySeparatorChar}{Assembly.GetEntryAssembly().GetName().Name}.xml");
|
||||
// Sets the basePath property in the Swagger document generated
|
||||
// Sets the basePath property in the OpenAPI document generated
|
||||
c.DocumentFilter<BasePathFilter>("/v2");
|
||||
|
||||
// Include DataAnnotation attributes on Controller Action parameters as Swagger validation rules (e.g required, pattern, ..)
|
||||
// Include DataAnnotation attributes on Controller Action parameters as OpenAPI validation rules (e.g required, pattern, ..)
|
||||
// Use [ValidateModelState] on Actions to actually validate it in C# as well!
|
||||
c.OperationFilter<GeneratePathParamsValidationFilter>();
|
||||
});
|
||||
@@ -129,14 +129,16 @@ namespace Org.OpenAPITools
|
||||
app.UseStaticFiles();
|
||||
app.UseSwagger(c =>
|
||||
{
|
||||
c.RouteTemplate = "swagger/{documentName}/openapi.json";
|
||||
c.RouteTemplate = "openapi/{documentName}/openapi.json";
|
||||
})
|
||||
.UseSwaggerUI(c =>
|
||||
{
|
||||
//TODO: Either use the SwaggerGen generated Swagger contract (generated from C# classes)
|
||||
c.SwaggerEndpoint("/swagger/1.0.0/openapi.json", "OpenAPI Petstore");
|
||||
// set route prefix to openapi, e.g. http://localhost:8080/openapi/index.html
|
||||
c.RoutePrefix = "openapi";
|
||||
//TODO: Either use the SwaggerGen generated OpenAPI contract (generated from C# classes)
|
||||
c.SwaggerEndpoint("/openapi/1.0.0/openapi.json", "OpenAPI Petstore");
|
||||
|
||||
//TODO: Or alternatively use the original Swagger contract that's included in the static files
|
||||
//TODO: Or alternatively use the original OpenAPI contract that's included in the static files
|
||||
// c.SwaggerEndpoint("/openapi-original.json", "OpenAPI Petstore Original");
|
||||
});
|
||||
app.UseRouting();
|
||||
|
||||
@@ -1 +1 @@
|
||||
<meta http-equiv="refresh" content="0;URL='./swagger/'" />
|
||||
<meta http-equiv="refresh" content="0;URL='./openapi/'" />
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
Org.OpenAPITools.sln
|
||||
README.md
|
||||
build.bat
|
||||
build.sh
|
||||
src/Org.OpenAPITools/.gitignore
|
||||
src/Org.OpenAPITools/Attributes/ValidateModelStateAttribute.cs
|
||||
src/Org.OpenAPITools/Authentication/ApiAuthentication.cs
|
||||
src/Org.OpenAPITools/Controllers/PetApi.cs
|
||||
src/Org.OpenAPITools/Controllers/StoreApi.cs
|
||||
src/Org.OpenAPITools/Controllers/UserApi.cs
|
||||
src/Org.OpenAPITools/Converters/CustomEnumConverter.cs
|
||||
src/Org.OpenAPITools/Dockerfile
|
||||
src/Org.OpenAPITools/Filters/BasePathFilter.cs
|
||||
src/Org.OpenAPITools/Filters/GeneratePathParamsValidationFilter.cs
|
||||
src/Org.OpenAPITools/Models/ApiResponse.cs
|
||||
src/Org.OpenAPITools/Models/Category.cs
|
||||
src/Org.OpenAPITools/Models/Order.cs
|
||||
src/Org.OpenAPITools/Models/Pet.cs
|
||||
src/Org.OpenAPITools/Models/Tag.cs
|
||||
src/Org.OpenAPITools/Models/User.cs
|
||||
src/Org.OpenAPITools/OpenApi/TypeExtensions.cs
|
||||
src/Org.OpenAPITools/Org.OpenAPITools.csproj
|
||||
src/Org.OpenAPITools/Program.cs
|
||||
src/Org.OpenAPITools/Properties/launchSettings.json
|
||||
src/Org.OpenAPITools/Startup.cs
|
||||
src/Org.OpenAPITools/appsettings.json
|
||||
src/Org.OpenAPITools/wwwroot/README.md
|
||||
src/Org.OpenAPITools/wwwroot/index.html
|
||||
src/Org.OpenAPITools/wwwroot/openapi-original.json
|
||||
+9
-9
@@ -6,7 +6,7 @@ using Swashbuckle.AspNetCore.SwaggerGen;
|
||||
namespace Org.OpenAPITools.Filters
|
||||
{
|
||||
/// <summary>
|
||||
/// BasePath Document Filter sets BasePath property of Swagger and removes it from the individual URL paths
|
||||
/// BasePath Document Filter sets BasePath property of OpenAPI and removes it from the individual URL paths
|
||||
/// </summary>
|
||||
public class BasePathFilter : IDocumentFilter
|
||||
{
|
||||
@@ -20,29 +20,29 @@ namespace Org.OpenAPITools.Filters
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the BasePath of the Swagger Doc
|
||||
/// Gets the BasePath of the OpenAPI Doc
|
||||
/// </summary>
|
||||
/// <returns>The BasePath of the Swagger Doc</returns>
|
||||
/// <returns>The BasePath of the OpenAPI Doc</returns>
|
||||
public string BasePath { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Apply the filter
|
||||
/// </summary>
|
||||
/// <param name="swaggerDoc">OpenApiDocument</param>
|
||||
/// <param name="openapiDoc">OpenApiDocument</param>
|
||||
/// <param name="context">FilterContext</param>
|
||||
public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
|
||||
public void Apply(OpenApiDocument openapiDoc, DocumentFilterContext context)
|
||||
{
|
||||
//swaggerDoc.BasePath = BasePath;
|
||||
//openapiDoc.BasePath = BasePath;
|
||||
|
||||
var pathsToModify = swaggerDoc.Paths.Where(p => p.Key.StartsWith(BasePath)).ToList();
|
||||
var pathsToModify = openapiDoc.Paths.Where(p => p.Key.StartsWith(BasePath)).ToList();
|
||||
|
||||
foreach (var (key, value) in pathsToModify)
|
||||
{
|
||||
if (key.StartsWith(BasePath))
|
||||
{
|
||||
var newKey = Regex.Replace(key, $"^{BasePath}", string.Empty);
|
||||
swaggerDoc.Paths.Remove(key);
|
||||
swaggerDoc.Paths.Add(newKey, value);
|
||||
openapiDoc.Paths.Remove(key);
|
||||
openapiDoc.Paths.Add(newKey, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+8
-8
@@ -22,20 +22,20 @@ namespace Org.OpenAPITools.Filters
|
||||
|
||||
foreach (var par in pars)
|
||||
{
|
||||
var swaggerParam = operation.Parameters.SingleOrDefault(p => p.Name == par.Name);
|
||||
var openapiParam = operation.Parameters.SingleOrDefault(p => p.Name == par.Name);
|
||||
|
||||
var attributes = ((ControllerParameterDescriptor)par.ParameterDescriptor).ParameterInfo.CustomAttributes.ToList();
|
||||
|
||||
// See https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/1147
|
||||
// and https://mikeralphson.github.io/openapi/2017/03/15/openapi3.0.0-rc0
|
||||
// Basically OpenAPI v3 body parameters are split out into RequestBody and the properties have moved to schema
|
||||
if (attributes.Any() && swaggerParam != null)
|
||||
if (attributes.Any() && openapiParam != null)
|
||||
{
|
||||
// Required - [Required]
|
||||
var requiredAttr = attributes.FirstOrDefault(p => p.AttributeType == typeof(RequiredAttribute));
|
||||
if (requiredAttr != null)
|
||||
{
|
||||
swaggerParam.Required = true;
|
||||
openapiParam.Required = true;
|
||||
}
|
||||
|
||||
// Regex Pattern [RegularExpression]
|
||||
@@ -43,7 +43,7 @@ namespace Org.OpenAPITools.Filters
|
||||
if (regexAttr != null)
|
||||
{
|
||||
var regex = (string)regexAttr.ConstructorArguments[0].Value;
|
||||
swaggerParam.Schema.Pattern = regex;
|
||||
openapiParam.Schema.Pattern = regex;
|
||||
}
|
||||
|
||||
// String Length [StringLength]
|
||||
@@ -72,12 +72,12 @@ namespace Org.OpenAPITools.Filters
|
||||
|
||||
if (minLength != null)
|
||||
{
|
||||
swaggerParam.Schema.MinLength = minLength;
|
||||
openapiParam.Schema.MinLength = minLength;
|
||||
}
|
||||
|
||||
if (maxLength != null)
|
||||
{
|
||||
swaggerParam.Schema.MaxLength = maxLength;
|
||||
openapiParam.Schema.MaxLength = maxLength;
|
||||
}
|
||||
|
||||
// Range [Range]
|
||||
@@ -87,8 +87,8 @@ namespace Org.OpenAPITools.Filters
|
||||
var rangeMin = (int)rangeAttr.ConstructorArguments[0].Value;
|
||||
var rangeMax = (int)rangeAttr.ConstructorArguments[1].Value;
|
||||
|
||||
swaggerParam.Schema.MinLength = rangeMin;
|
||||
swaggerParam.Schema.MaxLength = rangeMax;
|
||||
openapiParam.Schema.MinLength = rangeMin;
|
||||
openapiParam.Schema.MaxLength = rangeMax;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<PreserveCompilationContext>true</PreserveCompilationContext>
|
||||
<AssemblyName>Org.OpenAPITools</AssemblyName>
|
||||
<PackageId>Org.OpenAPITools</PackageId>
|
||||
<UserSecretsId>341adb46-9edd-4976-b953-4419c5134443</UserSecretsId>
|
||||
<UserSecretsId>882e6cf9-cad5-47f4-9df2-2874b758611f</UserSecretsId>
|
||||
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
|
||||
<DockerfileContext>..\..</DockerfileContext>
|
||||
</PropertyGroup>
|
||||
|
||||
+4
-4
@@ -12,7 +12,7 @@
|
||||
"IIS Express": {
|
||||
"commandName": "IISExpress",
|
||||
"launchBrowser": true,
|
||||
"launchUrl": "swagger",
|
||||
"launchUrl": "openapi",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
@@ -20,7 +20,7 @@
|
||||
"OpenAPI": {
|
||||
"commandName": "Project",
|
||||
"launchBrowser": true,
|
||||
"launchUrl": "swagger",
|
||||
"launchUrl": "openapi",
|
||||
"applicationUrl": "https://localhost:5001;http://localhost:5000",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
@@ -29,9 +29,9 @@
|
||||
"Docker": {
|
||||
"commandName": "Docker",
|
||||
"launchBrowser": true,
|
||||
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
|
||||
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/openapi",
|
||||
"publishAllPorts": true,
|
||||
"useSSL": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -97,10 +97,10 @@ namespace Org.OpenAPITools
|
||||
});
|
||||
c.CustomSchemaIds(type => type.FriendlyId(true));
|
||||
c.IncludeXmlComments($"{AppContext.BaseDirectory}{Path.DirectorySeparatorChar}{Assembly.GetEntryAssembly().GetName().Name}.xml");
|
||||
// Sets the basePath property in the Swagger document generated
|
||||
// Sets the basePath property in the OpenAPI document generated
|
||||
c.DocumentFilter<BasePathFilter>("/v2");
|
||||
|
||||
// Include DataAnnotation attributes on Controller Action parameters as Swagger validation rules (e.g required, pattern, ..)
|
||||
// Include DataAnnotation attributes on Controller Action parameters as OpenAPI validation rules (e.g required, pattern, ..)
|
||||
// Use [ValidateModelState] on Actions to actually validate it in C# as well!
|
||||
c.OperationFilter<GeneratePathParamsValidationFilter>();
|
||||
});
|
||||
@@ -129,14 +129,16 @@ namespace Org.OpenAPITools
|
||||
app.UseStaticFiles();
|
||||
app.UseSwagger(c =>
|
||||
{
|
||||
c.RouteTemplate = "swagger/{documentName}/openapi.json";
|
||||
c.RouteTemplate = "openapi/{documentName}/openapi.json";
|
||||
})
|
||||
.UseSwaggerUI(c =>
|
||||
{
|
||||
//TODO: Either use the SwaggerGen generated Swagger contract (generated from C# classes)
|
||||
c.SwaggerEndpoint("/swagger/1.0.0/openapi.json", "OpenAPI Petstore");
|
||||
// set route prefix to openapi, e.g. http://localhost:8080/openapi/index.html
|
||||
c.RoutePrefix = "openapi";
|
||||
//TODO: Either use the SwaggerGen generated OpenAPI contract (generated from C# classes)
|
||||
c.SwaggerEndpoint("/openapi/1.0.0/openapi.json", "OpenAPI Petstore");
|
||||
|
||||
//TODO: Or alternatively use the original Swagger contract that's included in the static files
|
||||
//TODO: Or alternatively use the original OpenAPI contract that's included in the static files
|
||||
// c.SwaggerEndpoint("/openapi-original.json", "OpenAPI Petstore Original");
|
||||
});
|
||||
app.UseRouting();
|
||||
|
||||
@@ -1 +1 @@
|
||||
<meta http-equiv="refresh" content="0;URL='./swagger/'" />
|
||||
<meta http-equiv="refresh" content="0;URL='./openapi/'" />
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
Org.OpenAPITools.sln
|
||||
README.md
|
||||
build.bat
|
||||
build.sh
|
||||
src/Org.OpenAPITools/.gitignore
|
||||
src/Org.OpenAPITools/Attributes/ValidateModelStateAttribute.cs
|
||||
src/Org.OpenAPITools/Authentication/ApiAuthentication.cs
|
||||
src/Org.OpenAPITools/Controllers/PetApi.cs
|
||||
src/Org.OpenAPITools/Controllers/StoreApi.cs
|
||||
src/Org.OpenAPITools/Controllers/UserApi.cs
|
||||
src/Org.OpenAPITools/Converters/CustomEnumConverter.cs
|
||||
src/Org.OpenAPITools/Dockerfile
|
||||
src/Org.OpenAPITools/Filters/BasePathFilter.cs
|
||||
src/Org.OpenAPITools/Filters/GeneratePathParamsValidationFilter.cs
|
||||
src/Org.OpenAPITools/Models/ApiResponse.cs
|
||||
src/Org.OpenAPITools/Models/Category.cs
|
||||
src/Org.OpenAPITools/Models/Order.cs
|
||||
src/Org.OpenAPITools/Models/Pet.cs
|
||||
src/Org.OpenAPITools/Models/Tag.cs
|
||||
src/Org.OpenAPITools/Models/User.cs
|
||||
src/Org.OpenAPITools/Org.OpenAPITools.csproj
|
||||
src/Org.OpenAPITools/Program.cs
|
||||
src/Org.OpenAPITools/Properties/launchSettings.json
|
||||
src/Org.OpenAPITools/Startup.cs
|
||||
src/Org.OpenAPITools/appsettings.json
|
||||
src/Org.OpenAPITools/wwwroot/README.md
|
||||
src/Org.OpenAPITools/wwwroot/index.html
|
||||
src/Org.OpenAPITools/wwwroot/openapi-original.json
|
||||
Reference in New Issue
Block a user