Skip to content

Commit bf4c98a

Browse files
authored
[go-server] Add ability to handle nullable query param (#17321)
* Update * Regen
1 parent 864c0db commit bf4c98a

File tree

21 files changed

+1138
-307
lines changed

21 files changed

+1138
-307
lines changed

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoServerCodegen.java

Lines changed: 55 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
import java.io.File;
3232
import java.util.*;
3333

34+
import static org.openapitools.codegen.utils.StringUtils.camelize;
35+
3436
public class GoServerCodegen extends AbstractGoCodegen {
3537

3638
/**
@@ -322,34 +324,77 @@ public ModelsMap postProcessModels(ModelsMap objs) {
322324

323325
@Override
324326
public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<ModelMap> allModels) {
325-
objs = super.postProcessOperationsWithModels(objs, allModels);
327+
// TODO: refactor abstractGoCodegen, decouple go client only code and remove this
326328
OperationMap objectMap = objs.getOperations();
327329
List<CodegenOperation> operations = objectMap.getOperation();
328330

331+
for (CodegenOperation operation : operations) {
332+
// http method verb conversion (e.g. PUT => Put)
333+
operation.httpMethod = camelize(operation.httpMethod.toLowerCase(Locale.ROOT));
334+
}
335+
336+
// remove model imports to avoid error
329337
List<Map<String, String>> imports = objs.getImports();
330338
if (imports == null)
331339
return objs;
332340

333-
// override imports to only include packages for interface parameters
334-
imports.clear();
341+
Iterator<Map<String, String>> iterator = imports.iterator();
342+
while (iterator.hasNext()) {
343+
String _import = iterator.next().get("import");
344+
if (_import.startsWith(apiPackage))
345+
iterator.remove();
346+
}
335347

336348
boolean addedTimeImport = false;
337349
boolean addedOSImport = false;
350+
boolean addedReflectImport = false;
338351
for (CodegenOperation operation : operations) {
339352
for (CodegenParameter param : operation.allParams) {
340353
// import "os" if the operation uses files
341-
if (!addedOSImport && ("*os.File".equals(param.dataType) || ("[]*os.File".equals(param.dataType)))) {
354+
if (!addedOSImport && ("*os.File".equals(param.dataType) || "[]*os.File".equals(param.dataType))) {
342355
imports.add(createMapping("import", "os"));
343356
addedOSImport = true;
344357
}
345358

346-
// import "time" if the operation has a required time parameter
347-
if (param.required) {
348-
if (!addedTimeImport && "time.Time".equals(param.dataType)) {
349-
imports.add(createMapping("import", "time"));
350-
addedTimeImport = true;
351-
}
359+
// import "time" if the operation has a time parameter.
360+
if (!addedTimeImport && "time.Time".equals(param.dataType)) {
361+
imports.add(createMapping("import", "time"));
362+
addedTimeImport = true;
363+
}
364+
365+
// import "reflect" package if the parameter is collectionFormat=multi
366+
if (!addedReflectImport && param.isCollectionFormatMulti) {
367+
imports.add(createMapping("import", "reflect"));
368+
addedReflectImport = true;
352369
}
370+
371+
// set x-exportParamName
372+
char nameFirstChar = param.paramName.charAt(0);
373+
if (Character.isUpperCase(nameFirstChar)) {
374+
// First char is already uppercase, just use paramName.
375+
param.vendorExtensions.put("x-export-param-name", param.paramName);
376+
} else {
377+
// It's a lowercase first char, let's convert it to uppercase
378+
StringBuilder sb = new StringBuilder(param.paramName);
379+
sb.setCharAt(0, Character.toUpperCase(nameFirstChar));
380+
param.vendorExtensions.put("x-export-param-name", sb.toString());
381+
}
382+
}
383+
384+
}
385+
386+
// recursively add import for mapping one type to multiple imports
387+
List<Map<String, String>> recursiveImports = objs.getImports();
388+
if (recursiveImports == null)
389+
return objs;
390+
391+
ListIterator<Map<String, String>> listIterator = imports.listIterator();
392+
while (listIterator.hasNext()) {
393+
String _import = listIterator.next().get("import");
394+
// if the import package happens to be found in the importMapping (key)
395+
// add the corresponding import package to the list
396+
if (importMapping.containsKey(_import)) {
397+
listIterator.add(createMapping("import", importMapping.get(_import)));
353398
}
354399
}
355400

modules/openapi-generator/src/main/resources/go-server/api.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,5 @@ type {{classname}}Servicer interface { {{#operations}}{{#operation}}
2828
{{#isDeprecated}}
2929
// Deprecated
3030
{{/isDeprecated}}
31-
{{operationId}}(context.Context{{#allParams}}, {{dataType}}{{/allParams}}) (ImplResponse, error){{/operation}}{{/operations}}
31+
{{operationId}}(context.Context{{#allParams}}, {{#isNullable}}*{{/isNullable}}{{dataType}}{{/allParams}}) (ImplResponse, error){{/operation}}{{/operations}}
3232
}{{/apis}}{{/apiInfo}}

0 commit comments

Comments
 (0)