Skip to content

Commit

Permalink
feat: query compareConfig with operationName (#429)
Browse files Browse the repository at this point in the history
  • Loading branch information
coryhh authored Jun 28, 2024
1 parent 65af260 commit 0370072
Show file tree
Hide file tree
Showing 5 changed files with 124 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}

}
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -68,4 +75,21 @@ public ApplicationOperationConfiguration useResultByOperationId(String operation
result.setDependencyList(dependencyList);
return result;
}

public List<ApplicationOperationConfiguration> queryOperationByName(String appId,
String operationName) {
Map<String, Object> queryConditions = new HashMap<>(2);
queryConditions.put(ServiceOperationCollection.Fields.appId, appId);
if (operationName != null) {
queryConditions.put(ServiceOperationCollection.Fields.operationName, operationName);
}
List<ApplicationOperationConfiguration> applicationOperationConfigurations =
applicationOperationConfigurationRepository.queryByMultiCondition(queryConditions);
if (CollectionUtils.isEmpty(applicationOperationConfigurations)) {
return Collections.emptyList();
}
return applicationOperationConfigurations;
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -69,6 +70,9 @@ public class ComparisonSummaryService {
@Resource
ApplicationOperationConfigurationRepositoryImpl applicationOperationConfigurationRepositoryImpl;

@Resource
ApplicationOperationConfigurableHandler applicationOperationConfigurableHandler;

@Resource
ConfigLoadService configLoadService;

Expand Down Expand Up @@ -106,39 +110,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<String, ReplayCompareConfig.ReplayComparisonItem> replayComparisonItemMap;

// build operation config and global config
AppOperationAndDependencyInfo appOperationAndDependencyInfo = this.getOperationInfos(appId);
Map<String, ApplicationOperationConfiguration> operationInfoMap =
appOperationAndDependencyInfo.getOperationMap();
Map<String, Map<String, AppContractDto>> 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<ReplayComparisonItem> 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(
Expand Down Expand Up @@ -189,7 +161,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<String, ReplayCompareConfig.ReplayComparisonItem> replayComparisonItemMap;

// build operation config and global config
AppOperationAndDependencyInfo appOperationAndDependencyInfo = this.getOperationInfos(appId,
operationName);

Map<String, ApplicationOperationConfiguration> operationInfoMap =
appOperationAndDependencyInfo.getOperationMap();
Map<String, Map<String, AppContractDto>> 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<ReplayComparisonItem> 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<List<String>> exclusionSet = new HashSet<>();
Expand Down Expand Up @@ -245,6 +255,7 @@ protected void getComparisonReferenceConfiguration(String interfaceId,
protected void getAdditionalComparisonConfiguration(String interfaceId,
ComparisonSummaryConfiguration comparisonSummaryConfiguration) {
}
// endregion

protected Map<String, ReplayCompareConfig.ReplayComparisonItem> buildMultiConfiguration(
String appId,
Expand Down Expand Up @@ -339,6 +350,7 @@ protected Map<String, ReplayCompareConfig.ReplayComparisonItem> buildMultiConfig
* @param appId appId
* @return Map<String, ApplicationOperationConfiguration>
*/
@Deprecated
protected AppOperationAndDependencyInfo getOperationInfos(String appId) {
AppOperationAndDependencyInfo appOperationAndDependencyInfo = new AppOperationAndDependencyInfo();

Expand Down Expand Up @@ -372,6 +384,31 @@ protected AppOperationAndDependencyInfo getOperationInfos(String appId) {
return appOperationAndDependencyInfo;
}

protected AppOperationAndDependencyInfo getOperationInfos(String appId, String operationName) {
AppOperationAndDependencyInfo appOperationAndDependencyInfo = new AppOperationAndDependencyInfo();

List<ApplicationOperationConfiguration> applicationOperationConfigurations =
applicationOperationConfigurableHandler.queryOperationByName(appId, operationName);
Map<String, ApplicationOperationConfiguration> operationMap = applicationOperationConfigurations.stream()
.collect(Collectors.toMap(ApplicationOperationConfiguration::getId, Function.identity()));

List<String> operationIdList = new ArrayList<>(operationMap.keySet());
// appContractDtoList filter the operation and group by operationId
List<AppContractDto> appContractDtos = appContractRepository.queryAppContractListByOpIds(
operationIdList,
Collections.singletonList(AppContractCollection.Fields.contract));
Map<String,
Map<String, AppContractDto>> 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 <T extends AbstractComparisonDetailsConfiguration> void buildComparisonConfig(
Map<String, ReplayCompareConfig.ReplayComparisonItem> replayConfigurationMap,
List<T> configurations,
Expand All @@ -397,6 +434,12 @@ protected <T extends AbstractComparisonDetailsConfiguration> 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()));
Expand Down
Original file line number Diff line number Diff line change
@@ -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;

}
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -495,7 +495,7 @@

<properties>
<!-- Maven CI Friendly Versions https://maven.apache.org/maven-ci-friendly.html -->
<revision>0.6.4.12</revision>
<revision>0.6.4.13</revision>
<arex-common.version>0.1.28</arex-common.version>
<arex-extension-interface.version>0.0.1</arex-extension-interface.version>
<arex-storage-config.version>1.2.7</arex-storage-config.version>
Expand Down

0 comments on commit 0370072

Please sign in to comment.