From f7570df5c37088db84a9a92a486a9e226cc054a6 Mon Sep 17 00:00:00 2001 From: William Cheng <wing328hk@gmail.com> Date: Tue, 29 Sep 2020 20:46:12 +0800 Subject: [PATCH] [Aspnetcore] use the term `openapi` (#7540) * use openapi in aspnetcore * move back to other * add back file --- bin/configs/other/aspnetcore-3.1.yaml | 1 + .../3.0/Filters/BasePathFilter.mustache | 18 ++++++------ ...eneratePathParamsValidationFilter.mustache | 16 +++++----- .../3.0/Properties/launchSettings.json | 8 ++--- .../resources/aspnetcore/3.0/Startup.mustache | 14 +++++---- .../aspnetcore/3.0/wwwroot/index.html | 2 +- .../aspnetcore-3.0/.openapi-generator/FILES | 29 +++++++++++++++++++ .../Filters/BasePathFilter.cs | 18 ++++++------ .../GeneratePathParamsValidationFilter.cs | 16 +++++----- .../Org.OpenAPITools/Org.OpenAPITools.csproj | 2 +- .../Properties/launchSettings.json | 8 ++--- .../src/Org.OpenAPITools/Startup.cs | 14 +++++---- .../src/Org.OpenAPITools/wwwroot/index.html | 2 +- .../aspnetcore-3.1/.openapi-generator/FILES | 29 +++++++++++++++++++ .../Filters/BasePathFilter.cs | 18 ++++++------ .../GeneratePathParamsValidationFilter.cs | 16 +++++----- .../Org.OpenAPITools/Org.OpenAPITools.csproj | 2 +- .../Properties/launchSettings.json | 8 ++--- .../src/Org.OpenAPITools/Startup.cs | 14 +++++---- .../src/Org.OpenAPITools/wwwroot/index.html | 2 +- .../aspnetcore/.openapi-generator/FILES | 28 ++++++++++++++++++ 21 files changed, 179 insertions(+), 86 deletions(-) create mode 100644 samples/server/petstore/aspnetcore-3.0/.openapi-generator/FILES create mode 100644 samples/server/petstore/aspnetcore-3.1/.openapi-generator/FILES create mode 100644 samples/server/petstore/aspnetcore/.openapi-generator/FILES diff --git a/bin/configs/other/aspnetcore-3.1.yaml b/bin/configs/other/aspnetcore-3.1.yaml index 0986677882a8..5b185f278e4f 100644 --- a/bin/configs/other/aspnetcore-3.1.yaml +++ b/bin/configs/other/aspnetcore-3.1.yaml @@ -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" diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/3.0/Filters/BasePathFilter.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/3.0/Filters/BasePathFilter.mustache index b05e282c2684..5ddb04defc1a 100644 --- a/modules/openapi-generator/src/main/resources/aspnetcore/3.0/Filters/BasePathFilter.mustache +++ b/modules/openapi-generator/src/main/resources/aspnetcore/3.0/Filters/BasePathFilter.mustache @@ -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); } } } diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/3.0/Filters/GeneratePathParamsValidationFilter.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/3.0/Filters/GeneratePathParamsValidationFilter.mustache index 88861304c394..f86af9fdd424 100644 --- a/modules/openapi-generator/src/main/resources/aspnetcore/3.0/Filters/GeneratePathParamsValidationFilter.mustache +++ b/modules/openapi-generator/src/main/resources/aspnetcore/3.0/Filters/GeneratePathParamsValidationFilter.mustache @@ -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; } } } diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/3.0/Properties/launchSettings.json b/modules/openapi-generator/src/main/resources/aspnetcore/3.0/Properties/launchSettings.json index 57b03cc43aa3..99cfeea4b919 100644 --- a/modules/openapi-generator/src/main/resources/aspnetcore/3.0/Properties/launchSettings.json +++ b/modules/openapi-generator/src/main/resources/aspnetcore/3.0/Properties/launchSettings.json @@ -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 } } -} \ No newline at end of file +} diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/3.0/Startup.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/3.0/Startup.mustache index 3c72ca2d7040..88f753500982 100644 --- a/modules/openapi-generator/src/main/resources/aspnetcore/3.0/Startup.mustache +++ b/modules/openapi-generator/src/main/resources/aspnetcore/3.0/Startup.mustache @@ -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(); diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/3.0/wwwroot/index.html b/modules/openapi-generator/src/main/resources/aspnetcore/3.0/wwwroot/index.html index cde1f2f90b92..f3318bc90a11 100644 --- a/modules/openapi-generator/src/main/resources/aspnetcore/3.0/wwwroot/index.html +++ b/modules/openapi-generator/src/main/resources/aspnetcore/3.0/wwwroot/index.html @@ -1 +1 @@ -<meta http-equiv="refresh" content="0;URL='./swagger/'" /> \ No newline at end of file +<meta http-equiv="refresh" content="0;URL='./openapi/'" /> diff --git a/samples/server/petstore/aspnetcore-3.0/.openapi-generator/FILES b/samples/server/petstore/aspnetcore-3.0/.openapi-generator/FILES new file mode 100644 index 000000000000..4de0e6417904 --- /dev/null +++ b/samples/server/petstore/aspnetcore-3.0/.openapi-generator/FILES @@ -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 diff --git a/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/Filters/BasePathFilter.cs b/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/Filters/BasePathFilter.cs index 7b39888d460c..a23854510764 100644 --- a/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/Filters/BasePathFilter.cs +++ b/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/Filters/BasePathFilter.cs @@ -6,7 +6,7 @@ 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 @@ public BasePathFilter(string basePath) } /// <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); } } } diff --git a/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/Filters/GeneratePathParamsValidationFilter.cs b/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/Filters/GeneratePathParamsValidationFilter.cs index 823aa34de41f..5c43aa69751d 100644 --- a/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/Filters/GeneratePathParamsValidationFilter.cs +++ b/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/Filters/GeneratePathParamsValidationFilter.cs @@ -22,20 +22,20 @@ public void Apply(OpenApiOperation operation, OperationFilterContext context) 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 @@ public void Apply(OpenApiOperation operation, OperationFilterContext context) 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 @@ public void Apply(OpenApiOperation operation, OperationFilterContext context) 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 @@ public void Apply(OpenApiOperation operation, OperationFilterContext context) 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; } } } diff --git a/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/Org.OpenAPITools.csproj b/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/Org.OpenAPITools.csproj index ca9ab04cd5bd..24b429c96dc0 100644 --- a/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/Org.OpenAPITools.csproj +++ b/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/Org.OpenAPITools.csproj @@ -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> diff --git a/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/Properties/launchSettings.json b/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/Properties/launchSettings.json index 57b03cc43aa3..99cfeea4b919 100644 --- a/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/Properties/launchSettings.json +++ b/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/Properties/launchSettings.json @@ -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 } } -} \ No newline at end of file +} diff --git a/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/Startup.cs b/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/Startup.cs index d985c7d38758..a6c96e4a2f93 100644 --- a/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/Startup.cs +++ b/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/Startup.cs @@ -97,10 +97,10 @@ public void ConfigureServices(IServiceCollection services) }); 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 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 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(); diff --git a/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/wwwroot/index.html b/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/wwwroot/index.html index cde1f2f90b92..f3318bc90a11 100644 --- a/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/wwwroot/index.html +++ b/samples/server/petstore/aspnetcore-3.0/src/Org.OpenAPITools/wwwroot/index.html @@ -1 +1 @@ -<meta http-equiv="refresh" content="0;URL='./swagger/'" /> \ No newline at end of file +<meta http-equiv="refresh" content="0;URL='./openapi/'" /> diff --git a/samples/server/petstore/aspnetcore-3.1/.openapi-generator/FILES b/samples/server/petstore/aspnetcore-3.1/.openapi-generator/FILES new file mode 100644 index 000000000000..4de0e6417904 --- /dev/null +++ b/samples/server/petstore/aspnetcore-3.1/.openapi-generator/FILES @@ -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 diff --git a/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/Filters/BasePathFilter.cs b/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/Filters/BasePathFilter.cs index 7b39888d460c..a23854510764 100644 --- a/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/Filters/BasePathFilter.cs +++ b/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/Filters/BasePathFilter.cs @@ -6,7 +6,7 @@ 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 @@ public BasePathFilter(string basePath) } /// <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); } } } diff --git a/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/Filters/GeneratePathParamsValidationFilter.cs b/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/Filters/GeneratePathParamsValidationFilter.cs index 823aa34de41f..5c43aa69751d 100644 --- a/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/Filters/GeneratePathParamsValidationFilter.cs +++ b/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/Filters/GeneratePathParamsValidationFilter.cs @@ -22,20 +22,20 @@ public void Apply(OpenApiOperation operation, OperationFilterContext context) 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 @@ public void Apply(OpenApiOperation operation, OperationFilterContext context) 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 @@ public void Apply(OpenApiOperation operation, OperationFilterContext context) 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 @@ public void Apply(OpenApiOperation operation, OperationFilterContext context) 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; } } } diff --git a/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/Org.OpenAPITools.csproj b/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/Org.OpenAPITools.csproj index 913f389801c2..54f4db079bc1 100644 --- a/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/Org.OpenAPITools.csproj +++ b/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/Org.OpenAPITools.csproj @@ -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> diff --git a/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/Properties/launchSettings.json b/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/Properties/launchSettings.json index 57b03cc43aa3..99cfeea4b919 100644 --- a/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/Properties/launchSettings.json +++ b/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/Properties/launchSettings.json @@ -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 } } -} \ No newline at end of file +} diff --git a/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/Startup.cs b/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/Startup.cs index 8ec6617ac151..dea163f26018 100644 --- a/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/Startup.cs +++ b/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/Startup.cs @@ -97,10 +97,10 @@ public void ConfigureServices(IServiceCollection services) }); 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 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 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(); diff --git a/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/wwwroot/index.html b/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/wwwroot/index.html index cde1f2f90b92..f3318bc90a11 100644 --- a/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/wwwroot/index.html +++ b/samples/server/petstore/aspnetcore-3.1/src/Org.OpenAPITools/wwwroot/index.html @@ -1 +1 @@ -<meta http-equiv="refresh" content="0;URL='./swagger/'" /> \ No newline at end of file +<meta http-equiv="refresh" content="0;URL='./openapi/'" /> diff --git a/samples/server/petstore/aspnetcore/.openapi-generator/FILES b/samples/server/petstore/aspnetcore/.openapi-generator/FILES new file mode 100644 index 000000000000..81b978877b1d --- /dev/null +++ b/samples/server/petstore/aspnetcore/.openapi-generator/FILES @@ -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