From 03a507b1dcf6728715c718da903bf025bcb3200c Mon Sep 17 00:00:00 2001 From: rchen9 Date: Thu, 27 Jun 2024 15:51:33 +0800 Subject: [PATCH 1/2] feat: query compareConfig with operationName --- .../config/ComparisonSummaryController.java | 9 ++ .../replay/ComparisonSummaryService.java | 109 ++++++++++++------ .../replay/QueryCompareConfigRequestType.java | 14 +++ pom.xml | 2 +- 4 files changed, 100 insertions(+), 34 deletions(-) create mode 100644 arex-web-model-contract/src/main/java/com/arextest/web/model/contract/contracts/config/replay/QueryCompareConfigRequestType.java diff --git a/arex-web-api/src/main/java/com/arextest/web/api/service/controller/config/ComparisonSummaryController.java b/arex-web-api/src/main/java/com/arextest/web/api/service/controller/config/ComparisonSummaryController.java index 78ff2d2a..5b6a6ee4 100644 --- a/arex-web-api/src/main/java/com/arextest/web/api/service/controller/config/ComparisonSummaryController.java +++ b/arex-web-api/src/main/java/com/arextest/web/api/service/controller/config/ComparisonSummaryController.java @@ -4,6 +4,7 @@ import com.arextest.common.utils.ResponseUtils; import com.arextest.web.core.business.config.replay.ComparisonSummaryService; import com.arextest.web.model.contract.contracts.config.replay.ComparisonSummaryConfiguration; +import com.arextest.web.model.contract.contracts.config.replay.QueryCompareConfigRequestType; import com.arextest.web.model.contract.contracts.config.replay.QueryConfigOfCategoryRequestType; import com.arextest.web.model.contract.contracts.config.replay.ReplayCompareConfig; import javax.annotation.Resource; @@ -55,4 +56,12 @@ public Response queryConfigOfCategory(@RequestBody QueryConfigOfCategoryRequestT ); } + @PostMapping("/queryCompareConfig") + @ResponseBody + public Response queryCompareConfig(@RequestBody QueryCompareConfigRequestType request) { + ReplayCompareConfig replayCompareConfig = comparisonSummaryService.getReplayComparisonConfig( + request.getAppId(), request.getOperationName()); + return ResponseUtils.successResponse(replayCompareConfig); + } + } \ No newline at end of file diff --git a/arex-web-core/src/main/java/com/arextest/web/core/business/config/replay/ComparisonSummaryService.java b/arex-web-core/src/main/java/com/arextest/web/core/business/config/replay/ComparisonSummaryService.java index c716af45..715b9d4e 100644 --- a/arex-web-core/src/main/java/com/arextest/web/core/business/config/replay/ComparisonSummaryService.java +++ b/arex-web-core/src/main/java/com/arextest/web/core/business/config/replay/ComparisonSummaryService.java @@ -47,6 +47,7 @@ import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -106,39 +107,7 @@ public ComparisonSummaryConfiguration getComparisonDetailsSummary(String interfa } public ReplayCompareConfig getReplayComparisonConfig(String appId) { - ReplayCompareConfig result = new ReplayCompareConfig(); - // store all config items, key is operationId and null, the null for global config - Map replayComparisonItemMap; - - // build operation config and global config - AppOperationAndDependencyInfo appOperationAndDependencyInfo = this.getOperationInfos(appId); - Map operationInfoMap = - appOperationAndDependencyInfo.getOperationMap(); - Map> appContractDtoMap = - appOperationAndDependencyInfo.getAppContractDtoMap(); - replayComparisonItemMap = this.buildMultiConfiguration(appId, operationInfoMap, - appContractDtoMap); - - // merge global config to all operation config - this.mergeGlobalComparisonConfig(replayComparisonItemMap, operationInfoMap, appContractDtoMap); - - // build global config - ReplayCompareConfig.GlobalComparisonItem globalComparisonItem = new ReplayCompareConfig.GlobalComparisonItem(); - ReplayCompareConfig.ReplayComparisonItem replayComparisonItem = replayComparisonItemMap.get( - null); - if (replayComparisonItem != null) { - BeanUtils.copyProperties(replayComparisonItem, globalComparisonItem); - result.setGlobalComparisonItem(globalComparisonItem); - } - - ReplayComparisonItem globalReplayComparison = replayComparisonItemMap.get(null); - List operationReplayComparison = replayComparisonItemMap.entrySet() - .stream() - .filter(item -> Objects.nonNull(item.getKey())).map(Entry::getValue) - .collect(Collectors.toList()); - result.setReplayComparisonItems(operationReplayComparison); - this.setDefaultWhenMissingDependency(globalReplayComparison, result); - return result; + return getReplayComparisonConfig(appId, null); } public QueryConfigOfCategoryResponseType queryConfigOfCategory( @@ -189,7 +158,45 @@ public QueryConfigOfCategoryResponseType queryConfigOfCategory( return responseType; } + public ReplayCompareConfig getReplayComparisonConfig(String appId, String operationName) { + ReplayCompareConfig result = new ReplayCompareConfig(); + // store all config items, key is operationId and null, the null for global config + Map replayComparisonItemMap; + + // build operation config and global config + AppOperationAndDependencyInfo appOperationAndDependencyInfo = this.getOperationInfos(appId); + this.filterOperationInfo(appOperationAndDependencyInfo, operationName); + + Map operationInfoMap = + appOperationAndDependencyInfo.getOperationMap(); + Map> appContractDtoMap = + appOperationAndDependencyInfo.getAppContractDtoMap(); + replayComparisonItemMap = this.buildMultiConfiguration(appId, operationInfoMap, + appContractDtoMap); + + // merge global config to all operation config + this.mergeGlobalComparisonConfig(replayComparisonItemMap, operationInfoMap, appContractDtoMap); + + // build global config + ReplayCompareConfig.GlobalComparisonItem globalComparisonItem = new ReplayCompareConfig.GlobalComparisonItem(); + ReplayCompareConfig.ReplayComparisonItem replayComparisonItem = replayComparisonItemMap.get( + null); + if (replayComparisonItem != null) { + BeanUtils.copyProperties(replayComparisonItem, globalComparisonItem); + result.setGlobalComparisonItem(globalComparisonItem); + } + + ReplayComparisonItem globalReplayComparison = replayComparisonItemMap.get(null); + List operationReplayComparison = replayComparisonItemMap.entrySet() + .stream() + .filter(item -> Objects.nonNull(item.getKey())).map(Entry::getValue) + .collect(Collectors.toList()); + result.setReplayComparisonItems(operationReplayComparison); + this.setDefaultWhenMissingDependency(globalReplayComparison, result); + return result; + } + // region query compareconfig of interface protected void getComparisonExclusionsConfiguration(String interfaceId, ComparisonSummaryConfiguration comparisonSummaryConfiguration) { Set> exclusionSet = new HashSet<>(); @@ -245,6 +252,36 @@ protected void getComparisonReferenceConfiguration(String interfaceId, protected void getAdditionalComparisonConfiguration(String interfaceId, ComparisonSummaryConfiguration comparisonSummaryConfiguration) { } + // endregion + + protected void filterOperationInfo(AppOperationAndDependencyInfo appOperationAndDependencyInfo, + String operationName) { + if (StringUtils.isEmpty(operationName)) { + return; + } + + // filter operation info + Map operationMap = appOperationAndDependencyInfo.getOperationMap(); + Map filteredOperationMap = new HashMap<>(); + for (Map.Entry entry : operationMap.entrySet()) { + if (Objects.equals(entry.getValue().getOperationName(), operationName)) { + filteredOperationMap.put(entry.getKey(), entry.getValue()); + } + } + appOperationAndDependencyInfo.setOperationMap(filteredOperationMap); + + // filter dependency info + Set operationIds = filteredOperationMap.keySet(); + Map> appContractDtoMap = appOperationAndDependencyInfo.getAppContractDtoMap(); + Map> filteredAppContractDtoMap = new HashMap<>(); + for (String operationId : operationIds) { + Map dependencyAppContract = appContractDtoMap.get(operationId); + if (dependencyAppContract != null) { + filteredAppContractDtoMap.put(operationId, dependencyAppContract); + } + } + appOperationAndDependencyInfo.setAppContractDtoMap(filteredAppContractDtoMap); + } protected Map buildMultiConfiguration( String appId, @@ -397,6 +434,12 @@ protected void buildCompariso new ReplayCompareConfig.ReplayComparisonItem()); tempReplayComparisonItem.setOperationId(operationId); ApplicationOperationConfiguration operationConfiguration = operationMap.get(operationId); + + // not the config of global and not exist in the list of operations + if (operationId != null && operationConfiguration == null) { + continue; + } + if (operationConfiguration != null) { tempReplayComparisonItem .setOperationTypes(new ArrayList<>(operationConfiguration.getOperationTypes())); diff --git a/arex-web-model-contract/src/main/java/com/arextest/web/model/contract/contracts/config/replay/QueryCompareConfigRequestType.java b/arex-web-model-contract/src/main/java/com/arextest/web/model/contract/contracts/config/replay/QueryCompareConfigRequestType.java new file mode 100644 index 00000000..e63fe7d8 --- /dev/null +++ b/arex-web-model-contract/src/main/java/com/arextest/web/model/contract/contracts/config/replay/QueryCompareConfigRequestType.java @@ -0,0 +1,14 @@ +package com.arextest.web.model.contract.contracts.config.replay; + +import javax.validation.constraints.NotBlank; +import lombok.Data; + +@Data +public class QueryCompareConfigRequestType { + + @NotBlank(message = "appId can not be blank") + private String appId; + + private String operationName; + +} diff --git a/pom.xml b/pom.xml index 9ba6c3cd..8cf88a7f 100644 --- a/pom.xml +++ b/pom.xml @@ -495,7 +495,7 @@ - 0.6.4.12 + 0.6.4.13 0.1.28 0.0.1 1.2.7 From 0b38ba5cbe903d2dcd581e65a1f32d80ffbe9113 Mon Sep 17 00:00:00 2001 From: rchen9 Date: Fri, 28 Jun 2024 13:14:36 +0800 Subject: [PATCH 2/2] feat: query compareConfig with operationName --- ...plicationOperationConfigurableHandler.java | 24 +++++++ .../replay/ComparisonSummaryService.java | 64 +++++++++---------- 2 files changed, 56 insertions(+), 32 deletions(-) diff --git a/arex-web-core/src/main/java/com/arextest/web/core/business/config/application/ApplicationOperationConfigurableHandler.java b/arex-web-core/src/main/java/com/arextest/web/core/business/config/application/ApplicationOperationConfigurableHandler.java index 8fa5e59f..0575bb69 100644 --- a/arex-web-core/src/main/java/com/arextest/web/core/business/config/application/ApplicationOperationConfigurableHandler.java +++ b/arex-web-core/src/main/java/com/arextest/web/core/business/config/application/ApplicationOperationConfigurableHandler.java @@ -1,21 +1,28 @@ package com.arextest.web.core.business.config.application; +import com.arextest.config.model.dao.config.ServiceOperationCollection; import com.arextest.config.model.dto.application.ApplicationOperationConfiguration; import com.arextest.config.model.dto.application.Dependency; import com.arextest.config.repository.ConfigRepositoryProvider; import com.arextest.config.repository.impl.ApplicationOperationConfigurationRepositoryImpl; import com.arextest.web.core.business.config.AbstractConfigurableHandler; import com.arextest.web.core.repository.AppContractRepository; +import com.arextest.web.model.dao.mongodb.AppContractCollection; +import com.arextest.web.model.dao.mongodb.AppContractCollection.Fields; import com.arextest.web.model.dto.AppContractDto; import com.arextest.web.model.enums.ContractTypeEnum; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import software.amazon.awssdk.services.sso.endpoints.internal.Value.Str; /** * @author jmo @@ -68,4 +75,21 @@ public ApplicationOperationConfiguration useResultByOperationId(String operation result.setDependencyList(dependencyList); return result; } + + public List queryOperationByName(String appId, + String operationName) { + Map queryConditions = new HashMap<>(2); + queryConditions.put(ServiceOperationCollection.Fields.appId, appId); + if (operationName != null) { + queryConditions.put(ServiceOperationCollection.Fields.operationName, operationName); + } + List applicationOperationConfigurations = + applicationOperationConfigurationRepository.queryByMultiCondition(queryConditions); + if (CollectionUtils.isEmpty(applicationOperationConfigurations)) { + return Collections.emptyList(); + } + return applicationOperationConfigurations; + } + + } diff --git a/arex-web-core/src/main/java/com/arextest/web/core/business/config/replay/ComparisonSummaryService.java b/arex-web-core/src/main/java/com/arextest/web/core/business/config/replay/ComparisonSummaryService.java index 715b9d4e..559bde8e 100644 --- a/arex-web-core/src/main/java/com/arextest/web/core/business/config/replay/ComparisonSummaryService.java +++ b/arex-web-core/src/main/java/com/arextest/web/core/business/config/replay/ComparisonSummaryService.java @@ -7,6 +7,7 @@ import com.arextest.web.common.LogUtils; import com.arextest.web.core.business.ConfigLoadService; import com.arextest.web.core.business.config.ConfigurableHandler; +import com.arextest.web.core.business.config.application.ApplicationOperationConfigurableHandler; import com.arextest.web.core.repository.AppContractRepository; import com.arextest.web.model.contract.contracts.common.enums.ExpirationType; import com.arextest.web.model.contract.contracts.compare.CategoryDetail; @@ -47,7 +48,6 @@ import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -70,6 +70,9 @@ public class ComparisonSummaryService { @Resource ApplicationOperationConfigurationRepositoryImpl applicationOperationConfigurationRepositoryImpl; + @Resource + ApplicationOperationConfigurableHandler applicationOperationConfigurableHandler; + @Resource ConfigLoadService configLoadService; @@ -164,8 +167,8 @@ public ReplayCompareConfig getReplayComparisonConfig(String appId, String operat Map replayComparisonItemMap; // build operation config and global config - AppOperationAndDependencyInfo appOperationAndDependencyInfo = this.getOperationInfos(appId); - this.filterOperationInfo(appOperationAndDependencyInfo, operationName); + AppOperationAndDependencyInfo appOperationAndDependencyInfo = this.getOperationInfos(appId, + operationName); Map operationInfoMap = appOperationAndDependencyInfo.getOperationMap(); @@ -254,35 +257,6 @@ protected void getAdditionalComparisonConfiguration(String interfaceId, } // endregion - protected void filterOperationInfo(AppOperationAndDependencyInfo appOperationAndDependencyInfo, - String operationName) { - if (StringUtils.isEmpty(operationName)) { - return; - } - - // filter operation info - Map operationMap = appOperationAndDependencyInfo.getOperationMap(); - Map filteredOperationMap = new HashMap<>(); - for (Map.Entry entry : operationMap.entrySet()) { - if (Objects.equals(entry.getValue().getOperationName(), operationName)) { - filteredOperationMap.put(entry.getKey(), entry.getValue()); - } - } - appOperationAndDependencyInfo.setOperationMap(filteredOperationMap); - - // filter dependency info - Set operationIds = filteredOperationMap.keySet(); - Map> appContractDtoMap = appOperationAndDependencyInfo.getAppContractDtoMap(); - Map> filteredAppContractDtoMap = new HashMap<>(); - for (String operationId : operationIds) { - Map dependencyAppContract = appContractDtoMap.get(operationId); - if (dependencyAppContract != null) { - filteredAppContractDtoMap.put(operationId, dependencyAppContract); - } - } - appOperationAndDependencyInfo.setAppContractDtoMap(filteredAppContractDtoMap); - } - protected Map buildMultiConfiguration( String appId, Map operationInfoMap, @@ -376,6 +350,7 @@ protected Map buildMultiConfig * @param appId appId * @return Map */ + @Deprecated protected AppOperationAndDependencyInfo getOperationInfos(String appId) { AppOperationAndDependencyInfo appOperationAndDependencyInfo = new AppOperationAndDependencyInfo(); @@ -409,6 +384,31 @@ protected AppOperationAndDependencyInfo getOperationInfos(String appId) { return appOperationAndDependencyInfo; } + protected AppOperationAndDependencyInfo getOperationInfos(String appId, String operationName) { + AppOperationAndDependencyInfo appOperationAndDependencyInfo = new AppOperationAndDependencyInfo(); + + List applicationOperationConfigurations = + applicationOperationConfigurableHandler.queryOperationByName(appId, operationName); + Map operationMap = applicationOperationConfigurations.stream() + .collect(Collectors.toMap(ApplicationOperationConfiguration::getId, Function.identity())); + + List operationIdList = new ArrayList<>(operationMap.keySet()); + // appContractDtoList filter the operation and group by operationId + List appContractDtos = appContractRepository.queryAppContractListByOpIds( + operationIdList, + Collections.singletonList(AppContractCollection.Fields.contract)); + Map> appContractDtoMap = appContractDtos.stream() + .filter( + item -> Objects.equals(item.getContractType(), ContractTypeEnum.DEPENDENCY.getCode())) + .collect(Collectors.groupingBy(AppContractDto::getOperationId, + Collectors.toMap(AppContractDto::getId, Function.identity()))); + + appOperationAndDependencyInfo.setOperationMap(operationMap); + appOperationAndDependencyInfo.setAppContractDtoMap(appContractDtoMap); + return appOperationAndDependencyInfo; + } + protected void buildComparisonConfig( Map replayConfigurationMap, List configurations,