Skip to content

Commit d59b51d

Browse files
author
rchen9
committed
feat: add the logic about ScriptContent
1 parent 51eaddb commit d59b51d

File tree

15 files changed

+320
-6
lines changed

15 files changed

+320
-6
lines changed

arex-web-api/src/main/java/com/arextest/web/api/service/controller/config/ComparisonScriptConfigurableController.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
import com.arextest.common.utils.ResponseUtils;
55
import com.arextest.web.core.business.config.ConfigurableHandler;
66
import com.arextest.web.core.business.config.replay.ComparisonScriptConfigurableHandler;
7+
import com.arextest.web.core.business.config.replay.ComparisonScriptContentHandler;
78
import com.arextest.web.model.contract.contracts.config.replay.ComparisonScriptConfiguration;
9+
import com.arextest.web.model.contract.contracts.config.replay.ComparisonScriptContentRequestType;
810
import com.arextest.web.model.contract.contracts.config.replay.PageQueryComparisonRequestType;
911
import com.arextest.web.model.contract.contracts.config.replay.QueryComparisonRequestType;
1012
import jakarta.annotation.Resource;
@@ -26,6 +28,9 @@ public class ComparisonScriptConfigurableController extends
2628
@Resource
2729
ComparisonScriptConfigurableHandler scriptConfigurableHandler;
2830

31+
@Resource
32+
ComparisonScriptContentHandler scriptContentHandler;
33+
2934
protected ComparisonScriptConfigurableController(
3035
ConfigurableHandler<ComparisonScriptConfiguration> configurableHandler) {
3136
super(configurableHandler);
@@ -68,5 +73,30 @@ public Response pageQueryComparisonConfig(@RequestBody PageQueryComparisonReques
6873
);
6974
}
7075

76+
@GetMapping("/queryScriptMethodNames")
77+
@ResponseBody
78+
public Response queryAllScriptMethod() {
79+
return ResponseUtils.successResponse(
80+
scriptContentHandler.queryScriptMethodNames()
81+
);
82+
}
83+
84+
@PostMapping("/saveScriptContent")
85+
@ResponseBody
86+
public Response saveScriptContent(
87+
@RequestBody ComparisonScriptContentRequestType scriptContentRequestType) {
88+
return ResponseUtils.successResponse(
89+
scriptContentHandler.saveScriptContent(scriptContentRequestType)
90+
);
91+
}
92+
93+
@GetMapping("/queryAllScriptContent")
94+
@ResponseBody
95+
public Response queryAllScriptContent() {
96+
return ResponseUtils.successResponse(
97+
scriptContentHandler.queryAll()
98+
);
99+
}
100+
71101

72102
}

arex-web-api/src/main/resources/application.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ arex:
4646
uuidIgnore: true
4747
ipIgnore: true
4848
ignoreNodeSet: ""
49+
scriptTemplate: "function %s(context, baseValue, testValue, arg) {%s}"
4950
# arex sending email domain
5051
email:
5152
domain: https://mail.arextest.com

arex-web-core/src/main/java/com/arextest/web/core/business/SystemConfigurationService.java

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,23 @@
77
import com.arextest.config.model.dto.system.SystemConfiguration;
88
import com.arextest.config.repository.SystemConfigurationRepository;
99
import com.arextest.diff.service.DecompressService;
10+
import com.arextest.web.core.business.config.replay.ComparisonScriptContentHandler;
1011
import com.arextest.web.model.contract.contracts.config.SystemConfigWithProperties;
12+
import com.arextest.web.model.contract.contracts.config.SystemConfigWithProperties.ScriptContentInfo;
13+
import com.arextest.web.model.dto.config.ComparisonScriptContent;
14+
import com.arextest.web.model.mapper.ScriptInfoMapper;
15+
import jakarta.annotation.Resource;
1116
import java.io.IOException;
1217
import java.util.ArrayList;
1318
import java.util.Collections;
1419
import java.util.HashSet;
1520
import java.util.List;
1621
import java.util.Set;
17-
import jakarta.annotation.Resource;
1822
import lombok.extern.slf4j.Slf4j;
23+
import org.apache.commons.collections4.CollectionUtils;
1924
import org.apache.commons.lang3.StringUtils;
2025
import org.springframework.beans.BeanUtils;
26+
import org.springframework.beans.factory.annotation.Value;
2127
import org.springframework.stereotype.Service;
2228

2329
/**
@@ -34,6 +40,12 @@ public class SystemConfigurationService {
3440
@Resource
3541
private ConfigLoadService configLoadService;
3642

43+
@Resource
44+
private ComparisonScriptContentHandler comparisonScriptContentHandler;
45+
46+
@Value("${arex.compare.scriptTemplate}")
47+
private String compareTemplate;
48+
3749
public boolean saveConfig(SystemConfiguration systemConfiguration) {
3850
List<SystemConfiguration> systemConfigurations = new ArrayList<>();
3951
List<String> removeKeys = new ArrayList<>();
@@ -55,7 +67,8 @@ public boolean saveConfig(SystemConfiguration systemConfiguration) {
5567
removeKeys.add(SystemConfigurationCollection.KeySummary.DESERIALIZATION_JAR);
5668
}
5769
if (systemConfiguration.getComparePluginInfo() != null
58-
&& StringUtils.isNotBlank(systemConfiguration.getComparePluginInfo().getComparePluginUrl())) {
70+
&& StringUtils.isNotBlank(
71+
systemConfiguration.getComparePluginInfo().getComparePluginUrl())) {
5972
SystemConfiguration comparePluginInfoConfig = new SystemConfiguration();
6073
ComparePluginInfo comparePluginInfo = systemConfiguration.getComparePluginInfo();
6174
comparePluginInfo.setTransMethodList(identifyTransformMethod(comparePluginInfo));
@@ -152,6 +165,26 @@ private SystemConfigWithProperties appendGlobalCompareConfig(ConfigLoadService c
152165
} catch (RuntimeException e) {
153166
LOGGER.error("getCompareIgnoredTimePrecisionMillis error", e);
154167
}
168+
169+
List<ComparisonScriptContent> comparisonScriptContents = comparisonScriptContentHandler.queryAll();
170+
if (CollectionUtils.isNotEmpty(comparisonScriptContents)) {
171+
List<ScriptContentInfo> scriptContentInfos = new ArrayList<>();
172+
for (ComparisonScriptContent item : comparisonScriptContents) {
173+
ScriptContentInfo scriptContentInfo = new ScriptContentInfo();
174+
String functionId = item.getId();
175+
scriptContentInfo.setFunctionName(
176+
ScriptInfoMapper.INSTANCE.functionIdToFunctionName(functionId)
177+
);
178+
179+
String scriptContent = item.getContent();
180+
scriptContentInfo.setScriptContent(
181+
String.format(compareTemplate, scriptContentInfo.getFunctionName(), scriptContent)
182+
);
183+
scriptContentInfos.add(scriptContentInfo);
184+
}
185+
systemConfigWithProperties.setScriptContentInfos(scriptContentInfos);
186+
}
187+
155188
return systemConfigWithProperties;
156189
}
157190
}

arex-web-core/src/main/java/com/arextest/web/core/business/config/replay/ComparisonScriptConfigurableHandler.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,5 +106,4 @@ private List<PageQueryComparisonResponseType.ScriptInfo> contractFromDto(
106106
}
107107
return result;
108108
}
109-
110109
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.arextest.web.core.business.config.replay;
2+
3+
import com.arextest.web.core.repository.mongo.ComparisonScriptContentRepository;
4+
import com.arextest.web.model.contract.contracts.config.replay.ComparisonScriptContentRequestType;
5+
import com.arextest.web.model.dto.config.ComparisonScriptContent;
6+
import com.arextest.web.model.mapper.ConfigComparisonScriptContentMapper;
7+
import java.util.List;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.stereotype.Component;
10+
11+
@RequiredArgsConstructor
12+
@Component
13+
public class ComparisonScriptContentHandler {
14+
15+
16+
private final ComparisonScriptContentRepository comparisonScriptContentRepository;
17+
18+
public List<ComparisonScriptContent> queryScriptMethodNames() {
19+
return comparisonScriptContentRepository.queryScriptMethodNames();
20+
}
21+
22+
public boolean saveScriptContent(ComparisonScriptContentRequestType request) {
23+
ComparisonScriptContent dto =
24+
ConfigComparisonScriptContentMapper.INSTANCE.dtoFromContract(request);
25+
return comparisonScriptContentRepository.save(dto);
26+
}
27+
28+
public List<ComparisonScriptContent> queryAll() {
29+
return comparisonScriptContentRepository.queryAll();
30+
}
31+
}

arex-web-core/src/main/java/com/arextest/web/core/business/config/replay/ComparisonSummaryService.java

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import com.arextest.web.core.business.config.ConfigurableHandler;
1010
import com.arextest.web.core.business.config.application.ApplicationOperationConfigurableHandler;
1111
import com.arextest.web.core.repository.AppContractRepository;
12-
import com.arextest.web.model.contract.contracts.common.enums.ExpirationType;
1312
import com.arextest.web.model.contract.contracts.compare.CategoryDetail;
1413
import com.arextest.web.model.contract.contracts.compare.TransformDetail;
1514
import com.arextest.web.model.contract.contracts.config.replay.AbstractComparisonDetailsConfiguration;
@@ -19,7 +18,9 @@
1918
import com.arextest.web.model.contract.contracts.config.replay.ComparisonInclusionsConfiguration;
2019
import com.arextest.web.model.contract.contracts.config.replay.ComparisonListSortConfiguration;
2120
import com.arextest.web.model.contract.contracts.config.replay.ComparisonReferenceConfiguration;
21+
import com.arextest.web.model.contract.contracts.config.replay.ComparisonScriptConfiguration;
2222
import com.arextest.web.model.contract.contracts.config.replay.ComparisonSummaryConfiguration;
23+
import com.arextest.web.model.contract.contracts.config.replay.ComparisonSummaryConfiguration.ReplayScriptMethod;
2324
import com.arextest.web.model.contract.contracts.config.replay.ComparisonTransformConfiguration;
2425
import com.arextest.web.model.contract.contracts.config.replay.QueryConfigOfCategoryRequestType;
2526
import com.arextest.web.model.contract.contracts.config.replay.QueryConfigOfCategoryResponseType;
@@ -29,7 +30,9 @@
2930
import com.arextest.web.model.dao.mongodb.AppContractCollection;
3031
import com.arextest.web.model.dto.AppContractDto;
3132
import com.arextest.web.model.enums.ContractTypeEnum;
33+
import com.arextest.web.model.mapper.ScriptInfoMapper;
3234
import com.google.common.collect.ImmutableMap;
35+
import jakarta.annotation.Resource;
3336
import java.util.ArrayList;
3437
import java.util.Collection;
3538
import java.util.Collections;
@@ -44,7 +47,6 @@
4447
import java.util.function.BiConsumer;
4548
import java.util.function.Function;
4649
import java.util.stream.Collectors;
47-
import jakarta.annotation.Resource;
4850
import lombok.Data;
4951
import lombok.extern.slf4j.Slf4j;
5052
import org.apache.commons.collections4.CollectionUtils;
@@ -76,6 +78,9 @@ public class ComparisonSummaryService {
7678
@Resource
7779
ConfigLoadService configLoadService;
7880

81+
@Resource
82+
ComparisonScriptConfigurableHandler comparisonScriptConfigurableHandler;
83+
7984
public ComparisonSummaryService(
8085
@Autowired ComparisonExclusionsConfigurableHandler exclusionsConfigurableHandler,
8186
@Autowired ComparisonInclusionsConfigurableHandler inclusionsConfigurableHandler,
@@ -105,6 +110,7 @@ public ComparisonSummaryConfiguration getComparisonDetailsSummary(String interfa
105110
getComparisonInclusionsConfiguration(interfaceId, comparisonSummaryConfiguration);
106111
getComparisonListSortConfiguration(interfaceId, comparisonSummaryConfiguration);
107112
getComparisonReferenceConfiguration(interfaceId, comparisonSummaryConfiguration);
113+
getComparisonScriptConfiguration(interfaceId, comparisonSummaryConfiguration);
108114
getAdditionalComparisonConfiguration(interfaceId, comparisonSummaryConfiguration);
109115
return comparisonSummaryConfiguration;
110116
}
@@ -260,6 +266,24 @@ protected void getComparisonReferenceConfiguration(String interfaceId,
260266
comparisonSummaryConfiguration.setReferenceMap(referenceMap);
261267
}
262268

269+
protected void getComparisonScriptConfiguration(String interfaceId,
270+
ComparisonSummaryConfiguration comparisonSummaryConfiguration) {
271+
Map<List<String>, ReplayScriptMethod> scriptMethodMap = new HashMap<>();
272+
List<ComparisonScriptConfiguration> comparisonScriptConfigurationList =
273+
comparisonScriptConfigurableHandler.queryByInterfaceId(interfaceId);
274+
comparisonScriptConfigurableHandler.removeDetailsExpired(
275+
comparisonScriptConfigurationList, true);
276+
Optional.ofNullable(comparisonScriptConfigurationList).orElse(Collections.emptyList())
277+
.forEach(item -> {
278+
if (CollectionUtils.isNotEmpty(item.getNodePath())) {
279+
ReplayScriptMethod scriptMethodInfo = ScriptInfoMapper.INSTANCE.toScriptMethodInfo(
280+
item.getScriptMethod());
281+
scriptMethodMap.put(item.getNodePath(), scriptMethodInfo);
282+
}
283+
});
284+
comparisonSummaryConfiguration.setScriptMethodMap(scriptMethodMap);
285+
}
286+
263287
protected void getAdditionalComparisonConfiguration(String interfaceId,
264288
ComparisonSummaryConfiguration comparisonSummaryConfiguration) {
265289
}
@@ -339,6 +363,7 @@ protected Map<String, ReplayCompareConfig.ReplayComparisonItem> buildMultiConfig
339363
}));
340364
summaryConfiguration.setReferenceMap(operationReferenceMap);
341365
}, operationInfoMap, appContractDtoMap);
366+
342367
buildComparisonConfig(replayConfigurationMap,
343368
transformConfigurableHandler.useResultAsList(appId),
344369
(configurations, summaryConfiguration) -> {
@@ -348,6 +373,21 @@ protected Map<String, ReplayCompareConfig.ReplayComparisonItem> buildMultiConfig
348373
summaryConfiguration.setTransformDetails(transformDetails);
349374
}, operationInfoMap, appContractDtoMap);
350375

376+
buildComparisonConfig(replayConfigurationMap,
377+
comparisonScriptConfigurableHandler.useResultAsList(appId),
378+
(configurations, summaryConfiguration) -> {
379+
Map<List<String>, ReplayScriptMethod> scriptMethodMap = configurations.stream()
380+
.filter(item -> CollectionUtils.isNotEmpty(item.getNodePath()))
381+
.collect(Collectors.toMap(ComparisonScriptConfiguration::getNodePath,
382+
item -> ScriptInfoMapper.INSTANCE.toScriptMethodInfo(item.getScriptMethod()),
383+
(r1, r2) -> {
384+
LogUtils.warn(LOGGER, "scriptMethod duplicate key",
385+
ImmutableMap.of("appId", appId));
386+
return r2;
387+
}));
388+
summaryConfiguration.setScriptMethodMap(scriptMethodMap);
389+
}, operationInfoMap, appContractDtoMap);
390+
351391
return replayConfigurationMap;
352392
}
353393

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.arextest.web.core.repository.mongo;
2+
3+
import com.arextest.web.model.dao.mongodb.ComparisonScriptContentCollection;
4+
import com.arextest.web.model.dao.mongodb.ComparisonScriptContentCollection.Fields;
5+
import com.arextest.web.model.dto.config.ComparisonScriptContent;
6+
import com.arextest.web.model.mapper.ConfigComparisonScriptContentMapper;
7+
import java.util.Collections;
8+
import java.util.List;
9+
import java.util.stream.Collectors;
10+
import lombok.RequiredArgsConstructor;
11+
import org.apache.commons.collections4.CollectionUtils;
12+
import org.springframework.data.mongodb.core.MongoTemplate;
13+
import org.springframework.data.mongodb.core.query.Query;
14+
import org.springframework.stereotype.Repository;
15+
16+
@RequiredArgsConstructor
17+
@Repository
18+
public class ComparisonScriptContentRepository {
19+
20+
private final MongoTemplate mongoTemplate;
21+
22+
23+
public List<ComparisonScriptContent> queryScriptMethodNames() {
24+
Query query = new Query();
25+
query.fields().exclude(Fields.content);
26+
List<ComparisonScriptContentCollection> daos = mongoTemplate.find(query,
27+
ComparisonScriptContentCollection.class);
28+
29+
if (CollectionUtils.isNotEmpty(daos)) {
30+
return daos.stream()
31+
.map(ConfigComparisonScriptContentMapper.INSTANCE::dtoFromDao)
32+
.collect(Collectors.toList());
33+
}
34+
return Collections.emptyList();
35+
}
36+
37+
public boolean save(ComparisonScriptContent dto) {
38+
ComparisonScriptContentCollection dao =
39+
ConfigComparisonScriptContentMapper.INSTANCE.daoFromDto(dto);
40+
mongoTemplate.save(dao);
41+
return true;
42+
}
43+
44+
public List<ComparisonScriptContent> queryAll() {
45+
List<ComparisonScriptContentCollection> daos = mongoTemplate.findAll(
46+
ComparisonScriptContentCollection.class);
47+
48+
if (CollectionUtils.isNotEmpty(daos)) {
49+
return daos.stream()
50+
.map(ConfigComparisonScriptContentMapper.INSTANCE::dtoFromDao)
51+
.collect(Collectors.toList());
52+
}
53+
return Collections.emptyList();
54+
}
55+
56+
}

arex-web-model-contract/src/main/java/com/arextest/web/model/contract/contracts/config/SystemConfigWithProperties.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.arextest.web.model.contract.contracts.config;
22

33
import com.arextest.config.model.dto.system.SystemConfiguration;
4+
import java.util.List;
45
import java.util.Set;
56
import lombok.Data;
67
import lombok.ToString;
@@ -50,4 +51,12 @@ public class SystemConfigWithProperties extends SystemConfiguration {
5051
* ignore the compare of uuid
5152
*/
5253
private Boolean ipIgnore;
54+
55+
private List<ScriptContentInfo> scriptContentInfos;
56+
57+
@Data
58+
public static class ScriptContentInfo {
59+
private String functionName;
60+
private String scriptContent;
61+
}
5362
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.arextest.web.model.contract.contracts.config.replay;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class ComparisonScriptContentRequestType {
7+
8+
private String id;
9+
10+
private String aliasName;
11+
12+
private String content;
13+
14+
}

arex-web-model-contract/src/main/java/com/arextest/web/model/contract/contracts/config/replay/ComparisonSummaryConfiguration.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ public class ComparisonSummaryConfiguration {
6464

6565
private List<TransformDetail> transformDetails;
6666

67+
@JsonDeserialize(keyUsing = MapKeyDeserializerUtils.class)
68+
@JsonSerialize(keyUsing = MapKeySerializerUtils.class)
69+
private Map<List<String>, ReplayScriptMethod> scriptMethodMap;
70+
6771
private Map<String, Object> additionalConfig;
6872

6973
private static class MapKeyDeserializerUtils extends KeyDeserializer {
@@ -87,4 +91,12 @@ public void serialize(List<String> stringList, JsonGenerator jsonGenerator,
8791
jsonGenerator.writeFieldName(string);
8892
}
8993
}
94+
95+
@Data
96+
public static class ReplayScriptMethod {
97+
98+
private String functionName;
99+
private String functionArgs;
100+
}
101+
90102
}

0 commit comments

Comments
 (0)