From b882612a5dff6936cd859c51c814fba35fc7cd2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20M=C3=BCller?= Date: Fri, 22 Nov 2024 18:33:16 +0100 Subject: [PATCH] feat(core): add override for info object on grouped api Co-authored-by: Timon Back --- .../grouping/AsyncApiGroupService.java | 35 +++++++++++++++---- .../configuration/docket/AsyncApiGroup.java | 3 ++ .../docket/DefaultAsyncApiDocketService.java | 7 +++- .../SpringwolfConfigProperties.java | 7 ++++ .../grouping/AsyncApiGroupServiceTest.java | 28 +++++++++++++++ 5 files changed, 73 insertions(+), 7 deletions(-) diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/grouping/AsyncApiGroupService.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/grouping/AsyncApiGroupService.java index 856214cba..f61a6a7e3 100644 --- a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/grouping/AsyncApiGroupService.java +++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/grouping/AsyncApiGroupService.java @@ -2,6 +2,7 @@ package io.github.springwolf.core.asyncapi.grouping; import io.github.springwolf.asyncapi.v3.model.AsyncAPI; +import io.github.springwolf.asyncapi.v3.model.info.Info; import io.github.springwolf.core.configuration.docket.AsyncApiGroup; import io.github.springwolf.core.configuration.properties.SpringwolfConfigProperties; import lombok.RequiredArgsConstructor; @@ -14,6 +15,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import static io.github.springwolf.core.configuration.docket.DefaultAsyncApiDocketService.mapInfo; + @Slf4j @RequiredArgsConstructor public class AsyncApiGroupService { @@ -22,7 +25,11 @@ public class AsyncApiGroupService { public Map group(AsyncAPI asyncAPI) { return getAsyncApiGroups() - .map(group -> Map.entry(group.getGroupName(), groupingService.groupAPI(asyncAPI, group))) + .map(group -> { + AsyncAPI groupedApi = groupingService.groupAPI(asyncAPI, group); + groupedApi.setInfo(merge(groupedApi.getInfo(), group.getGroupInfo())); + return Map.entry(group.getGroupName(), groupedApi); + }) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); } @@ -43,18 +50,19 @@ private static AsyncApiGroup toGroupConfigAndValidate(SpringwolfConfigProperties } int allItemCount = group.getActionToMatch().size() - + group.getChannelNameToMatch().size() - + group.getMessageNameToMatch().size(); + + group.getChannelNameToMatch().size() + + group.getMessageNameToMatch().size(); if (allItemCount != 0 - && group.getActionToMatch().size() != allItemCount - && channelNameToMatch.size() != allItemCount - && messageNameToMatch.size() != allItemCount) { + && group.getActionToMatch().size() != allItemCount + && channelNameToMatch.size() != allItemCount + && messageNameToMatch.size() != allItemCount) { throw new IllegalArgumentException( "AsyncApiGroup %s must specify at most one filter criteria".formatted(groupName)); } AsyncApiGroup asyncApiGroup = AsyncApiGroup.builder() .groupName(groupName) + .groupInfo(mapInfo(group.getInfo())) .operationActionsToKeep(group.getActionToMatch()) .channelNamesToKeep(channelNameToMatch) .messageNamesToKeep(messageNameToMatch) @@ -62,4 +70,19 @@ private static AsyncApiGroup toGroupConfigAndValidate(SpringwolfConfigProperties log.debug("Loaded AsyncApiGroup from configuration: {}", asyncApiGroup); return asyncApiGroup; } + + public static Info merge(Info original, Info updates) { + return Info.builder() + .title(updates.getTitle() != null ? updates.getTitle() : original.getTitle()) + .version(updates.getVersion() != null ? updates.getVersion() : original.getVersion()) + .description(updates.getDescription() != null ? updates.getDescription() : original.getDescription()) + .termsOfService(updates.getTermsOfService() != null ? updates.getTermsOfService() : original.getTermsOfService()) + .contact(updates.getContact() != null ? updates.getContact() : original.getContact()) + .license(updates.getLicense() != null ? updates.getLicense() : original.getLicense()) + .tags(updates.getTags() != null ? updates.getTags() : original.getTags()) + .externalDocs(updates.getExternalDocs() != null ? updates.getExternalDocs() : original.getExternalDocs()) + // TODO fixme + //.extensionFields(updates.getExtensionFields() != null ? updates.getExtensionFields() : original.getExtensionFields()) + .build(); + } } diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/configuration/docket/AsyncApiGroup.java b/springwolf-core/src/main/java/io/github/springwolf/core/configuration/docket/AsyncApiGroup.java index 60b97c28e..f9a54bbdf 100644 --- a/springwolf-core/src/main/java/io/github/springwolf/core/configuration/docket/AsyncApiGroup.java +++ b/springwolf-core/src/main/java/io/github/springwolf/core/configuration/docket/AsyncApiGroup.java @@ -3,6 +3,7 @@ import io.github.springwolf.asyncapi.v3.model.channel.ChannelObject; import io.github.springwolf.asyncapi.v3.model.channel.message.MessageObject; +import io.github.springwolf.asyncapi.v3.model.info.Info; import io.github.springwolf.asyncapi.v3.model.operation.Operation; import io.github.springwolf.asyncapi.v3.model.operation.OperationAction; import lombok.AllArgsConstructor; @@ -23,6 +24,8 @@ public class AsyncApiGroup { private final String groupName; + private final Info groupInfo; + @Builder.Default private final List operationActionsToKeep = Collections.emptyList(); diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/configuration/docket/DefaultAsyncApiDocketService.java b/springwolf-core/src/main/java/io/github/springwolf/core/configuration/docket/DefaultAsyncApiDocketService.java index a4d938ae0..4b7fe795c 100644 --- a/springwolf-core/src/main/java/io/github/springwolf/core/configuration/docket/DefaultAsyncApiDocketService.java +++ b/springwolf-core/src/main/java/io/github/springwolf/core/configuration/docket/DefaultAsyncApiDocketService.java @@ -63,6 +63,12 @@ private static Info buildInfo(@Nullable SpringwolfConfigProperties.ConfigDocket. + " is not set."); } + Info asyncapiInfo = mapInfo(configDocketInfo); + + return asyncapiInfo; + } + + public static Info mapInfo(SpringwolfConfigProperties.ConfigDocket.Info configDocketInfo) { Info asyncapiInfo = Info.builder() .version(configDocketInfo.getVersion()) .title(configDocketInfo.getTitle()) @@ -76,7 +82,6 @@ private static Info buildInfo(@Nullable SpringwolfConfigProperties.ConfigDocket. Map extFieldsMap = Map.copyOf(configDocketInfo.getExtensionFields()); asyncapiInfo.setExtensionFields(extFieldsMap); } - return asyncapiInfo; } diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/configuration/properties/SpringwolfConfigProperties.java b/springwolf-core/src/main/java/io/github/springwolf/core/configuration/properties/SpringwolfConfigProperties.java index 4f5089d12..28e80a5c8 100644 --- a/springwolf-core/src/main/java/io/github/springwolf/core/configuration/properties/SpringwolfConfigProperties.java +++ b/springwolf-core/src/main/java/io/github/springwolf/core/configuration/properties/SpringwolfConfigProperties.java @@ -226,6 +226,13 @@ public static class Group { * The message names to match */ private List messageNameToMatch = Collections.emptyList(); + + /** + * Allows to override the info object with group specific information . + * + * @see Info + */ + private Info info; } } diff --git a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/grouping/AsyncApiGroupServiceTest.java b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/grouping/AsyncApiGroupServiceTest.java index da2db11c3..bbcafa143 100644 --- a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/grouping/AsyncApiGroupServiceTest.java +++ b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/grouping/AsyncApiGroupServiceTest.java @@ -2,6 +2,7 @@ package io.github.springwolf.core.asyncapi.grouping; import io.github.springwolf.asyncapi.v3.model.AsyncAPI; +import io.github.springwolf.asyncapi.v3.model.info.Info; import io.github.springwolf.asyncapi.v3.model.operation.OperationAction; import io.github.springwolf.core.configuration.docket.AsyncApiGroup; import io.github.springwolf.core.configuration.properties.SpringwolfConfigProperties; @@ -174,4 +175,31 @@ void shouldGroupByMessage() { Pattern actualPattern = capturedGroup.getMessageNamesToKeep().get(0); assertThat(actualPattern.pattern()).isEqualTo(messages.get(0)); } + + @Test + void shouldCustomizeInfoObject() { + // given + SpringwolfConfigProperties.ConfigDocket.Group group = new SpringwolfConfigProperties.ConfigDocket.Group(); + group.setGroup("group1"); + + SpringwolfConfigProperties.ConfigDocket.Info groupInfo = new SpringwolfConfigProperties.ConfigDocket.Info(); + groupInfo.setVersion("1.2.3"); + groupInfo.setDescription("description-override"); + + group.setInfo(groupInfo); + + when(configDocket.getGroupConfigs()).thenReturn(List.of(group)); + Info originalInfo = new Info(); + originalInfo.setDescription("description-original"); + when(groupedAsyncApi.getInfo()).thenReturn(originalInfo); + + // when + Map result = asyncApiGroupService.group(asyncAPI); + + // then + Info expectedInfo = new Info(); + expectedInfo.setVersion("1.2.3"); + expectedInfo.setDescription("description-override"); + verify(groupedAsyncApi).setInfo(expectedInfo); + } }