forked from loafle/openapi-generator-original
[csharp-netcore] Fix handling of Dictionary query parameters and fix deepObject style parameter handling (#8848)
* DeepObject also for required parameters * Fix NullPointerException on inline deepObject such as a Dictionary<string, string> * Add deepObject in ParameterToMultiMap for deepObjects without explicit parameters * Add some context to TODOs * ParameterToMultiMap fixed in CSharp template for OAS 3 Dicts, taking deepObject into account * Remove added whitespace * Update samples
This commit is contained in:
@@ -4196,7 +4196,8 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
// https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#user-content-parameterexplode
|
||||
codegenParameter.isExplode = parameter.getExplode() == null ? false : parameter.getExplode();
|
||||
|
||||
// TODO revise collectionFormat
|
||||
// TODO revise collectionFormat, default collection format in OAS 3 appears to multi at least for query parameters
|
||||
// https://swagger.io/docs/specification/serialization/
|
||||
String collectionFormat = null;
|
||||
if (ModelUtils.isArraySchema(parameterSchema)) { // for array parameter
|
||||
final ArraySchema arraySchema = (ArraySchema) parameterSchema;
|
||||
@@ -4352,14 +4353,21 @@ public class DefaultCodegen implements CodegenConfig {
|
||||
if (codegenParameter.isQueryParam && codegenParameter.isDeepObject) {
|
||||
Schema schema = ModelUtils.getSchema(openAPI, codegenParameter.dataType);
|
||||
codegenParameter.items = fromProperty(codegenParameter.paramName, schema);
|
||||
Map<String, Schema<?>> properties = schema.getProperties();
|
||||
codegenParameter.items.vars =
|
||||
properties.entrySet().stream()
|
||||
.map(entry -> {
|
||||
CodegenProperty property = fromProperty(entry.getKey(), entry.getValue());
|
||||
property.baseName = codegenParameter.baseName + "[" + entry.getKey() + "]";
|
||||
return property;
|
||||
}).collect(Collectors.toList());
|
||||
// TODO Check why schema is actually null for a schema of type object defined inline
|
||||
// https://swagger.io/docs/specification/serialization/
|
||||
if(schema != null) {
|
||||
Map<String, Schema<?>> properties = schema.getProperties();
|
||||
codegenParameter.items.vars =
|
||||
properties.entrySet().stream()
|
||||
.map(entry -> {
|
||||
CodegenProperty property = fromProperty(entry.getKey(), entry.getValue());
|
||||
property.baseName = codegenParameter.baseName + "[" + entry.getKey() + "]";
|
||||
return property;
|
||||
}).collect(Collectors.toList());
|
||||
}
|
||||
else {
|
||||
LOGGER.warn("No object schema found for deepObject parameter" + codegenParameter + " deepObject won't have specific properties");
|
||||
}
|
||||
}
|
||||
|
||||
// set the parameter example value
|
||||
|
||||
@@ -63,6 +63,21 @@ namespace {{packageName}}.Client
|
||||
parameters.Add(name, ParameterToString(item));
|
||||
}
|
||||
}
|
||||
else if (value is IDictionary dictionary)
|
||||
{
|
||||
if(collectionFormat == "deepObject") {
|
||||
foreach (DictionaryEntry entry in dictionary)
|
||||
{
|
||||
parameters.Add(name + "[" + entry.Key + "]", ParameterToString(entry.Value));
|
||||
}
|
||||
}
|
||||
else {
|
||||
foreach (DictionaryEntry entry in dictionary)
|
||||
{
|
||||
parameters.Add(entry.Key.ToString(), ParameterToString(entry.Value));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
parameters.Add(name, ParameterToString(value));
|
||||
|
||||
@@ -280,7 +280,17 @@ namespace {{packageName}}.{{apiPackage}}
|
||||
{{/pathParams}}
|
||||
{{#queryParams}}
|
||||
{{#required}}
|
||||
{{#isDeepObject}}
|
||||
{{#items.vars}}
|
||||
localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}}.{{name}}));
|
||||
{{/items.vars}}
|
||||
{{^items}}
|
||||
localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("deepObject", "{{baseName}}", {{paramName}}));
|
||||
{{/items}}
|
||||
{{/isDeepObject}}
|
||||
{{^isDeepObject}}
|
||||
localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}}));
|
||||
{{/isDeepObject}}
|
||||
{{/required}}
|
||||
{{^required}}
|
||||
if ({{paramName}} != null)
|
||||
@@ -292,6 +302,9 @@ namespace {{packageName}}.{{apiPackage}}
|
||||
localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}}.{{name}}));
|
||||
}
|
||||
{{/items.vars}}
|
||||
{{^items}}
|
||||
localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("deepObject", "{{baseName}}", {{paramName}}));
|
||||
{{/items}}
|
||||
{{/isDeepObject}}
|
||||
{{^isDeepObject}}
|
||||
localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}}));
|
||||
|
||||
@@ -67,6 +67,21 @@ namespace Org.OpenAPITools.Client
|
||||
parameters.Add(name, ParameterToString(item));
|
||||
}
|
||||
}
|
||||
else if (value is IDictionary dictionary)
|
||||
{
|
||||
if(collectionFormat == "deepObject") {
|
||||
foreach (DictionaryEntry entry in dictionary)
|
||||
{
|
||||
parameters.Add(name + "[" + entry.Key + "]", ParameterToString(entry.Value));
|
||||
}
|
||||
}
|
||||
else {
|
||||
foreach (DictionaryEntry entry in dictionary)
|
||||
{
|
||||
parameters.Add(entry.Key.ToString(), ParameterToString(entry.Value));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
parameters.Add(name, ParameterToString(value));
|
||||
|
||||
@@ -67,6 +67,21 @@ namespace Org.OpenAPITools.Client
|
||||
parameters.Add(name, ParameterToString(item));
|
||||
}
|
||||
}
|
||||
else if (value is IDictionary dictionary)
|
||||
{
|
||||
if(collectionFormat == "deepObject") {
|
||||
foreach (DictionaryEntry entry in dictionary)
|
||||
{
|
||||
parameters.Add(name + "[" + entry.Key + "]", ParameterToString(entry.Value));
|
||||
}
|
||||
}
|
||||
else {
|
||||
foreach (DictionaryEntry entry in dictionary)
|
||||
{
|
||||
parameters.Add(entry.Key.ToString(), ParameterToString(entry.Value));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
parameters.Add(name, ParameterToString(value));
|
||||
|
||||
@@ -67,6 +67,21 @@ namespace Org.OpenAPITools.Client
|
||||
parameters.Add(name, ParameterToString(item));
|
||||
}
|
||||
}
|
||||
else if (value is IDictionary dictionary)
|
||||
{
|
||||
if(collectionFormat == "deepObject") {
|
||||
foreach (DictionaryEntry entry in dictionary)
|
||||
{
|
||||
parameters.Add(name + "[" + entry.Key + "]", ParameterToString(entry.Value));
|
||||
}
|
||||
}
|
||||
else {
|
||||
foreach (DictionaryEntry entry in dictionary)
|
||||
{
|
||||
parameters.Add(entry.Key.ToString(), ParameterToString(entry.Value));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
parameters.Add(name, ParameterToString(value));
|
||||
|
||||
@@ -67,6 +67,21 @@ namespace Org.OpenAPITools.Client
|
||||
parameters.Add(name, ParameterToString(item));
|
||||
}
|
||||
}
|
||||
else if (value is IDictionary dictionary)
|
||||
{
|
||||
if(collectionFormat == "deepObject") {
|
||||
foreach (DictionaryEntry entry in dictionary)
|
||||
{
|
||||
parameters.Add(name + "[" + entry.Key + "]", ParameterToString(entry.Value));
|
||||
}
|
||||
}
|
||||
else {
|
||||
foreach (DictionaryEntry entry in dictionary)
|
||||
{
|
||||
parameters.Add(entry.Key.ToString(), ParameterToString(entry.Value));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
parameters.Add(name, ParameterToString(value));
|
||||
|
||||
Reference in New Issue
Block a user