diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java index 66b85ff9e81a..378cee272b10 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java @@ -80,6 +80,11 @@ public class OpenAPINormalizer { final String SET_TAGS_FOR_ALL_OPERATIONS = "SET_TAGS_FOR_ALL_OPERATIONS"; String setTagsForAllOperations; + // when set to true, tags in all operations will be set to operationId or "default" if operationId + // is empty + final String SET_TAGS_TO_OPERATIONID = "SET_TAGS_TO_OPERATIONID"; + String setTagsToOperationId; + // when set to true, auto fix integer with maximum value 4294967295 (2^32-1) or long with 18446744073709551615 (2^64-1) // by adding x-unsigned to the schema final String ADD_UNSIGNED_TO_INTEGER_WITH_INVALID_MAX_VALUE = "ADD_UNSIGNED_TO_INTEGER_WITH_INVALID_MAX_VALUE"; @@ -117,6 +122,7 @@ public OpenAPINormalizer(OpenAPI openAPI, Map inputRules) { ruleNames.add(SIMPLIFY_BOOLEAN_ENUM); ruleNames.add(KEEP_ONLY_FIRST_TAG_IN_OPERATION); ruleNames.add(SET_TAGS_FOR_ALL_OPERATIONS); + ruleNames.add(SET_TAGS_TO_OPERATIONID); ruleNames.add(ADD_UNSIGNED_TO_INTEGER_WITH_INVALID_MAX_VALUE); ruleNames.add(REFACTOR_ALLOF_WITH_PROPERTIES_ONLY); ruleNames.add(NORMALIZE_31SPEC); @@ -233,6 +239,8 @@ private void normalizeOperation(Operation operation) { processKeepOnlyFirstTagInOperation(operation); processSetTagsForAllOperations(operation); + + processSetTagsToOperationId(operation); } /** @@ -619,6 +627,24 @@ private void processSetTagsForAllOperations(Operation operation) { operation.addTagsItem(setTagsForAllOperations); } + /** + * Set the tag name to operationId (or "default" if operationId is empty) + * + * @param operation Operation + */ + private void processSetTagsToOperationId(Operation operation) { + if (!getRule(SET_TAGS_TO_OPERATIONID)) { + return; + } + + operation.setTags(null); + if (StringUtils.isNotEmpty(operation.getOperationId())) { + operation.addTagsItem(operation.getOperationId()); + } else { // default to "default" if operationId is empty + operation.addTagsItem("default"); + } + } + /** * If the schema contains anyOf/oneOf and properties, remove oneOf/anyOf as these serve as rules to * ensure inter-dependency between properties. It's a workaround as such validation is not supported at the moment. diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/OpenAPINormalizerTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/OpenAPINormalizerTest.java index 28f6abf540e9..6bf5bdf1eee5 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/OpenAPINormalizerTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/OpenAPINormalizerTest.java @@ -242,6 +242,24 @@ public void testOpenAPINormalizerSetTagsInAllOperations() { assertEquals(openAPI.getPaths().get("/person/display/{personId}").getDelete().getTags().get(0), "core"); } + @Test + public void testOpenAPINormalizerSetTagsToOperationId() { + OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/enableKeepOnlyFirstTagInOperation_test.yaml"); + + assertEquals(openAPI.getPaths().get("/person/display/{personId}").getGet().getTags().size(), 2); + assertEquals(openAPI.getPaths().get("/person/display/{personId}").getDelete().getTags().size(), 1); + + Map options = new HashMap<>(); + options.put("SET_TAGS_TO_OPERATIONID", "true"); + OpenAPINormalizer openAPINormalizer = new OpenAPINormalizer(openAPI, options); + openAPINormalizer.normalize(); + + assertEquals(openAPI.getPaths().get("/person/display/{personId}").getGet().getTags().size(), 1); + assertEquals(openAPI.getPaths().get("/person/display/{personId}").getDelete().getTags().size(), 1); + assertEquals(openAPI.getPaths().get("/person/display/{personId}").getGet().getTags().get(0), "list"); + assertEquals(openAPI.getPaths().get("/person/display/{personId}").getDelete().getTags().get(0), "delete"); + } + @Test public void testAddUnsignedToIntegerWithInvalidMaxValue() { OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/addUnsignedToIntegerWithInvalidMaxValue_test.yaml");