diff --git a/DevProxy.Plugins/Generation/OpenApiSpecGeneratorPlugin.cs b/DevProxy.Plugins/Generation/OpenApiSpecGeneratorPlugin.cs index 7787a3ea..255b2a5d 100644 --- a/DevProxy.Plugins/Generation/OpenApiSpecGeneratorPlugin.cs +++ b/DevProxy.Plugins/Generation/OpenApiSpecGeneratorPlugin.cs @@ -9,6 +9,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Microsoft.OpenApi; +using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; @@ -56,6 +57,7 @@ public sealed class OpenApiSpecGeneratorPluginConfiguration public SpecFormat SpecFormat { get; set; } = SpecFormat.Json; public SpecVersion SpecVersion { get; set; } = SpecVersion.v3_0; public bool IgnoreResponseTypes { get; set; } + public IEnumerable IncludeParameters { get; set; } = []; } public sealed class OpenApiSpecGeneratorPlugin( @@ -319,21 +321,35 @@ private void SetParametersFromQueryString(OpenApiOperation operation, NameValueC } Logger.LogDebug(" Processing query string parameters..."); -#pragma warning disable IDE0004 - var dictionary = (queryParams.AllKeys as string[]).ToDictionary(k => k, k => queryParams[k] as object); -#pragma warning restore IDE0004 + var dictionary = queryParams.AllKeys + .Where(k => k is not null).Cast() + .ToDictionary(k => k, k => queryParams[k] as object); - foreach (var parameter in dictionary) + foreach (var (key, value) in dictionary) { - operation.Parameters.Add(new() + var isRequired = Configuration.IncludeParameters.Any(p => string.Equals(p, key, StringComparison.Ordinal)); + + OpenApiParameter parameter = new() { - Name = parameter.Key, + Name = key, In = ParameterLocation.Query, - Required = false, + Required = isRequired, Schema = new() { Type = "string" } - }); - Logger.LogDebug(" Added query string parameter {ParameterKey}", parameter.Key); + }; + SetParameterDefault(parameter, value); + + operation.Parameters.Add(parameter); + Logger.LogDebug(" Added query string parameter {ParameterKey}", key); + } + } + + private static void SetParameterDefault(OpenApiParameter parameter, object? value) + { + if (!parameter.Required || value is null) + { + return; } + parameter.Schema.Default = new OpenApiString(value.ToString()); } private void SetResponseFromSession(OpenApiOperation operation, Response response) diff --git a/schemas/v1.0.0/openapispecgeneratorplugin.schema.json b/schemas/v1.0.0/openapispecgeneratorplugin.schema.json index 77fe414f..53d5be29 100644 --- a/schemas/v1.0.0/openapispecgeneratorplugin.schema.json +++ b/schemas/v1.0.0/openapispecgeneratorplugin.schema.json @@ -30,6 +30,14 @@ "Yaml" ], "description": "Specifies the format of the generated OpenAPI spec. Allowed values: 'Json' or 'Yaml'. Default: 'Json'." + }, + "includeParameters": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines the list of query string parameters to include in the generated OpenAPI spec, along with their default values. Default: []", + "default": [] } }, "additionalProperties": false