From 219d6d93c7d14fa679675ad25d9b8bd4d9a4e39c Mon Sep 17 00:00:00 2001 From: xiaoxianhjy <2413421030@qq.com> Date: Sat, 17 Aug 2024 17:16:15 +0800 Subject: [PATCH 01/16] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=91=98=E5=85=A8=E5=B1=80=E6=90=9C=E7=B4=A2Value?= =?UTF-8?q?=E5=80=BC=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ItemController.java | 8 + .../controller/ItemControllerTest.java | 28 +- .../apollo/biz/repository/ItemRepository.java | 46 ++++ .../biz/repository/ReleaseRepository.java | 2 + .../apollo/biz/service/ItemService.java | 65 ++++- .../apollo/biz/service/ItemServiceTest.java | 25 ++ .../apollo/common/dto/ItemInfoDTO.java | 100 +++++++ .../apollo/portal/api/AdminServiceAPI.java | 7 + .../GlobalSearchValueController.java | 84 ++++++ .../apollo/portal/entity/vo/ItemInfo.java | 111 ++++++++ .../service/GlobalSearchValueService.java | 47 ++++ .../resources/static/global_search_value.html | 216 +++++++++++++++ .../src/main/resources/static/i18n/en.json | 28 +- .../src/main/resources/static/i18n/zh-CN.json | 28 +- .../src/main/resources/static/img/nodata.png | Bin 0 -> 21120 bytes .../src/main/resources/static/scripts/app.js | 2 + .../controller/GlobalSearchValueController.js | 257 ++++++++++++++++++ .../services/GlobalSearchValueService.js | 40 +++ .../resources/static/views/common/nav.html | 1 + .../GlobalSearchValueControllerTest.java | 127 +++++++++ .../service/GlobalSearchValueServiceTest.java | 73 +++++ 21 files changed, 1284 insertions(+), 11 deletions(-) create mode 100644 apollo-common/src/main/java/com/ctrip/framework/apollo/common/dto/ItemInfoDTO.java create mode 100644 apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueController.java create mode 100644 apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/entity/vo/ItemInfo.java create mode 100644 apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueService.java create mode 100644 apollo-portal/src/main/resources/static/global_search_value.html create mode 100644 apollo-portal/src/main/resources/static/img/nodata.png create mode 100644 apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js create mode 100644 apollo-portal/src/main/resources/static/scripts/services/GlobalSearchValueService.js create mode 100644 apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueControllerTest.java create mode 100644 apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueServiceTest.java diff --git a/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ItemController.java b/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ItemController.java index 2e7e25d5912..86289edc15d 100644 --- a/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ItemController.java +++ b/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ItemController.java @@ -27,6 +27,7 @@ import com.ctrip.framework.apollo.biz.service.ReleaseService; import com.ctrip.framework.apollo.biz.utils.ConfigChangeContentBuilder; import com.ctrip.framework.apollo.common.dto.ItemDTO; +import com.ctrip.framework.apollo.common.dto.ItemInfoDTO; import com.ctrip.framework.apollo.common.dto.PageDTO; import com.ctrip.framework.apollo.common.exception.BadRequestException; import com.ctrip.framework.apollo.common.exception.NotFoundException; @@ -201,6 +202,13 @@ public List findDeletedItems(@PathVariable("appId") String appId, return Collections.emptyList(); } + @GetMapping("/items-search/key-and-value") + public List getItemInfoBySearch(@RequestParam(value = "key", required = false, defaultValue = "") String key, + @RequestParam(value = "value", required = false, defaultValue = "") String value) { + List ItemInfoDTOs = itemService.getItemInfoBySearch(key, value); + return ItemInfoDTOs; + } + @GetMapping("/items/{itemId}") public ItemDTO get(@PathVariable("itemId") long itemId) { Item item = itemService.findOne(itemId); diff --git a/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ItemControllerTest.java b/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ItemControllerTest.java index f406d01e0f9..35de857241c 100644 --- a/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ItemControllerTest.java +++ b/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ItemControllerTest.java @@ -21,10 +21,10 @@ import com.ctrip.framework.apollo.biz.entity.Commit; import com.ctrip.framework.apollo.biz.repository.CommitRepository; import com.ctrip.framework.apollo.biz.repository.ItemRepository; -import com.ctrip.framework.apollo.common.dto.AppDTO; -import com.ctrip.framework.apollo.common.dto.ClusterDTO; -import com.ctrip.framework.apollo.common.dto.ItemDTO; -import com.ctrip.framework.apollo.common.dto.NamespaceDTO; +import com.ctrip.framework.apollo.biz.service.ItemService; +import com.ctrip.framework.apollo.common.dto.*; + +import java.util.Arrays; import java.util.List; import java.util.Objects; import org.junit.Assert; @@ -48,6 +48,9 @@ public class ItemControllerTest extends AbstractControllerTest { @Autowired private ItemRepository itemRepository; + @Autowired + private ItemService itemService; + @Test @Sql(scripts = "/controller/test-itemset.sql", executionPhase = ExecutionPhase.BEFORE_TEST_METHOD) @Sql(scripts = "/controller/cleanup.sql", executionPhase = ExecutionPhase.AFTER_TEST_METHOD) @@ -150,4 +153,21 @@ public void testDelete() { Pageable.ofSize(10)); assertThat(commitList).hasSize(2); } + + @Test + @Sql(scripts = "/controller/test-itemset.sql", executionPhase = ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = "/controller/cleanup.sql", executionPhase = ExecutionPhase.AFTER_TEST_METHOD) + public void testSearch() { + this.testCreate(); + + String itemKey = "test-key"; + String itemValue = "test-value"; + List i = itemRepository.findItemsByKeyAndValueLike(itemKey,itemValue); + System.out.println(i.toString()); + List itemInfoDTOS = itemService.getItemInfoBySearch(itemKey, itemValue); + String searchUrl = url("/items-search/key-and-value?key={key}&value={value}"); + ItemInfoDTO[] resultArray = restTemplate.getForObject(searchUrl, ItemInfoDTO[].class, itemKey, itemValue); + List expectedResult = Arrays.asList(resultArray); + assertThat(itemInfoDTOS.toString()).isEqualTo(expectedResult.toString()); + } } diff --git a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ItemRepository.java b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ItemRepository.java index d482ce63e97..b186fe41e36 100644 --- a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ItemRepository.java +++ b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ItemRepository.java @@ -43,6 +43,52 @@ public interface ItemRepository extends PagingAndSortingRepository { Item findFirst1ByNamespaceIdOrderByLineNumDesc(Long namespaceId); + @Query(nativeQuery = true, value = + "SELECT " + + " n.AppId AS appId, " + + " n.ClusterName AS clusterName, " + + " n.NamespaceName AS namespaceName, " + + " i.`Key` AS `key`, " + + " i.`Value` AS `value`" + + "FROM " + + " Item i " + + "RIGHT JOIN Namespace n ON i.NamespaceId = n.Id " + + "WHERE " + + " i.`Key` LIKE %?1% " + + " AND i.`Value` LIKE %?2% " + + " AND i.IsDeleted = 0") + List findItemsByKeyAndValueLike(String key, String value); + + @Query(nativeQuery = true, value = + "SELECT "+ + " n.AppId AS appId, " + + " n.ClusterName AS clusterName, " + + " n.NamespaceName AS namespaceName, " + + " i.`Key` AS `key`, " + + " i.`Value` AS `value` " + + "FROM " + + " Item i " + + "RIGHT JOIN Namespace n ON i.NamespaceId = n.Id " + + "WHERE " + + " i.`Value` LIKE %?1% " + + " AND i.IsDeleted = 0") + List findItemsByValueLike(String value); + + @Query(nativeQuery = true, value = + "SELECT"+ + " n.AppId AS appId, " + + " n.ClusterName AS clusterName, " + + " n.NamespaceName AS namespaceName, " + + " i.`Key` AS `key`, " + + " i.`Value` AS `value` " + + "FROM " + + " Item i " + + "RIGHT JOIN Namespace n ON i.NamespaceId = n.Id " + + "WHERE " + + " i.`Key` LIKE %?1% " + + " AND i.IsDeleted = 0 ") + List findItemsByKeyLike(String key); + @Modifying @Query("update Item set IsDeleted = true, DeletedAt = ROUND(UNIX_TIMESTAMP(NOW(4))*1000), DataChange_LastModifiedBy = ?2 where NamespaceId = ?1 and IsDeleted = false") int deleteByNamespaceId(long namespaceId, String operator); diff --git a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ReleaseRepository.java b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ReleaseRepository.java index 992c8c93283..20e5c7062fe 100644 --- a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ReleaseRepository.java +++ b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ReleaseRepository.java @@ -47,6 +47,8 @@ Release findFirstByAppIdAndClusterNameAndNamespaceNameAndIsAbandonedFalseOrderBy List findByIdIn(Set releaseIds); + List findAll(); + @Modifying @Query("update Release set IsDeleted = true, DeletedAt = ROUND(UNIX_TIMESTAMP(NOW(4))*1000), DataChange_LastModifiedBy = ?4 where AppId=?1 and ClusterName=?2 and NamespaceName = ?3 and IsDeleted = false") int batchDelete(String appId, String clusterName, String namespaceName, String operator); diff --git a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemService.java b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemService.java index 7dffa366c5e..8c2a5d92f27 100644 --- a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemService.java +++ b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemService.java @@ -21,7 +21,10 @@ import com.ctrip.framework.apollo.biz.entity.Audit; import com.ctrip.framework.apollo.biz.entity.Item; import com.ctrip.framework.apollo.biz.entity.Namespace; +import com.ctrip.framework.apollo.biz.entity.Release; import com.ctrip.framework.apollo.biz.repository.ItemRepository; +import com.ctrip.framework.apollo.biz.repository.ReleaseRepository; +import com.ctrip.framework.apollo.common.dto.ItemInfoDTO; import com.ctrip.framework.apollo.common.exception.BadRequestException; import com.ctrip.framework.apollo.common.exception.NotFoundException; import com.ctrip.framework.apollo.common.utils.BeanUtils; @@ -33,10 +36,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.sql.Clob; +import java.sql.SQLException; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -49,16 +51,19 @@ public class ItemService { private final NamespaceService namespaceService; private final AuditService auditService; private final BizConfig bizConfig; + private final ReleaseRepository releaseRepository; public ItemService( final ItemRepository itemRepository, final @Lazy NamespaceService namespaceService, final AuditService auditService, - final BizConfig bizConfig) { + final BizConfig bizConfig, + final ReleaseRepository releaseRepository) { this.itemRepository = itemRepository; this.namespaceService = namespaceService; this.auditService = auditService; this.bizConfig = bizConfig; + this.releaseRepository = releaseRepository; } @@ -146,6 +151,56 @@ public Page findItemsByNamespace(String appId, String clusterName, String return itemRepository.findByNamespaceId(namespace.getId(), pageable); } + public List getItemInfoBySearch(String key, String value) { + List itemInfoDTOs = new ArrayList<>(); + List infos; + if (key.isEmpty() && !value.isEmpty()) { + infos = itemRepository.findItemsByValueLike(value); + } else if (value.isEmpty() && !key.isEmpty()) { + infos = itemRepository.findItemsByKeyLike(key); + } else { + infos = itemRepository.findItemsByKeyAndValueLike(key, value); + } + + for (Object[] row : infos) { + ItemInfoDTO itemInfoDTO = new ItemInfoDTO(); + itemInfoDTO.setAppId(String.valueOf(row[0])); + itemInfoDTO.setClusterName(String.valueOf(row[1])); + itemInfoDTO.setNamespaceName(String.valueOf(row[2])); + itemInfoDTO.setStatus("0"); + itemInfoDTO.setKey(String.valueOf(row[3])); + if (row[4] instanceof String) { + itemInfoDTO.setValue(String.valueOf(row[4])); + } else if (row[4] instanceof Clob) { + try { + Clob clob = (Clob) row[4]; + String valueStr = clob.getSubString(1, (int) clob.length()); + System.out.println(valueStr); + itemInfoDTO.setValue(valueStr); + } catch (SQLException e) { + e.printStackTrace(); + } + } + itemInfoDTOs.add(itemInfoDTO); + } + + List releaseItems = releaseRepository.findAll(); + for (ItemInfoDTO itemInfoDTO : itemInfoDTOs) { + boolean isIncluded = false; + for (Release releaseItem : releaseItems) { + if (releaseItem.getConfigurations().contains(itemInfoDTO.getKey()) && releaseItem.getConfigurations().contains(itemInfoDTO.getValue())) { + itemInfoDTO.setStatus("1"); + isIncluded = true; + break; + } + } + if (!isIncluded) { + itemInfoDTO.setStatus("0"); + } + } + return itemInfoDTOs; + } + @Transactional public Item save(Item entity) { checkItemKeyLength(entity.getKey()); diff --git a/apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/ItemServiceTest.java b/apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/ItemServiceTest.java index 3b0ed5f6a4b..e23d6dede4e 100644 --- a/apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/ItemServiceTest.java +++ b/apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/ItemServiceTest.java @@ -18,12 +18,15 @@ import com.ctrip.framework.apollo.biz.AbstractIntegrationTest; import com.ctrip.framework.apollo.biz.entity.Item; +import com.ctrip.framework.apollo.common.dto.ItemInfoDTO; import com.ctrip.framework.apollo.common.exception.BadRequestException; import org.junit.Assert; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.jdbc.Sql; +import java.util.List; + public class ItemServiceTest extends AbstractIntegrationTest { @Autowired @@ -71,4 +74,26 @@ public void testUpdateItem() { Assert.assertEquals("v1-new", dbItem.getValue()); } + @Test + @Sql(scripts = {"/sql/namespace-test.sql","/sql/item-test.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + public void testSearchItem() { + ItemInfoDTO itemInfoDTO = new ItemInfoDTO(); + itemInfoDTO.setAppId("testApp"); + itemInfoDTO.setClusterName("default"); + itemInfoDTO.setNamespaceName("application"); + itemInfoDTO.setStatus("0"); + itemInfoDTO.setKey("k1"); + itemInfoDTO.setValue("v1"); + + String itemKey = "k1"; + String itemValue = "v1"; + List ExpectedItemInfoDTOSByKeyAndValue = itemService.getItemInfoBySearch(itemKey,itemValue); + List ExpectedItemInfoDTOSByKey = itemService.getItemInfoBySearch(itemKey,""); + List ExpectedItemInfoDTOSByValue = itemService.getItemInfoBySearch("",itemValue); + Assert.assertEquals(itemInfoDTO.toString(), ExpectedItemInfoDTOSByKeyAndValue.get(0).toString()); + Assert.assertEquals(itemInfoDTO.toString(), ExpectedItemInfoDTOSByKey.get(0).toString()); + Assert.assertEquals(itemInfoDTO.toString(), ExpectedItemInfoDTOSByValue.get(0).toString()); + } + } diff --git a/apollo-common/src/main/java/com/ctrip/framework/apollo/common/dto/ItemInfoDTO.java b/apollo-common/src/main/java/com/ctrip/framework/apollo/common/dto/ItemInfoDTO.java new file mode 100644 index 00000000000..fdd395390f8 --- /dev/null +++ b/apollo-common/src/main/java/com/ctrip/framework/apollo/common/dto/ItemInfoDTO.java @@ -0,0 +1,100 @@ +/* + * Copyright 2024 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.ctrip.framework.apollo.common.dto; + + +public class ItemInfoDTO extends BaseDTO{ + private String appId; + private String clusterName; + private String namespaceName; + private String status; + private String key; + private String value; + + public ItemInfoDTO() { + } + + public ItemInfoDTO(String appId, String clusterName, String namespaceName, + String status, String key, String value) { + this.appId = appId; + this.clusterName = clusterName; + this.namespaceName = namespaceName; + this.status = status; + this.key = key; + this.value = value; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getClusterName() { + return clusterName; + } + + public void setClusterName(String clusterName) { + this.clusterName = clusterName; + } + + public String getNamespaceName() { + return namespaceName; + } + + public void setNamespaceName(String namespaceName) { + this.namespaceName = namespaceName; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return "ItemInfoDTO{" + + "appId='" + appId + '\'' + + ", clusterName='" + clusterName + '\'' + + ", namespaceName='" + namespaceName + '\'' + + ", status='" + status + '\'' + + ", key='" + key + '\'' + + ", value='" + value + '\'' + + '}'; + } +} diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java index 3d3f23bff4a..449dc92726d 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java @@ -198,6 +198,13 @@ public List findDeletedItems(String appId, Env env, String clusterName, return Arrays.asList(itemDTOs); } + public List getPerEnvItemInfoBySearch(Env env, String key, String value){ + ItemInfoDTO[] perEnvItemInfoDTOs = + restTemplate.get(env, "items-search/key-and-value?key={key}&value={value}", + ItemInfoDTO[].class, key, value); + return Arrays.asList(perEnvItemInfoDTOs); + } + public ItemDTO loadItem(Env env, String appId, String clusterName, String namespaceName, String key) { return restTemplate.get(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/items/{key}", ItemDTO.class, appId, clusterName, namespaceName, key); diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueController.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueController.java new file mode 100644 index 00000000000..4bcc31b4444 --- /dev/null +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueController.java @@ -0,0 +1,84 @@ +/* + * Copyright 2024 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.ctrip.framework.apollo.portal.controller; + + +import com.ctrip.framework.apollo.portal.component.PortalSettings; +import com.ctrip.framework.apollo.portal.entity.vo.ItemInfo; +import com.ctrip.framework.apollo.portal.environment.Env; +import com.ctrip.framework.apollo.portal.service.GlobalSearchValueService; +import com.google.gson.Gson; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; + + +@RestController +public class GlobalSearchValueController { + + private final PortalSettings portalSettings; + private final GlobalSearchValueService globalSearchValueService; + + public GlobalSearchValueController(final PortalSettings portalSettings, final GlobalSearchValueService globalSearchValueService) { + this.portalSettings = portalSettings; + this.globalSearchValueService = globalSearchValueService; + } + + @PreAuthorize(value = "@permissionValidator.isSuperAdmin()") + @GetMapping("/global-search/item-info/by-key-or-value") + public ResponseEntity get_ItemInfo_BySearch(@RequestParam(value = "key", required = false, defaultValue = "") String key, + @RequestParam(value = "value", required = false , defaultValue = "") String value) { + + if(key.isEmpty() && value.isEmpty()) { + String message = "Please enter at least one search criterion in either key or value."; + return ResponseEntity + .status(HttpStatus.BAD_REQUEST) + .contentType(MediaType.APPLICATION_JSON) + .body(new Gson().toJson(message)); + } + + List allEnvItemInfos = new ArrayList<>(); + List activeEnvs = portalSettings.getActiveEnvs(); + if(activeEnvs.isEmpty()){ + return ResponseEntity + .status(HttpStatus.BAD_REQUEST) + .contentType(MediaType.APPLICATION_JSON) + .body(new Gson().toJson("Request accepted. Looking for available admin service.")); + + } + + activeEnvs.forEach(env -> { + List perEnvItemInfos = globalSearchValueService.get_PerEnv_ItemInfo_BySearch(env, key, value); + allEnvItemInfos.addAll(perEnvItemInfos); + }); + + return ResponseEntity + .ok() + .contentType(MediaType.APPLICATION_JSON) + .body(allEnvItemInfos); + + + } + +} diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/entity/vo/ItemInfo.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/entity/vo/ItemInfo.java new file mode 100644 index 00000000000..d490bc42569 --- /dev/null +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/entity/vo/ItemInfo.java @@ -0,0 +1,111 @@ +/* + * Copyright 2024 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.ctrip.framework.apollo.portal.entity.vo; + +public class ItemInfo { + + private String appId; + private String envName; + private String clusterName; + private String namespaceName; + private String status; + private String key; + private String value; + + public ItemInfo() { + } + + public ItemInfo(String appId, String envName, String clusterName, + String namespaceName, String status, String key, String value) { + this.appId = appId; + this.envName = envName; + this.clusterName = clusterName; + this.namespaceName = namespaceName; + this.status = status; + this.key = key; + this.value = value; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getEnvName() { + return envName; + } + + public void setEnvName(String envName) { + this.envName = envName; + } + + public String getClusterName() { + return clusterName; + } + + public void setClusterName(String clusterName) { + this.clusterName = clusterName; + } + + public String getNamespaceName() { + return namespaceName; + } + + public void setNamespaceName(String namespaceName) { + this.namespaceName = namespaceName; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return "ItemInfo{" + + "appId='" + appId + '\'' + + ", envName='" + envName + '\'' + + ", clusterName='" + clusterName + '\'' + + ", namespaceName='" + namespaceName + '\'' + + ", status='" + status + '\'' + + ", key='" + key + '\'' + + ", value='" + value + '\'' + + '}'; + } +} diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueService.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueService.java new file mode 100644 index 00000000000..9a0e8b30460 --- /dev/null +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueService.java @@ -0,0 +1,47 @@ +/* + * Copyright 2024 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.ctrip.framework.apollo.portal.service; + +import com.ctrip.framework.apollo.common.dto.ItemInfoDTO; +import com.ctrip.framework.apollo.portal.api.AdminServiceAPI; +import com.ctrip.framework.apollo.portal.entity.vo.ItemInfo; +import com.ctrip.framework.apollo.portal.environment.Env; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class GlobalSearchValueService { + + private final AdminServiceAPI.ItemAPI itemAPI; + + public GlobalSearchValueService(AdminServiceAPI.ItemAPI itemAPI) { + this.itemAPI = itemAPI; + } + + public List get_PerEnv_ItemInfo_BySearch(Env env, String key, String value) { + List perEnvItemInfos = new ArrayList<>(); + List perEnvItemInfoDTOs = itemAPI.getPerEnvItemInfoBySearch(env, key, value); + perEnvItemInfoDTOs.forEach(itemInfoDTO -> { + ItemInfo itemInfo = new ItemInfo(itemInfoDTO.getAppId(),env.getName(),itemInfoDTO.getClusterName(),itemInfoDTO.getNamespaceName(),itemInfoDTO.getStatus(),itemInfoDTO.getKey(),itemInfoDTO.getValue()); + perEnvItemInfos.add(itemInfo); + }); + return perEnvItemInfos; + } + +} diff --git a/apollo-portal/src/main/resources/static/global_search_value.html b/apollo-portal/src/main/resources/static/global_search_value.html new file mode 100644 index 00000000000..c65e3bf3a32 --- /dev/null +++ b/apollo-portal/src/main/resources/static/global_search_value.html @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + {{'Global.Title' | translate }} + + + + +
+
+
+ +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apollo-portal/src/main/resources/static/i18n/en.json b/apollo-portal/src/main/resources/static/i18n/en.json index dbe1d698520..565003ec609 100644 --- a/apollo-portal/src/main/resources/static/i18n/en.json +++ b/apollo-portal/src/main/resources/static/i18n/en.json @@ -893,5 +893,31 @@ "ApolloAuditLog.ParentSpan": "parent operation", "ApolloAuditLog.FollowsFromSpan": "last operation", "ApolloAuditLog.FieldChangeHistory": "Field Change History", - "ApolloAuditLog.InfluenceEntity": "Audit entity influenced" + "ApolloAuditLog.InfluenceEntity": "Audit entity influenced", + "Global.Title": "Global Search for Value", + "Global.App": "App ID", + "Global.Env": "Env Name", + "Global.Cluster": "Cluster Name", + "Global.NameSpace": "NameSpace Name", + "Global.Status" : "Posting Status", + "Global.Key": "Key", + "Global.Value": "Value", + "Global.ValueSearch.Tips" : "(Fuzzy search, key can be the name or content of the configuration item, value is the value of the configuration item.)", + "Global.Operate" : "Operate", + "Global.Expand" : "Expand", + "Global.Abbreviate" : "Abbreviate", + "Global.JumpToEditPage" : "Jump to edit page", + "Item.GlobalSearchByKey": "Search by Key", + "Item.GlobalSearchByValue": "Search by Value", + "Item.GlobalSearch": "Search", + "Item.UnPublished" : "UnPublished", + "Item.Published" : "Published", + "Item.GlobalSearchSystemError": "System error, please try again or contact the system administrator", + "Item.GlobalSearch.Tips": "Search hint", + "ApolloGlobalSearch.NoData" : "No data yet, please search or add", + "Paging.TotalItems.part1" : "Total of", + "Paging.TotalItems.part2" : "records", + "Paging.DisplayNumber" : "per/Page", + "Paging.PageNumberOne" : "First", + "Paging.PageNumberLast" : "Last" } diff --git a/apollo-portal/src/main/resources/static/i18n/zh-CN.json b/apollo-portal/src/main/resources/static/i18n/zh-CN.json index e166237c306..8cbc3eab2fa 100644 --- a/apollo-portal/src/main/resources/static/i18n/zh-CN.json +++ b/apollo-portal/src/main/resources/static/i18n/zh-CN.json @@ -893,5 +893,31 @@ "ApolloAuditLog.ParentSpan": "父操作", "ApolloAuditLog.FollowsFromSpan": "前操作", "ApolloAuditLog.FieldChangeHistory": "属性变动历史", - "ApolloAuditLog.InfluenceEntity": "影响的审计实体" + "ApolloAuditLog.InfluenceEntity": "影响的审计实体", + "Global.Title": "Value的全局搜索", + "Global.App": "应用ID", + "Global.Env": "环境", + "Global.Cluster": "集群名", + "Global.NameSpace": "命名空间", + "Global.Status" : "发布状态", + "Global.Key": "Key", + "Global.Value": "Value", + "Global.ValueSearch.Tips" : "(模糊搜索,key可为配置项名称或content,value为配置项值)", + "Global.Operate" : "操作", + "Global.Expand" : "展开", + "Global.Abbreviate" : "缩略", + "Global.JumpToEditPage" : "跳转到编辑页面", + "Item.GlobalSearchByKey": "按照Key值检索", + "Item.GlobalSearchByValue": "按照Value值检索", + "Item.GlobalSearch": "查询", + "Item.UnPublished" : "未发布", + "Item.Published" : "已发布", + "Item.GlobalSearchSystemError": "系统出错,请重试或联系系统负责人", + "Item.GlobalSearch.Tips": "搜索提示", + "ApolloGlobalSearch.NoData" : "暂无数据,请进行检索或者添加", + "Paging.TotalItems.part1" : "共", + "Paging.TotalItems.part2" : "条记录", + "Paging.DisplayNumber" : "条/页", + "Paging.PageNumberOne" : "首页", + "Paging.PageNumberLast" : "尾页" } diff --git a/apollo-portal/src/main/resources/static/img/nodata.png b/apollo-portal/src/main/resources/static/img/nodata.png new file mode 100644 index 0000000000000000000000000000000000000000..1cb236546eab3aec07dc619b493f125dedbe4fb9 GIT binary patch literal 21120 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 L+LT~?_v!xt2^mxi literal 0 HcmV?d00001 diff --git a/apollo-portal/src/main/resources/static/scripts/app.js b/apollo-portal/src/main/resources/static/scripts/app.js index bac2dd5fde8..88ecb81e522 100644 --- a/apollo-portal/src/main/resources/static/scripts/app.js +++ b/apollo-portal/src/main/resources/static/scripts/app.js @@ -64,6 +64,8 @@ var diff_item_module = angular.module('diff_item', ['app.service', 'apollo.direc var namespace_module = angular.module('namespace', ['app.service', 'apollo.directive', 'app.util', 'toastr', 'angular-loading-bar', 'valdr']); //server config var server_config_manage_module = angular.module('server_config_manage', ['app.service', 'apollo.directive', 'app.util', 'toastr', 'angular-loading-bar']); +// Value的全局检索 +var global_search_value_module = angular.module('global_search_value', ['app.service', 'apollo.directive', 'app.util', 'toastr', 'angular-loading-bar', 'ngSanitize']); //setting var setting_module = angular.module('setting', ['app.service', 'apollo.directive', 'app.util', 'toastr', 'angular-loading-bar', 'valdr']); //role diff --git a/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js b/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js new file mode 100644 index 00000000000..69047b6cefc --- /dev/null +++ b/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js @@ -0,0 +1,257 @@ +/* + * Copyright 2024 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +global_search_value_module.controller('GlobalSearchValueController', + ['$scope', '$window', '$translate', 'toastr', 'AppUtil', 'GlobalSearchValueService', 'PermissionService', GlobalSearchValueController]); + +function GlobalSearchValueController($scope, $window, $translate, toastr, AppUtil, GlobalSearchValueService, PermissionService) { + + $scope.allItemInfo = []; + $scope.pageItemInfo = []; + $scope.itemInfoSearchKey = ''; + $scope.itemInfoSearchValue = ''; + $scope.needToBeHighlightedKey = ''; + $scope.needToBeHighlightedValue = ''; + $scope.isShowHighlightKeyword = []; + $scope.isDirectlyDisplayKey = []; + $scope.isDirectlyDisplayValue = []; + $scope.currentPage = 1; + $scope.pageSize = '10'; + $scope.totalItems = 0; + $scope.totalPages = 0; + $scope.pagesArray = []; + $scope.tempKey = ''; + $scope.tempValue = ''; + + $scope.getItemInfoByKeyAndValue = getItemInfoByKeyAndValue; + $scope.highlightKeyword = highlightKeyword; + $scope.jumpToTheEditingPage = jumpToTheEditingPage; + $scope.isShowAllValue = isShowAllValue; + $scope.convertPageSizeToInt = convertPageSizeToInt; + $scope.changePage = changePage; + $scope.getPagesArray = getPagesArray; + + init(); + function init() { + initPermission(); + } + + function initPermission() { + PermissionService.has_root_permission() + .then(function (result) { + $scope.isRootUser = result.hasPermission; + }); + } + + function getItemInfoByKeyAndValue(itemInfoSearchKey, itemInfoSearchValue) { + $scope.currentPage = 1; + $scope.itemInfoSearchKey = itemInfoSearchKey || ''; + $scope.itemInfoSearchValue = itemInfoSearchValue || ''; + $scope.allItemInfo = []; + $scope.pageItemInfo = []; + $scope.tempKey = itemInfoSearchKey || ''; + $scope.tempValue = itemInfoSearchValue || ''; + $scope.isShowHighlightKeyword = []; + GlobalSearchValueService.findItemInfoByKeyAndValue($scope.itemInfoSearchKey, $scope.itemInfoSearchValue) + .then(handleSuccess).catch(handleError); + function handleSuccess(result) { + const itemInfo = []; + const isDirectlyDisplayValue = []; + const isDirectlyDisplayKey = []; + if(($scope.itemInfoSearchKey === '') && ($scope.itemInfoSearchValue === '')){ + $scope.needToBeHighlightedValue = ''; + $scope.needToBeHighlightedKey = ''; + result.body.forEach((iteminfo, index) => { + itemInfo.push(iteminfo); + isDirectlyDisplayValue[index] = "0"; + isDirectlyDisplayKey[index] = "0"; + }); + }else if(($scope.itemInfoSearchKey === '') && !($scope.itemInfoSearchValue === '')){ + $scope.needToBeHighlightedValue = $scope.itemInfoSearchValue; + $scope.needToBeHighlightedKey = ''; + result.forEach((iteminfo, index) => { + itemInfo.push(iteminfo); + if(iteminfo.value === $scope.needToBeHighlightedValue){ + isDirectlyDisplayValue[index] = "0"; + isDirectlyDisplayKey[index] = "0"; + }else{ + let position = iteminfo.value.indexOf($scope.needToBeHighlightedValue); + if (position !== -1) { + if (position === 0) { + isDirectlyDisplayValue[index] = "1"; + isDirectlyDisplayKey[index] = "0"; + } else if (position + $scope.needToBeHighlightedValue.length === iteminfo.value.length) { + isDirectlyDisplayValue[index] = "2"; + isDirectlyDisplayKey[index] = "0"; + } else { + isDirectlyDisplayValue[index] = "3"; + isDirectlyDisplayKey[index] = "0"; + } + } else { + isDirectlyDisplayValue[index] = "-1"; + isDirectlyDisplayKey[index] = "-1"; + } + } + }); + }else if(!($scope.itemInfoSearchKey === '') && ($scope.itemInfoSearchValue === '')){ + $scope.needToBeHighlightedKey = $scope.itemInfoSearchKey; + $scope.needToBeHighlightedValue = ''; + result.forEach((iteminfo, index) => { + itemInfo.push(iteminfo); + if(iteminfo.key === $scope.needToBeHighlightedKey){ + isDirectlyDisplayValue[index] = "0"; + isDirectlyDisplayKey[index] = "0"; + }else{ + isDirectlyDisplayValue[index] = "0"; + isDirectlyDisplayKey[index] = "-1"; + } + + }); + }else{ + $scope.needToBeHighlightedKey = $scope.itemInfoSearchKey; + $scope.needToBeHighlightedValue = $scope.itemInfoSearchValue; + result.forEach((iteminfo, index) => { + itemInfo.push(iteminfo); + if(iteminfo.key === $scope.needToBeHighlightedKey){ + isDirectlyDisplayKey[index] = "0"; + if(iteminfo.value === $scope.needToBeHighlightedValue){ + isDirectlyDisplayValue[index] = "0"; + }else{ + let position = iteminfo.value.indexOf($scope.needToBeHighlightedValue); + if (position !== -1) { + if (position === 0) { + isDirectlyDisplayValue[index] = "1"; + } else if (position + $scope.needToBeHighlightedValue.length === iteminfo.value.length) { + isDirectlyDisplayValue[index] = "2"; + } else { + isDirectlyDisplayValue[index] = "3"; + } + } else { + isDirectlyDisplayValue[index] = "-1"; + isDirectlyDisplayKey[index] = "-1"; + } + } + }else{ + isDirectlyDisplayKey[index] = "-1"; + if(iteminfo.value === $scope.needToBeHighlightedValue){ + isDirectlyDisplayValue[index] = "0"; + }else{ + let position = iteminfo.value.indexOf($scope.needToBeHighlightedValue); + if (position !== -1) { + if (position === 0) { + isDirectlyDisplayValue[index] = "1"; + } else if (position + $scope.needToBeHighlightedValue.length === iteminfo.value.length) { + isDirectlyDisplayValue[index] = "2"; + } else { + isDirectlyDisplayValue[index] = "3"; + } + } else { + isDirectlyDisplayValue[index] = "-1"; + isDirectlyDisplayKey[index] = "-1"; + } + } + } + }); + } + $scope.totalItems = itemInfo.length; + $scope.allItemInfo = itemInfo; + $scope.totalPages = Math.ceil($scope.totalItems / parseInt($scope.pageSize, 10)); + const startIndex = ($scope.currentPage - 1) * parseInt($scope.pageSize, 10); + const endIndex = Math.min(startIndex + parseInt($scope.pageSize, 10), itemInfo.length); + $scope.pageItemInfo = itemInfo.slice(startIndex, endIndex); + $scope.isDirectlyDisplayValue = isDirectlyDisplayValue; + $scope.isDirectlyDisplayKey = isDirectlyDisplayKey; + getPagesArray(); + } + + function handleError(error) { + $scope.itemInfo = []; + switch (error.status) { + case 400: + toastr.warning(error.data, $translate.instant('Item.GlobalSearch.Tips')); + break; + default: + toastr.error(AppUtil.errorMsg(error), $translate.instant('Item.GlobalSearchSystemError')); + break; + } + } + } + + function convertPageSizeToInt() { + getItemInfoByKeyAndValue($scope.tempKey, $scope.tempValue); + } + + function changePage(page) { + if (page >= 1 && page <= $scope.totalPages) { + $scope.currentPage = page; + const startIndex = ($scope.currentPage - 1)* parseInt($scope.pageSize, 10); + const endIndex = Math.min(startIndex + parseInt($scope.pageSize, 10), $scope.totalItems); + $scope.pageItemInfo = $scope.allItemInfo.slice(startIndex, endIndex); + getPagesArray(); + } + } + + function getPagesArray() { + const pageRange = 2; + let pagesArray = []; + let currentPage = $scope.currentPage; + let totalPages = $scope.totalPages; + if (totalPages <= (pageRange * 2) + 4) { + for (let i = 1; i <= totalPages; i++) { + pagesArray.push(i); + } + } else { + if (currentPage <= (pageRange + 2)) { + for (let i = 1; i <= pageRange * 2 + 2; i++) { + pagesArray.push(i); + } + pagesArray.push('...'); + pagesArray.push(totalPages); + } else if (currentPage >= (totalPages - (pageRange + 1))) { + for (let i = totalPages - pageRange * 2 - 1 ; i <= totalPages; i++) { + pagesArray.push(i); + } + pagesArray.unshift('...'); + pagesArray.unshift(1); + } else { + for (let i = (currentPage - pageRange); i <= currentPage + pageRange; i++) { + pagesArray.push(i); + } + pagesArray.unshift('...'); + pagesArray.unshift(1); + pagesArray.push('...'); + pagesArray.push(totalPages); + } + } + $scope.pagesArray = pagesArray; + } + + function jumpToTheEditingPage(appid,env,cluster){ + let url = AppUtil.prefixPath() + "/config.html#/appid=" + appid + "&" +"env=" + env + "&" + "cluster=" + cluster; + window.open(url, '_blank'); + } + + function highlightKeyword(fulltext,keyword) { + if (!keyword || keyword.length === 0) return fulltext; + let regex = new RegExp("(" + keyword + ")", "g"); + return fulltext.replace(regex, '$1'); + } + + function isShowAllValue(index){ + $scope.isShowHighlightKeyword[index] = !$scope.isShowHighlightKeyword[index]; + } + +} diff --git a/apollo-portal/src/main/resources/static/scripts/services/GlobalSearchValueService.js b/apollo-portal/src/main/resources/static/scripts/services/GlobalSearchValueService.js new file mode 100644 index 00000000000..5be647e3c89 --- /dev/null +++ b/apollo-portal/src/main/resources/static/scripts/services/GlobalSearchValueService.js @@ -0,0 +1,40 @@ +/* + * Copyright 2024 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +appService.service('GlobalSearchValueService', ['$resource', '$q', 'AppUtil', function ($resource, $q, AppUtil) { + let global_search_resource = $resource('', {}, { + get_item_Info_by_key_and_Value: { + isArray: true, + method: 'GET', + url: AppUtil.prefixPath() + '/global-search/item-info/by-key-or-value', + params: { + key: 'key', + value: 'value' + } + } + }); + return { + findItemInfoByKeyAndValue:function (key,value){ + let d = $q.defer(); + global_search_resource.get_item_Info_by_key_and_Value({key: key,value: value},function (result) { + d.resolve(result); + }, function (error) { + d.reject(error); + }); + return d.promise; + } + } +}]); diff --git a/apollo-portal/src/main/resources/static/views/common/nav.html b/apollo-portal/src/main/resources/static/views/common/nav.html index c2f73b213dd..a78f2b68dd0 100644 --- a/apollo-portal/src/main/resources/static/views/common/nav.html +++ b/apollo-portal/src/main/resources/static/views/common/nav.html @@ -66,6 +66,7 @@
  • {{'Common.Nav.SystemInfo' | translate }}
  • {{'Common.Nav.ConfigExport' | translate }}
  • {{'ApolloAuditLog.Title' | translate }}
  • +
  • {{'Global.Title' | translate }}
  • diff --git a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueControllerTest.java b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueControllerTest.java new file mode 100644 index 00000000000..29b83d05fb9 --- /dev/null +++ b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueControllerTest.java @@ -0,0 +1,127 @@ +/* + * Copyright 2024 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.ctrip.framework.apollo.portal.controller; + +/** + * @author hujiyuan 2024-08-10 + */ + +import com.ctrip.framework.apollo.portal.component.PortalSettings; +import com.ctrip.framework.apollo.portal.entity.vo.ItemInfo; +import com.ctrip.framework.apollo.portal.environment.Env; +import com.ctrip.framework.apollo.portal.service.GlobalSearchValueService; +import com.google.gson.Gson; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +import java.util.ArrayList; +import java.util.List; + +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(MockitoJUnitRunner.class) +public class GlobalSearchValueControllerTest { + + private MockMvc mockMvc; + + @Mock + private PortalSettings portalSettings; + + @Mock + private GlobalSearchValueService globalSearchValueService; + + @InjectMocks + private GlobalSearchValueController globalSearchValueController; + + private final List activeEnvs = new ArrayList<>(); + + @Before + public void setUp() { + when(portalSettings.getActiveEnvs()).thenReturn(activeEnvs); + mockMvc = MockMvcBuilders.standaloneSetup(globalSearchValueController).build(); + } + + @Test + public void testGet_ItemInfo_BySearch_WithEmptyKeyAndValue_ReturnBadRequestAndTips() throws Exception { + mockMvc.perform(MockMvcRequestBuilders.get("/global-search/item-info/by-key-or-value") + .contentType(MediaType.APPLICATION_JSON) + .param("key", "") + .param("value", "")) + .andExpect(status().isBadRequest()) + .andExpect(content().json(new Gson().toJson("Please enter at least one search criterion in either key or value."))); + } + + @Test + public void testGet_ItemInfo_BySearch_WithNoActiveEnvs_ReturnBadRequestAndTips() throws Exception { + activeEnvs.clear(); + mockMvc.perform(MockMvcRequestBuilders.get("/global-search/item-info/by-key-or-value") + .contentType(MediaType.APPLICATION_JSON) + .param("key", "query-key") + .param("value", "query-value")) + .andExpect(status().isBadRequest()) + .andExpect(content().json(new Gson().toJson("Request accepted. Looking for available admin service."))); + } + + @Test + public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnEmptyItemInfos() throws Exception { + activeEnvs.add(Env.DEV); + when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(any(Env.class), anyString(), anyString())).thenReturn(new ArrayList<>()); + mockMvc.perform(MockMvcRequestBuilders.get("/global-search/item-info/by-key-or-value") + .contentType(MediaType.APPLICATION_JSON) + .param("key", "query-key") + .param("value", "query-value")) + .andExpect(status().isOk()) + .andExpect(content().json(String.valueOf(new ArrayList<>()))); + verify(portalSettings,times(1)).getActiveEnvs(); + verify(globalSearchValueService,times(1)).get_PerEnv_ItemInfo_BySearch(any(Env.class), anyString(), anyString()); + } + + @Test + public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnExpectedItemInfos() throws Exception { + activeEnvs.add(Env.DEV); + activeEnvs.add(Env.PRO); + List devMockItemInfos = new ArrayList<>(); + List proMockItemInfos = new ArrayList<>(); + List allEnvMockItemInfos = new ArrayList<>(); + devMockItemInfos.add(new ItemInfo("appid1","env1","cluster1","namespace1","status1","query-key","query-value")); + proMockItemInfos.add(new ItemInfo("appid2","env2","cluster2","namespace2","status2","query-key","query-value")); + when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value"))).thenReturn(devMockItemInfos); + when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value"))).thenReturn(proMockItemInfos); + allEnvMockItemInfos.addAll(devMockItemInfos); + allEnvMockItemInfos.addAll(proMockItemInfos); + mockMvc.perform(MockMvcRequestBuilders.get("/global-search/item-info/by-key-or-value") + .contentType(MediaType.APPLICATION_JSON) + .param("key", "query-key") + .param("value", "query-value")) + .andExpect(status().isOk()) + .andExpect(content().json(new Gson().toJson(allEnvMockItemInfos))); + verify(portalSettings,times(1)).getActiveEnvs(); + verify(globalSearchValueService, times(1)).get_PerEnv_ItemInfo_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value")); + verify(globalSearchValueService, times(1)).get_PerEnv_ItemInfo_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value")); + verify(globalSearchValueService, times(2)).get_PerEnv_ItemInfo_BySearch(any(Env.class), eq("query-key"), eq("query-value")); + } +} diff --git a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueServiceTest.java b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueServiceTest.java new file mode 100644 index 00000000000..2e72d88eb93 --- /dev/null +++ b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueServiceTest.java @@ -0,0 +1,73 @@ +/* + * Copyright 2024 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.ctrip.framework.apollo.portal.service; + +/** + * @author hujiyuan 2024-08-10 + */ + +import com.ctrip.framework.apollo.common.dto.ItemInfoDTO; +import com.ctrip.framework.apollo.portal.api.AdminServiceAPI; +import com.ctrip.framework.apollo.portal.entity.vo.ItemInfo; +import com.ctrip.framework.apollo.portal.environment.Env; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@RunWith(MockitoJUnitRunner.class) +public class GlobalSearchValueServiceTest { + + @Mock + private AdminServiceAPI.ItemAPI itemAPI; + + @InjectMocks + private GlobalSearchValueService globalSearchValueService; + + @Test + public void testGet_PerEnv_ItemInfo_BySearch_withKeyAndValue_ReturnExpectedItemInfos() { + ItemInfoDTO itemInfoDTO = new ItemInfoDTO("TestApp","TestCluster","TestNamespace","1","TestKey","TestValue"); + List mockItemInfoDTOs = new ArrayList<>(); + mockItemInfoDTOs.add(itemInfoDTO); + Mockito.when(itemAPI.getPerEnvItemInfoBySearch(any(Env.class), eq("TestKey"), eq("TestValue"))).thenReturn(mockItemInfoDTOs); + List mockItemInfos = globalSearchValueService.get_PerEnv_ItemInfo_BySearch(Env.PRO, "TestKey", "TestValue"); + assertEquals(1, mockItemInfos.size()); + ItemInfo itemInfo = new ItemInfo("TestApp", Env.PRO.getName(), "TestCluster", "TestNamespace", "1", "TestKey", "TestValue"); + List expectedResults = new ArrayList<>(); + expectedResults.add(itemInfo); + verify(itemAPI,times(1)).getPerEnvItemInfoBySearch(any(Env.class), eq("TestKey"), eq("TestValue")); + assertEquals(expectedResults.toString(), mockItemInfos.toString()); + } + + @Test + public void testGet_PerEnv_ItemInfo_withKeyAndValue_BySearch_ReturnEmptyItemInfos() { + Mockito.when(itemAPI.getPerEnvItemInfoBySearch(any(Env.class), anyString(), anyString())).thenReturn(new ArrayList<>()); + List result = globalSearchValueService.get_PerEnv_ItemInfo_BySearch(Env.PRO, "NonExistentKey", "NonExistentValue"); + assertEquals(0, result.size()); + } + +} From f31f13dce550212b3890960f331ae0dafdbc3261 Mon Sep 17 00:00:00 2001 From: xiaoxianhjy <162684719+xiaoxianhjy@users.noreply.github.com> Date: Sat, 17 Aug 2024 19:14:45 +0800 Subject: [PATCH 02/16] Update ItemControllerTest.java --- .../apollo/adminservice/controller/ItemControllerTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ItemControllerTest.java b/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ItemControllerTest.java index 35de857241c..85cde0b8e7a 100644 --- a/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ItemControllerTest.java +++ b/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ItemControllerTest.java @@ -162,8 +162,6 @@ public void testSearch() { String itemKey = "test-key"; String itemValue = "test-value"; - List i = itemRepository.findItemsByKeyAndValueLike(itemKey,itemValue); - System.out.println(i.toString()); List itemInfoDTOS = itemService.getItemInfoBySearch(itemKey, itemValue); String searchUrl = url("/items-search/key-and-value?key={key}&value={value}"); ItemInfoDTO[] resultArray = restTemplate.getForObject(searchUrl, ItemInfoDTO[].class, itemKey, itemValue); From ca9123055939eecee62d9454d64b9a13c7a08538 Mon Sep 17 00:00:00 2001 From: xiaoxianhjy <162684719+xiaoxianhjy@users.noreply.github.com> Date: Sat, 17 Aug 2024 19:16:32 +0800 Subject: [PATCH 03/16] Update GlobalSearchValueController.js --- .../static/scripts/controller/GlobalSearchValueController.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js b/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js index 69047b6cefc..dbb887c328e 100644 --- a/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js +++ b/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js @@ -197,6 +197,7 @@ function GlobalSearchValueController($scope, $window, $translate, toastr, AppUti function changePage(page) { if (page >= 1 && page <= $scope.totalPages) { $scope.currentPage = page; + $scope.isShowHighlightKeyword = []; const startIndex = ($scope.currentPage - 1)* parseInt($scope.pageSize, 10); const endIndex = Math.min(startIndex + parseInt($scope.pageSize, 10), $scope.totalItems); $scope.pageItemInfo = $scope.allItemInfo.slice(startIndex, endIndex); From eff7d8911eadb24deee5adfa91d039d26549775c Mon Sep 17 00:00:00 2001 From: xiaoxianhjy <2413421030@qq.com> Date: Tue, 27 Aug 2024 00:59:10 +0800 Subject: [PATCH 04/16] Improved some project codes --- .../controller/ItemController.java | 13 +- .../apollo/biz/repository/ItemRepository.java | 70 +++----- .../apollo/biz/service/ItemService.java | 43 ++--- .../apollo/common/dto/ItemInfoDTO.java | 10 ++ .../apollo/portal/api/AdminServiceAPI.java | 11 +- .../GlobalSearchValueController.java | 35 +++- .../service/GlobalSearchValueService.java | 4 + .../resources/static/global_search_value.html | 16 +- .../controller/GlobalSearchValueController.js | 150 +++++++----------- .../services/GlobalSearchValueService.js | 2 +- .../GlobalSearchValueControllerTest.java | 57 ++++++- 11 files changed, 222 insertions(+), 189 deletions(-) diff --git a/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ItemController.java b/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ItemController.java index 86289edc15d..3cbcb524ce1 100644 --- a/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ItemController.java +++ b/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ItemController.java @@ -203,10 +203,15 @@ public List findDeletedItems(@PathVariable("appId") String appId, } @GetMapping("/items-search/key-and-value") - public List getItemInfoBySearch(@RequestParam(value = "key", required = false, defaultValue = "") String key, - @RequestParam(value = "value", required = false, defaultValue = "") String value) { - List ItemInfoDTOs = itemService.getItemInfoBySearch(key, value); - return ItemInfoDTOs; + public List getItemInfoBySearch(@RequestParam(value = "key", required = false) String key, + @RequestParam(value = "value", required = false) String value) { + return itemService.getItemInfoBySearch(key, value); + } + + @GetMapping("/items-search/key-and-value/count") + public int countItemInfoNumBySearch(@RequestParam(value = "key", required = false) String key, + @RequestParam(value = "value", required = false) String value) { + return itemService.countItemInfoNumBySearch(key, value); } @GetMapping("/items/{itemId}") diff --git a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ItemRepository.java b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ItemRepository.java index b186fe41e36..a652fdaae76 100644 --- a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ItemRepository.java +++ b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ItemRepository.java @@ -18,11 +18,13 @@ import com.ctrip.framework.apollo.biz.entity.Item; +import com.ctrip.framework.apollo.common.dto.ItemInfoDTO; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.data.repository.query.Param; import java.util.Date; import java.util.List; @@ -43,51 +45,29 @@ public interface ItemRepository extends PagingAndSortingRepository { Item findFirst1ByNamespaceIdOrderByLineNumDesc(Long namespaceId); - @Query(nativeQuery = true, value = - "SELECT " + - " n.AppId AS appId, " + - " n.ClusterName AS clusterName, " + - " n.NamespaceName AS namespaceName, " + - " i.`Key` AS `key`, " + - " i.`Value` AS `value`" + - "FROM " + - " Item i " + - "RIGHT JOIN Namespace n ON i.NamespaceId = n.Id " + - "WHERE " + - " i.`Key` LIKE %?1% " + - " AND i.`Value` LIKE %?2% " + - " AND i.IsDeleted = 0") - List findItemsByKeyAndValueLike(String key, String value); - - @Query(nativeQuery = true, value = - "SELECT "+ - " n.AppId AS appId, " + - " n.ClusterName AS clusterName, " + - " n.NamespaceName AS namespaceName, " + - " i.`Key` AS `key`, " + - " i.`Value` AS `value` " + - "FROM " + - " Item i " + - "RIGHT JOIN Namespace n ON i.NamespaceId = n.Id " + - "WHERE " + - " i.`Value` LIKE %?1% " + - " AND i.IsDeleted = 0") - List findItemsByValueLike(String value); - - @Query(nativeQuery = true, value = - "SELECT"+ - " n.AppId AS appId, " + - " n.ClusterName AS clusterName, " + - " n.NamespaceName AS namespaceName, " + - " i.`Key` AS `key`, " + - " i.`Value` AS `value` " + - "FROM " + - " Item i " + - "RIGHT JOIN Namespace n ON i.NamespaceId = n.Id " + - "WHERE " + - " i.`Key` LIKE %?1% " + - " AND i.IsDeleted = 0 ") - List findItemsByKeyLike(String key); + @Query("SELECT new com.ctrip.framework.apollo.common.dto.ItemInfoDTO(n.appId, n.clusterName, n.namespaceName, i.key, i.value) " + + "FROM Item i RIGHT JOIN Namespace n ON i.namespaceId = n.id " + + "WHERE i.key LIKE %:key% AND i.value LIKE %:value% AND i.isDeleted = 0") + List findItemsByKeyAndValueLike(@Param("key") String key, @Param("value") String value, Pageable pageable); + + @Query("SELECT new com.ctrip.framework.apollo.common.dto.ItemInfoDTO(n.appId, n.clusterName, n.namespaceName, i.key, i.value) " + + "FROM Item i RIGHT JOIN Namespace n ON i.namespaceId = n.id " + + "WHERE i.key LIKE %:key% AND i.isDeleted = 0") + List findItemsByKeyLike(@Param("key") String key, Pageable pageable); + + @Query("SELECT new com.ctrip.framework.apollo.common.dto.ItemInfoDTO(n.appId, n.clusterName, n.namespaceName, i.key, i.value) " + + "FROM Item i RIGHT JOIN Namespace n ON i.namespaceId = n.id " + + "WHERE i.value LIKE %:value% AND i.isDeleted = 0") + List findItemsByValueLike(@Param("value") String value, Pageable pageable); + + @Query("SELECT COUNT(i) FROM Item i RIGHT JOIN Namespace n ON i.namespaceId = n.id WHERE i.key LIKE %:key% AND i.isDeleted = 0") + int countItemNumByKeyLike(@Param("key") String key); + + @Query("SELECT COUNT(i) FROM Item i RIGHT JOIN Namespace n ON i.namespaceId = n.id WHERE i.value LIKE %:value% AND i.isDeleted = 0") + int countItemNumByValueLike(@Param("value") String value); + + @Query("SELECT COUNT(i) FROM Item i RIGHT JOIN Namespace n ON i.namespaceId = n.id WHERE i.key LIKE %:key% AND i.value LIKE %:value% AND i.isDeleted = 0") + int countItemNumByKeyAndValueLike(@Param("key") String key, @Param("value") String value); @Modifying @Query("update Item set IsDeleted = true, DeletedAt = ROUND(UNIX_TIMESTAMP(NOW(4))*1000), DataChange_LastModifiedBy = ?2 where NamespaceId = ?1 and IsDeleted = false") diff --git a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemService.java b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemService.java index 8c2a5d92f27..586638d9871 100644 --- a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemService.java +++ b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemService.java @@ -32,6 +32,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -152,36 +153,14 @@ public Page findItemsByNamespace(String appId, String clusterName, String } public List getItemInfoBySearch(String key, String value) { - List itemInfoDTOs = new ArrayList<>(); - List infos; + List itemInfoDTOs; + Pageable pageable = PageRequest.of(0,200); if (key.isEmpty() && !value.isEmpty()) { - infos = itemRepository.findItemsByValueLike(value); + itemInfoDTOs = itemRepository.findItemsByValueLike(value, pageable); } else if (value.isEmpty() && !key.isEmpty()) { - infos = itemRepository.findItemsByKeyLike(key); + itemInfoDTOs = itemRepository.findItemsByKeyLike(key, pageable); } else { - infos = itemRepository.findItemsByKeyAndValueLike(key, value); - } - - for (Object[] row : infos) { - ItemInfoDTO itemInfoDTO = new ItemInfoDTO(); - itemInfoDTO.setAppId(String.valueOf(row[0])); - itemInfoDTO.setClusterName(String.valueOf(row[1])); - itemInfoDTO.setNamespaceName(String.valueOf(row[2])); - itemInfoDTO.setStatus("0"); - itemInfoDTO.setKey(String.valueOf(row[3])); - if (row[4] instanceof String) { - itemInfoDTO.setValue(String.valueOf(row[4])); - } else if (row[4] instanceof Clob) { - try { - Clob clob = (Clob) row[4]; - String valueStr = clob.getSubString(1, (int) clob.length()); - System.out.println(valueStr); - itemInfoDTO.setValue(valueStr); - } catch (SQLException e) { - e.printStackTrace(); - } - } - itemInfoDTOs.add(itemInfoDTO); + itemInfoDTOs = itemRepository.findItemsByKeyAndValueLike(key, value, pageable); } List releaseItems = releaseRepository.findAll(); @@ -201,6 +180,16 @@ public List getItemInfoBySearch(String key, String value) { return itemInfoDTOs; } + public int countItemInfoNumBySearch(String key, String value){ + if (key.isEmpty() && !value.isEmpty()) { + return itemRepository.countItemNumByValueLike(value); + } else if (value.isEmpty() && !key.isEmpty()) { + return itemRepository.countItemNumByKeyLike(key); + } else { + return itemRepository.countItemNumByKeyAndValueLike(key, value); + } + } + @Transactional public Item save(Item entity) { checkItemKeyLength(entity.getKey()); diff --git a/apollo-common/src/main/java/com/ctrip/framework/apollo/common/dto/ItemInfoDTO.java b/apollo-common/src/main/java/com/ctrip/framework/apollo/common/dto/ItemInfoDTO.java index fdd395390f8..36a6a157e9b 100644 --- a/apollo-common/src/main/java/com/ctrip/framework/apollo/common/dto/ItemInfoDTO.java +++ b/apollo-common/src/main/java/com/ctrip/framework/apollo/common/dto/ItemInfoDTO.java @@ -38,6 +38,16 @@ public ItemInfoDTO(String appId, String clusterName, String namespaceName, this.value = value; } + public ItemInfoDTO(String appId, String clusterName, String namespaceName, + String key, String value) { + this.appId = appId; + this.clusterName = clusterName; + this.namespaceName = namespaceName; + this.status = "0"; + this.key = key; + this.value = value; + } + public String getAppId() { return appId; } diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java index 449dc92726d..8856e7bfbb5 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java @@ -200,11 +200,18 @@ public List findDeletedItems(String appId, Env env, String clusterName, public List getPerEnvItemInfoBySearch(Env env, String key, String value){ ItemInfoDTO[] perEnvItemInfoDTOs = - restTemplate.get(env, "items-search/key-and-value?key={key}&value={value}", - ItemInfoDTO[].class, key, value); + restTemplate.get(env, "items-search/key-and-value?key={key}&value={value}", + ItemInfoDTO[].class, key, value); return Arrays.asList(perEnvItemInfoDTOs); } + public int countPerEnvItemInfoNumBySearch(Env env, String key, String value){ + Integer count = + restTemplate.get(env, "items-search/key-and-value/count?key={key}&value={value}", + Integer.class, key, value); + return count == null ? 0 : count; + } + public ItemDTO loadItem(Env env, String appId, String clusterName, String namespaceName, String key) { return restTemplate.get(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/items/{key}", ItemDTO.class, appId, clusterName, namespaceName, key); diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueController.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueController.java index 4bcc31b4444..ba34e34483f 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueController.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueController.java @@ -31,7 +31,10 @@ import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; @RestController @@ -39,6 +42,7 @@ public class GlobalSearchValueController { private final PortalSettings portalSettings; private final GlobalSearchValueService globalSearchValueService; + private static final int MAX_SEARCH_RESULTS = 200; public GlobalSearchValueController(final PortalSettings portalSettings, final GlobalSearchValueService globalSearchValueService) { this.portalSettings = portalSettings; @@ -51,14 +55,12 @@ public ResponseEntity get_ItemInfo_BySearch(@RequestParam(value = "key", requ @RequestParam(value = "value", required = false , defaultValue = "") String value) { if(key.isEmpty() && value.isEmpty()) { - String message = "Please enter at least one search criterion in either key or value."; return ResponseEntity .status(HttpStatus.BAD_REQUEST) .contentType(MediaType.APPLICATION_JSON) - .body(new Gson().toJson(message)); + .body(new Gson().toJson("Please enter at least one search criterion in either key or value.")); } - List allEnvItemInfos = new ArrayList<>(); List activeEnvs = portalSettings.getActiveEnvs(); if(activeEnvs.isEmpty()){ return ResponseEntity @@ -68,17 +70,38 @@ public ResponseEntity get_ItemInfo_BySearch(@RequestParam(value = "key", requ } + List allEnvItemInfos = new ArrayList<>(); + List envBeyondLimit = new ArrayList<>(); + AtomicBoolean hasMoreData = new AtomicBoolean(false); activeEnvs.forEach(env -> { List perEnvItemInfos = globalSearchValueService.get_PerEnv_ItemInfo_BySearch(env, key, value); + int perEnvItemInfoNum = globalSearchValueService.count_PerEnv_ItemInfoNum_BySearch(env, key, value); + if(perEnvItemInfoNum > MAX_SEARCH_RESULTS){ + envBeyondLimit.add(env.getName()); + hasMoreData.set(true); + } allEnvItemInfos.addAll(perEnvItemInfos); }); + Map body = new HashMap<>(); + if(hasMoreData.get()){ + body.put("data", allEnvItemInfos); + body.put("hasMoreData", true); + body.put("message", String.format( + "In %s , more than %d items found (Exceeded the maximum search quantity for a single environment). Please enter more precise criteria to narrow down the search scope.", + String.join(" , ", envBeyondLimit), MAX_SEARCH_RESULTS)); + return ResponseEntity + .ok() + .contentType(MediaType.APPLICATION_JSON) + .body(body); + } + + body.put("data", allEnvItemInfos); + body.put("hasMoreData", false); return ResponseEntity .ok() .contentType(MediaType.APPLICATION_JSON) - .body(allEnvItemInfos); - - + .body(body); } } diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueService.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueService.java index 9a0e8b30460..ac0b7554685 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueService.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueService.java @@ -44,4 +44,8 @@ public List get_PerEnv_ItemInfo_BySearch(Env env, String key, String v return perEnvItemInfos; } + public int count_PerEnv_ItemInfoNum_BySearch(Env env, String key, String value){ + return itemAPI.countPerEnvItemInfoNumBySearch(env, key, value); + } + } diff --git a/apollo-portal/src/main/resources/static/global_search_value.html b/apollo-portal/src/main/resources/static/global_search_value.html index c65e3bf3a32..fa60c8cc974 100644 --- a/apollo-portal/src/main/resources/static/global_search_value.html +++ b/apollo-portal/src/main/resources/static/global_search_value.html @@ -77,7 +77,7 @@ {{'Global.Value' | translate }} {{'Global.Operate' | translate }} - + {{ item.appId }} {{ item.envName }} {{ item.clusterName }} @@ -105,15 +105,15 @@ - {{ item.key }} - + {{ item.key }} + - {{ item.value }} - - {{ needToBeHighlightedValue }}... - ...{{ needToBeHighlightedValue }} - ...{{ needToBeHighlightedValue }}... + {{ item.value }} + + {{ needToBeHighlightedValue }}... + ...{{ needToBeHighlightedValue }} + ...{{ needToBeHighlightedValue }}... | {{'Global.Expand' | translate }} | {{'Global.Abbreviate' | translate }} diff --git a/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js b/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js index dbb887c328e..8846596f063 100644 --- a/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js +++ b/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js @@ -26,8 +26,10 @@ function GlobalSearchValueController($scope, $window, $translate, toastr, AppUti $scope.needToBeHighlightedKey = ''; $scope.needToBeHighlightedValue = ''; $scope.isShowHighlightKeyword = []; - $scope.isDirectlyDisplayKey = []; - $scope.isDirectlyDisplayValue = []; + $scope.isAllItemInfoDirectlyDisplayKey = []; + $scope.isAllItemInfoDirectlyDisplayValue = []; + $scope.isPageItemInfoDirectlyDisplayKey = []; + $scope.isPageItemInfoDirectlyDisplayValue = []; $scope.currentPage = 1; $scope.pageSize = '10'; $scope.totalItems = 0; @@ -43,6 +45,8 @@ function GlobalSearchValueController($scope, $window, $translate, toastr, AppUti $scope.convertPageSizeToInt = convertPageSizeToInt; $scope.changePage = changePage; $scope.getPagesArray = getPagesArray; + $scope.determineDisplayValue = determineDisplayValue; + $scope.determineDisplayKey = determineDisplayKey; init(); function init() { @@ -62,119 +66,58 @@ function GlobalSearchValueController($scope, $window, $translate, toastr, AppUti $scope.itemInfoSearchValue = itemInfoSearchValue || ''; $scope.allItemInfo = []; $scope.pageItemInfo = []; + $scope.isAllItemInfoDirectlyDisplayKey = []; + $scope.isPageItemInfoDirectlyDisplayKey = []; + $scope.isAllItemInfoDirectlyDisplayValue = []; + $scope.isPageItemInfoDirectlyDisplayValue = []; $scope.tempKey = itemInfoSearchKey || ''; $scope.tempValue = itemInfoSearchValue || ''; $scope.isShowHighlightKeyword = []; GlobalSearchValueService.findItemInfoByKeyAndValue($scope.itemInfoSearchKey, $scope.itemInfoSearchValue) .then(handleSuccess).catch(handleError); function handleSuccess(result) { - const itemInfo = []; - const isDirectlyDisplayValue = []; - const isDirectlyDisplayKey = []; - if(($scope.itemInfoSearchKey === '') && ($scope.itemInfoSearchValue === '')){ - $scope.needToBeHighlightedValue = ''; - $scope.needToBeHighlightedKey = ''; - result.body.forEach((iteminfo, index) => { - itemInfo.push(iteminfo); - isDirectlyDisplayValue[index] = "0"; - isDirectlyDisplayKey[index] = "0"; - }); - }else if(($scope.itemInfoSearchKey === '') && !($scope.itemInfoSearchValue === '')){ + let allItemInfo = []; + let isAllItemInfoDirectlyDisplayValue = []; + let isAllItemInfoDirectlyDisplayKey = []; + if(($scope.itemInfoSearchKey === '') && !($scope.itemInfoSearchValue === '')){ $scope.needToBeHighlightedValue = $scope.itemInfoSearchValue; $scope.needToBeHighlightedKey = ''; - result.forEach((iteminfo, index) => { - itemInfo.push(iteminfo); - if(iteminfo.value === $scope.needToBeHighlightedValue){ - isDirectlyDisplayValue[index] = "0"; - isDirectlyDisplayKey[index] = "0"; - }else{ - let position = iteminfo.value.indexOf($scope.needToBeHighlightedValue); - if (position !== -1) { - if (position === 0) { - isDirectlyDisplayValue[index] = "1"; - isDirectlyDisplayKey[index] = "0"; - } else if (position + $scope.needToBeHighlightedValue.length === iteminfo.value.length) { - isDirectlyDisplayValue[index] = "2"; - isDirectlyDisplayKey[index] = "0"; - } else { - isDirectlyDisplayValue[index] = "3"; - isDirectlyDisplayKey[index] = "0"; - } - } else { - isDirectlyDisplayValue[index] = "-1"; - isDirectlyDisplayKey[index] = "-1"; - } - } + result.data.forEach((itemInfo, index) => { + allItemInfo.push(itemInfo); + isAllItemInfoDirectlyDisplayValue[index] = determineDisplayValue(itemInfo.value, itemInfoSearchValue); + isAllItemInfoDirectlyDisplayKey[index] = determineDisplayKey(itemInfo.key, ''); }); }else if(!($scope.itemInfoSearchKey === '') && ($scope.itemInfoSearchValue === '')){ $scope.needToBeHighlightedKey = $scope.itemInfoSearchKey; $scope.needToBeHighlightedValue = ''; - result.forEach((iteminfo, index) => { - itemInfo.push(iteminfo); - if(iteminfo.key === $scope.needToBeHighlightedKey){ - isDirectlyDisplayValue[index] = "0"; - isDirectlyDisplayKey[index] = "0"; - }else{ - isDirectlyDisplayValue[index] = "0"; - isDirectlyDisplayKey[index] = "-1"; - } - + result.data.forEach((itemInfo, index) => { + allItemInfo.push(itemInfo); + isAllItemInfoDirectlyDisplayKey[index] = determineDisplayKey(itemInfo.key, itemInfoSearchKey); + isAllItemInfoDirectlyDisplayValue[index] = '0'; }); }else{ $scope.needToBeHighlightedKey = $scope.itemInfoSearchKey; $scope.needToBeHighlightedValue = $scope.itemInfoSearchValue; - result.forEach((iteminfo, index) => { - itemInfo.push(iteminfo); - if(iteminfo.key === $scope.needToBeHighlightedKey){ - isDirectlyDisplayKey[index] = "0"; - if(iteminfo.value === $scope.needToBeHighlightedValue){ - isDirectlyDisplayValue[index] = "0"; - }else{ - let position = iteminfo.value.indexOf($scope.needToBeHighlightedValue); - if (position !== -1) { - if (position === 0) { - isDirectlyDisplayValue[index] = "1"; - } else if (position + $scope.needToBeHighlightedValue.length === iteminfo.value.length) { - isDirectlyDisplayValue[index] = "2"; - } else { - isDirectlyDisplayValue[index] = "3"; - } - } else { - isDirectlyDisplayValue[index] = "-1"; - isDirectlyDisplayKey[index] = "-1"; - } - } - }else{ - isDirectlyDisplayKey[index] = "-1"; - if(iteminfo.value === $scope.needToBeHighlightedValue){ - isDirectlyDisplayValue[index] = "0"; - }else{ - let position = iteminfo.value.indexOf($scope.needToBeHighlightedValue); - if (position !== -1) { - if (position === 0) { - isDirectlyDisplayValue[index] = "1"; - } else if (position + $scope.needToBeHighlightedValue.length === iteminfo.value.length) { - isDirectlyDisplayValue[index] = "2"; - } else { - isDirectlyDisplayValue[index] = "3"; - } - } else { - isDirectlyDisplayValue[index] = "-1"; - isDirectlyDisplayKey[index] = "-1"; - } - } - } + result.data.forEach((itemInfo, index) => { + allItemInfo.push(itemInfo); + isAllItemInfoDirectlyDisplayValue[index] = determineDisplayValue(itemInfo.value, itemInfoSearchValue); + isAllItemInfoDirectlyDisplayKey[index] = determineDisplayKey(itemInfo.key, itemInfoSearchKey); }); } - $scope.totalItems = itemInfo.length; - $scope.allItemInfo = itemInfo; + $scope.totalItems = allItemInfo.length; + $scope.allItemInfo = allItemInfo; $scope.totalPages = Math.ceil($scope.totalItems / parseInt($scope.pageSize, 10)); const startIndex = ($scope.currentPage - 1) * parseInt($scope.pageSize, 10); - const endIndex = Math.min(startIndex + parseInt($scope.pageSize, 10), itemInfo.length); - $scope.pageItemInfo = itemInfo.slice(startIndex, endIndex); - $scope.isDirectlyDisplayValue = isDirectlyDisplayValue; - $scope.isDirectlyDisplayKey = isDirectlyDisplayKey; + const endIndex = Math.min(startIndex + parseInt($scope.pageSize, 10), allItemInfo.length); + $scope.pageItemInfo = allItemInfo.slice(startIndex, endIndex); + $scope.isAllItemInfoDirectlyDisplayValue = isAllItemInfoDirectlyDisplayValue; + $scope.isAllItemInfoDirectlyDisplayKey = isAllItemInfoDirectlyDisplayKey; + $scope.isPageItemInfoDirectlyDisplayValue = isAllItemInfoDirectlyDisplayValue.slice(startIndex, endIndex); + $scope.isPageItemInfoDirectlyDisplayKey = isAllItemInfoDirectlyDisplayKey.slice(startIndex, endIndex); getPagesArray(); + if(result.hasMoreData){ + toastr.warning(result.message, $translate.instant('Item.GlobalSearch.Tips')); + } } function handleError(error) { @@ -198,9 +141,15 @@ function GlobalSearchValueController($scope, $window, $translate, toastr, AppUti if (page >= 1 && page <= $scope.totalPages) { $scope.currentPage = page; $scope.isShowHighlightKeyword = []; + $scope.isPageItemInfoDirectlyDisplayKey = []; + $scope.isPageItemInfoDirectlyDisplayValue = []; + $scope.itemInfoSearchKey = $scope.tempKey; + $scope.itemInfoSearchValue = $scope.tempValue; const startIndex = ($scope.currentPage - 1)* parseInt($scope.pageSize, 10); const endIndex = Math.min(startIndex + parseInt($scope.pageSize, 10), $scope.totalItems); $scope.pageItemInfo = $scope.allItemInfo.slice(startIndex, endIndex); + $scope.isPageItemInfoDirectlyDisplayValue = $scope.isAllItemInfoDirectlyDisplayValue.slice(startIndex, endIndex); + $scope.isPageItemInfoDirectlyDisplayKey = $scope.isAllItemInfoDirectlyDisplayKey.slice(startIndex, endIndex); getPagesArray(); } } @@ -240,6 +189,19 @@ function GlobalSearchValueController($scope, $window, $translate, toastr, AppUti $scope.pagesArray = pagesArray; } + function determineDisplayValue(value, highlight) { + if (value === highlight) return '0'; + const position = value.indexOf(highlight); + if (position === -1) return '-1'; + if (position === 0) return '1'; + if (position + highlight.length === value.length) return '2'; + return "3"; + } + + function determineDisplayKey(key, highlight) { + return key === highlight ? '0' : '-1'; + } + function jumpToTheEditingPage(appid,env,cluster){ let url = AppUtil.prefixPath() + "/config.html#/appid=" + appid + "&" +"env=" + env + "&" + "cluster=" + cluster; window.open(url, '_blank'); diff --git a/apollo-portal/src/main/resources/static/scripts/services/GlobalSearchValueService.js b/apollo-portal/src/main/resources/static/scripts/services/GlobalSearchValueService.js index 5be647e3c89..52a345449b7 100644 --- a/apollo-portal/src/main/resources/static/scripts/services/GlobalSearchValueService.js +++ b/apollo-portal/src/main/resources/static/scripts/services/GlobalSearchValueService.js @@ -17,7 +17,7 @@ appService.service('GlobalSearchValueService', ['$resource', '$q', 'AppUtil', function ($resource, $q, AppUtil) { let global_search_resource = $resource('', {}, { get_item_Info_by_key_and_Value: { - isArray: true, + isArray: false, method: 'GET', url: AppUtil.prefixPath() + '/global-search/item-info/by-key-or-value', params: { diff --git a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueControllerTest.java b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueControllerTest.java index 29b83d05fb9..9a4bd8d74d3 100644 --- a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueControllerTest.java +++ b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueControllerTest.java @@ -37,11 +37,14 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import com.fasterxml.jackson.databind.ObjectMapper; @RunWith(MockitoJUnitRunner.class) public class GlobalSearchValueControllerTest { @@ -90,16 +93,57 @@ public void testGet_ItemInfo_BySearch_WithNoActiveEnvs_ReturnBadRequestAndTips() public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnEmptyItemInfos() throws Exception { activeEnvs.add(Env.DEV); when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(any(Env.class), anyString(), anyString())).thenReturn(new ArrayList<>()); + List allEnvMockItemInfos = new ArrayList<>(); + ObjectMapper objectMapper = new ObjectMapper(); + Map body = new HashMap<>(); + body.put("data", allEnvMockItemInfos); + body.put("hasMoreData", false); mockMvc.perform(MockMvcRequestBuilders.get("/global-search/item-info/by-key-or-value") .contentType(MediaType.APPLICATION_JSON) .param("key", "query-key") .param("value", "query-value")) .andExpect(status().isOk()) - .andExpect(content().json(String.valueOf(new ArrayList<>()))); + .andExpect(content().json(objectMapper.writeValueAsString(body))); verify(portalSettings,times(1)).getActiveEnvs(); verify(globalSearchValueService,times(1)).get_PerEnv_ItemInfo_BySearch(any(Env.class), anyString(), anyString()); } + @Test + public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnExpectedItemInfos_ButOverPerEnvLimit() throws Exception { + activeEnvs.add(Env.DEV); + activeEnvs.add(Env.PRO); + List devMockItemInfos = new ArrayList<>(); + List proMockItemInfos = new ArrayList<>(); + List allEnvMockItemInfos = new ArrayList<>(); + devMockItemInfos.add(new ItemInfo("appid1","env1","cluster1","namespace1","status1","query-key","query-value")); + proMockItemInfos.add(new ItemInfo("appid2","env2","cluster2","namespace2","status2","query-key","query-value")); + when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value"))).thenReturn(devMockItemInfos); + when(globalSearchValueService.count_PerEnv_ItemInfoNum_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value"))).thenReturn(201); + when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value"))).thenReturn(proMockItemInfos); + when(globalSearchValueService.count_PerEnv_ItemInfoNum_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value"))).thenReturn(202); + allEnvMockItemInfos.addAll(devMockItemInfos); + allEnvMockItemInfos.addAll(proMockItemInfos); + ObjectMapper objectMapper = new ObjectMapper(); + Map body = new HashMap<>(); + body.put("data", allEnvMockItemInfos); + body.put("hasMoreData", true); + String message = "In DEV , PRO , more than 200 items found (Exceeded the maximum search quantity for a single environment). Please enter more precise criteria to narrow down the search scope."; + body.put("message", message); + mockMvc.perform(MockMvcRequestBuilders.get("/global-search/item-info/by-key-or-value") + .contentType(MediaType.APPLICATION_JSON) + .param("key", "query-key") + .param("value", "query-value")) + .andExpect(status().isOk()) + .andExpect(content().json(objectMapper.writeValueAsString(body))); + verify(portalSettings,times(1)).getActiveEnvs(); + verify(globalSearchValueService, times(1)).get_PerEnv_ItemInfo_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value")); + verify(globalSearchValueService, times(1)).count_PerEnv_ItemInfoNum_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value")); + verify(globalSearchValueService, times(1)).get_PerEnv_ItemInfo_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value")); + verify(globalSearchValueService, times(1)).count_PerEnv_ItemInfoNum_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value")); + verify(globalSearchValueService, times(2)).get_PerEnv_ItemInfo_BySearch(any(Env.class), eq("query-key"), eq("query-value")); + verify(globalSearchValueService, times(2)).count_PerEnv_ItemInfoNum_BySearch(any(Env.class), eq("query-key"), eq("query-value")); + } + @Test public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnExpectedItemInfos() throws Exception { activeEnvs.add(Env.DEV); @@ -110,18 +154,27 @@ public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnExpecte devMockItemInfos.add(new ItemInfo("appid1","env1","cluster1","namespace1","status1","query-key","query-value")); proMockItemInfos.add(new ItemInfo("appid2","env2","cluster2","namespace2","status2","query-key","query-value")); when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value"))).thenReturn(devMockItemInfos); + when(globalSearchValueService.count_PerEnv_ItemInfoNum_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value"))).thenReturn(200); when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value"))).thenReturn(proMockItemInfos); + when(globalSearchValueService.count_PerEnv_ItemInfoNum_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value"))).thenReturn(199); allEnvMockItemInfos.addAll(devMockItemInfos); allEnvMockItemInfos.addAll(proMockItemInfos); + ObjectMapper objectMapper = new ObjectMapper(); + Map body = new HashMap<>(); + body.put("data", allEnvMockItemInfos); + body.put("hasMoreData", false); mockMvc.perform(MockMvcRequestBuilders.get("/global-search/item-info/by-key-or-value") .contentType(MediaType.APPLICATION_JSON) .param("key", "query-key") .param("value", "query-value")) .andExpect(status().isOk()) - .andExpect(content().json(new Gson().toJson(allEnvMockItemInfos))); + .andExpect(content().json(objectMapper.writeValueAsString(body))); verify(portalSettings,times(1)).getActiveEnvs(); verify(globalSearchValueService, times(1)).get_PerEnv_ItemInfo_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value")); + verify(globalSearchValueService, times(1)).count_PerEnv_ItemInfoNum_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value")); verify(globalSearchValueService, times(1)).get_PerEnv_ItemInfo_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value")); + verify(globalSearchValueService, times(1)).count_PerEnv_ItemInfoNum_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value")); verify(globalSearchValueService, times(2)).get_PerEnv_ItemInfo_BySearch(any(Env.class), eq("query-key"), eq("query-value")); + verify(globalSearchValueService, times(2)).count_PerEnv_ItemInfoNum_BySearch(any(Env.class), eq("query-key"), eq("query-value")); } } From 54d7aab10ccc44f30f807a0940be1d797ca70d47 Mon Sep 17 00:00:00 2001 From: xiaoxianhjy <2413421030@qq.com> Date: Fri, 30 Aug 2024 00:54:32 +0800 Subject: [PATCH 05/16] Optimized some issues --- .../controller/ItemController.java | 13 ++--- .../controller/ItemControllerTest.java | 22 +++++--- .../apollo/biz/repository/ItemRepository.java | 15 ++---- .../apollo/biz/service/ItemService.java | 23 +++----- .../apollo/biz/service/ItemServiceTest.java | 15 +++--- .../apollo/portal/api/AdminServiceAPI.java | 22 ++++---- .../portal/component/config/PortalConfig.java | 2 + .../GlobalSearchValueController.java | 17 +++--- .../service/GlobalSearchValueService.java | 14 +++-- .../GlobalSearchValueControllerTest.java | 52 +++++++++---------- .../service/GlobalSearchValueServiceTest.java | 21 +++++--- 11 files changed, 102 insertions(+), 114 deletions(-) diff --git a/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ItemController.java b/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ItemController.java index 3cbcb524ce1..23441390b05 100644 --- a/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ItemController.java +++ b/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ItemController.java @@ -203,15 +203,10 @@ public List findDeletedItems(@PathVariable("appId") String appId, } @GetMapping("/items-search/key-and-value") - public List getItemInfoBySearch(@RequestParam(value = "key", required = false) String key, - @RequestParam(value = "value", required = false) String value) { - return itemService.getItemInfoBySearch(key, value); - } - - @GetMapping("/items-search/key-and-value/count") - public int countItemInfoNumBySearch(@RequestParam(value = "key", required = false) String key, - @RequestParam(value = "value", required = false) String value) { - return itemService.countItemInfoNumBySearch(key, value); + public PageDTO getItemInfoBySearch(@RequestParam(value = "key", required = false) String key, + @RequestParam(value = "value", required = false) String value, + Pageable limit) { + return new PageDTO<>(itemService.getItemInfoBySearch(key, value, limit).getContent(), limit, itemService.getItemInfoBySearch(key, value, limit).getTotalElements()); } @GetMapping("/items/{itemId}") diff --git a/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ItemControllerTest.java b/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ItemControllerTest.java index 85cde0b8e7a..7581258fba5 100644 --- a/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ItemControllerTest.java +++ b/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ItemControllerTest.java @@ -30,9 +30,11 @@ import org.junit.Assert; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; +import org.springframework.http.*; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql.ExecutionPhase; @@ -162,10 +164,16 @@ public void testSearch() { String itemKey = "test-key"; String itemValue = "test-value"; - List itemInfoDTOS = itemService.getItemInfoBySearch(itemKey, itemValue); - String searchUrl = url("/items-search/key-and-value?key={key}&value={value}"); - ItemInfoDTO[] resultArray = restTemplate.getForObject(searchUrl, ItemInfoDTO[].class, itemKey, itemValue); - List expectedResult = Arrays.asList(resultArray); - assertThat(itemInfoDTOS.toString()).isEqualTo(expectedResult.toString()); + Page itemInfoDTOS = itemService.getItemInfoBySearch(itemKey, itemValue, PageRequest.of(0, 200)); + HttpHeaders headers = new HttpHeaders(); + HttpEntity entity = new HttpEntity<>(headers); + ResponseEntity> response = restTemplate.exchange( + url("/items-search/key-and-value?key={key}&value={value}&page={page}&size={size}"), + HttpMethod.GET, + entity, + new ParameterizedTypeReference>() {}, + itemKey, itemValue, 0, 200 + ); + assertThat(itemInfoDTOS.getContent().toString()).isEqualTo(response.getBody().getContent().toString()); } } diff --git a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ItemRepository.java b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ItemRepository.java index a652fdaae76..c866b902814 100644 --- a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ItemRepository.java +++ b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ItemRepository.java @@ -48,26 +48,17 @@ public interface ItemRepository extends PagingAndSortingRepository { @Query("SELECT new com.ctrip.framework.apollo.common.dto.ItemInfoDTO(n.appId, n.clusterName, n.namespaceName, i.key, i.value) " + "FROM Item i RIGHT JOIN Namespace n ON i.namespaceId = n.id " + "WHERE i.key LIKE %:key% AND i.value LIKE %:value% AND i.isDeleted = 0") - List findItemsByKeyAndValueLike(@Param("key") String key, @Param("value") String value, Pageable pageable); + Page findItemsByKeyAndValueLike(@Param("key") String key, @Param("value") String value, Pageable pageable); @Query("SELECT new com.ctrip.framework.apollo.common.dto.ItemInfoDTO(n.appId, n.clusterName, n.namespaceName, i.key, i.value) " + "FROM Item i RIGHT JOIN Namespace n ON i.namespaceId = n.id " + "WHERE i.key LIKE %:key% AND i.isDeleted = 0") - List findItemsByKeyLike(@Param("key") String key, Pageable pageable); + Page findItemsByKeyLike(@Param("key") String key, Pageable pageable); @Query("SELECT new com.ctrip.framework.apollo.common.dto.ItemInfoDTO(n.appId, n.clusterName, n.namespaceName, i.key, i.value) " + "FROM Item i RIGHT JOIN Namespace n ON i.namespaceId = n.id " + "WHERE i.value LIKE %:value% AND i.isDeleted = 0") - List findItemsByValueLike(@Param("value") String value, Pageable pageable); - - @Query("SELECT COUNT(i) FROM Item i RIGHT JOIN Namespace n ON i.namespaceId = n.id WHERE i.key LIKE %:key% AND i.isDeleted = 0") - int countItemNumByKeyLike(@Param("key") String key); - - @Query("SELECT COUNT(i) FROM Item i RIGHT JOIN Namespace n ON i.namespaceId = n.id WHERE i.value LIKE %:value% AND i.isDeleted = 0") - int countItemNumByValueLike(@Param("value") String value); - - @Query("SELECT COUNT(i) FROM Item i RIGHT JOIN Namespace n ON i.namespaceId = n.id WHERE i.key LIKE %:key% AND i.value LIKE %:value% AND i.isDeleted = 0") - int countItemNumByKeyAndValueLike(@Param("key") String key, @Param("value") String value); + Page findItemsByValueLike(@Param("value") String value, Pageable pageable); @Modifying @Query("update Item set IsDeleted = true, DeletedAt = ROUND(UNIX_TIMESTAMP(NOW(4))*1000), DataChange_LastModifiedBy = ?2 where NamespaceId = ?1 and IsDeleted = false") diff --git a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemService.java b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemService.java index 586638d9871..d5efed3b3d6 100644 --- a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemService.java +++ b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemService.java @@ -152,19 +152,18 @@ public Page findItemsByNamespace(String appId, String clusterName, String return itemRepository.findByNamespaceId(namespace.getId(), pageable); } - public List getItemInfoBySearch(String key, String value) { - List itemInfoDTOs; - Pageable pageable = PageRequest.of(0,200); + public Page getItemInfoBySearch(String key, String value, Pageable limit) { + Page itemInfoDTOs; if (key.isEmpty() && !value.isEmpty()) { - itemInfoDTOs = itemRepository.findItemsByValueLike(value, pageable); + itemInfoDTOs = itemRepository.findItemsByValueLike(value, limit); } else if (value.isEmpty() && !key.isEmpty()) { - itemInfoDTOs = itemRepository.findItemsByKeyLike(key, pageable); + itemInfoDTOs = itemRepository.findItemsByKeyLike(key, limit); } else { - itemInfoDTOs = itemRepository.findItemsByKeyAndValueLike(key, value, pageable); + itemInfoDTOs = itemRepository.findItemsByKeyAndValueLike(key, value, limit); } List releaseItems = releaseRepository.findAll(); - for (ItemInfoDTO itemInfoDTO : itemInfoDTOs) { + for (ItemInfoDTO itemInfoDTO : itemInfoDTOs.getContent()) { boolean isIncluded = false; for (Release releaseItem : releaseItems) { if (releaseItem.getConfigurations().contains(itemInfoDTO.getKey()) && releaseItem.getConfigurations().contains(itemInfoDTO.getValue())) { @@ -180,16 +179,6 @@ public List getItemInfoBySearch(String key, String value) { return itemInfoDTOs; } - public int countItemInfoNumBySearch(String key, String value){ - if (key.isEmpty() && !value.isEmpty()) { - return itemRepository.countItemNumByValueLike(value); - } else if (value.isEmpty() && !key.isEmpty()) { - return itemRepository.countItemNumByKeyLike(key); - } else { - return itemRepository.countItemNumByKeyAndValueLike(key, value); - } - } - @Transactional public Item save(Item entity) { checkItemKeyLength(entity.getKey()); diff --git a/apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/ItemServiceTest.java b/apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/ItemServiceTest.java index e23d6dede4e..70f885421f6 100644 --- a/apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/ItemServiceTest.java +++ b/apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/ItemServiceTest.java @@ -23,6 +23,8 @@ import org.junit.Assert; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.test.context.jdbc.Sql; import java.util.List; @@ -88,12 +90,13 @@ public void testSearchItem() { String itemKey = "k1"; String itemValue = "v1"; - List ExpectedItemInfoDTOSByKeyAndValue = itemService.getItemInfoBySearch(itemKey,itemValue); - List ExpectedItemInfoDTOSByKey = itemService.getItemInfoBySearch(itemKey,""); - List ExpectedItemInfoDTOSByValue = itemService.getItemInfoBySearch("",itemValue); - Assert.assertEquals(itemInfoDTO.toString(), ExpectedItemInfoDTOSByKeyAndValue.get(0).toString()); - Assert.assertEquals(itemInfoDTO.toString(), ExpectedItemInfoDTOSByKey.get(0).toString()); - Assert.assertEquals(itemInfoDTO.toString(), ExpectedItemInfoDTOSByValue.get(0).toString()); + Page ExpectedItemInfoDTOSByKeyAndValue = itemService.getItemInfoBySearch(itemKey, itemValue, PageRequest.of(0,200)); + Page ExpectedItemInfoDTOSByKey = itemService.getItemInfoBySearch(itemKey,"", PageRequest.of(0,200)); + Page ExpectedItemInfoDTOSByValue = itemService.getItemInfoBySearch("", itemValue, PageRequest.of(0,200)); + Assert.assertEquals(itemInfoDTO.toString(), ExpectedItemInfoDTOSByKeyAndValue.getContent().get(0).toString()); + Assert.assertEquals(itemInfoDTO.toString(), ExpectedItemInfoDTOSByKey.getContent().get(0).toString()); + Assert.assertEquals(itemInfoDTO.toString(), ExpectedItemInfoDTOSByValue.getContent().get(0).toString()); + } } diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java index 8856e7bfbb5..b8035aae7a2 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java @@ -184,6 +184,9 @@ public static class ItemAPI extends API { private final ParameterizedTypeReference> openItemPageDTO = new ParameterizedTypeReference>() {}; + private final ParameterizedTypeReference> pageItemInfoDTO = + new ParameterizedTypeReference>() {}; + public List findItems(String appId, Env env, String clusterName, String namespaceName) { ItemDTO[] itemDTOs = restTemplate.get(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/items", @@ -198,18 +201,13 @@ public List findDeletedItems(String appId, Env env, String clusterName, return Arrays.asList(itemDTOs); } - public List getPerEnvItemInfoBySearch(Env env, String key, String value){ - ItemInfoDTO[] perEnvItemInfoDTOs = - restTemplate.get(env, "items-search/key-and-value?key={key}&value={value}", - ItemInfoDTO[].class, key, value); - return Arrays.asList(perEnvItemInfoDTOs); - } - - public int countPerEnvItemInfoNumBySearch(Env env, String key, String value){ - Integer count = - restTemplate.get(env, "items-search/key-and-value/count?key={key}&value={value}", - Integer.class, key, value); - return count == null ? 0 : count; + public PageDTO getPerEnvItemInfoBySearch(Env env, String key, String value, int page, int size){ + ResponseEntity> + entity = + restTemplate.get(env, + "items-search/key-and-value?key={key}&value={value}&page={page}&size={size}", + pageItemInfoDTO, key, value, page, size); + return entity.getBody(); } public ItemDTO loadItem(Env env, String appId, String clusterName, String namespaceName, String key) { diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/component/config/PortalConfig.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/component/config/PortalConfig.java index 93b9e93daf2..a5a4a9d81ea 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/component/config/PortalConfig.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/component/config/PortalConfig.java @@ -86,6 +86,8 @@ public List portalSupportedEnvs() { return envs; } + public int getPerEnvSearchMaxResults() {return getIntProperty("apollo.portal.search.perEnvMaxResults", 200);} + /** * @return the relationship between environment and its meta server. empty if meet exception */ diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueController.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueController.java index ba34e34483f..9b30f882842 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueController.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueController.java @@ -17,7 +17,9 @@ package com.ctrip.framework.apollo.portal.controller; +import com.ctrip.framework.apollo.common.dto.PageDTO; import com.ctrip.framework.apollo.portal.component.PortalSettings; +import com.ctrip.framework.apollo.portal.component.config.PortalConfig; import com.ctrip.framework.apollo.portal.entity.vo.ItemInfo; import com.ctrip.framework.apollo.portal.environment.Env; import com.ctrip.framework.apollo.portal.service.GlobalSearchValueService; @@ -39,14 +41,14 @@ @RestController public class GlobalSearchValueController { - private final PortalSettings portalSettings; private final GlobalSearchValueService globalSearchValueService; - private static final int MAX_SEARCH_RESULTS = 200; + private final PortalConfig portalConfig; - public GlobalSearchValueController(final PortalSettings portalSettings, final GlobalSearchValueService globalSearchValueService) { + public GlobalSearchValueController(final PortalSettings portalSettings, final GlobalSearchValueService globalSearchValueService, final PortalConfig portalConfig) { this.portalSettings = portalSettings; this.globalSearchValueService = globalSearchValueService; + this.portalConfig = portalConfig; } @PreAuthorize(value = "@permissionValidator.isSuperAdmin()") @@ -74,13 +76,12 @@ public ResponseEntity get_ItemInfo_BySearch(@RequestParam(value = "key", requ List envBeyondLimit = new ArrayList<>(); AtomicBoolean hasMoreData = new AtomicBoolean(false); activeEnvs.forEach(env -> { - List perEnvItemInfos = globalSearchValueService.get_PerEnv_ItemInfo_BySearch(env, key, value); - int perEnvItemInfoNum = globalSearchValueService.count_PerEnv_ItemInfoNum_BySearch(env, key, value); - if(perEnvItemInfoNum > MAX_SEARCH_RESULTS){ + PageDTO perEnvItemInfos = globalSearchValueService.get_PerEnv_ItemInfo_BySearch(env, key, value,0, portalConfig.getPerEnvSearchMaxResults()); + if(perEnvItemInfos.getTotal() > portalConfig.getPerEnvSearchMaxResults()){ envBeyondLimit.add(env.getName()); hasMoreData.set(true); } - allEnvItemInfos.addAll(perEnvItemInfos); + allEnvItemInfos.addAll(perEnvItemInfos.getContent()); }); Map body = new HashMap<>(); @@ -89,7 +90,7 @@ public ResponseEntity get_ItemInfo_BySearch(@RequestParam(value = "key", requ body.put("hasMoreData", true); body.put("message", String.format( "In %s , more than %d items found (Exceeded the maximum search quantity for a single environment). Please enter more precise criteria to narrow down the search scope.", - String.join(" , ", envBeyondLimit), MAX_SEARCH_RESULTS)); + String.join(" , ", envBeyondLimit), portalConfig.getPerEnvSearchMaxResults())); return ResponseEntity .ok() .contentType(MediaType.APPLICATION_JSON) diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueService.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueService.java index ac0b7554685..b223c56e722 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueService.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueService.java @@ -17,9 +17,11 @@ package com.ctrip.framework.apollo.portal.service; import com.ctrip.framework.apollo.common.dto.ItemInfoDTO; +import com.ctrip.framework.apollo.common.dto.PageDTO; import com.ctrip.framework.apollo.portal.api.AdminServiceAPI; import com.ctrip.framework.apollo.portal.entity.vo.ItemInfo; import com.ctrip.framework.apollo.portal.environment.Env; +import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -34,18 +36,14 @@ public GlobalSearchValueService(AdminServiceAPI.ItemAPI itemAPI) { this.itemAPI = itemAPI; } - public List get_PerEnv_ItemInfo_BySearch(Env env, String key, String value) { + public PageDTO get_PerEnv_ItemInfo_BySearch(Env env, String key, String value, int page, int size) { List perEnvItemInfos = new ArrayList<>(); - List perEnvItemInfoDTOs = itemAPI.getPerEnvItemInfoBySearch(env, key, value); - perEnvItemInfoDTOs.forEach(itemInfoDTO -> { + PageDTO perEnvItemInfoDTOs = itemAPI.getPerEnvItemInfoBySearch(env, key, value, page, size); + perEnvItemInfoDTOs.getContent().forEach(itemInfoDTO -> { ItemInfo itemInfo = new ItemInfo(itemInfoDTO.getAppId(),env.getName(),itemInfoDTO.getClusterName(),itemInfoDTO.getNamespaceName(),itemInfoDTO.getStatus(),itemInfoDTO.getKey(),itemInfoDTO.getValue()); perEnvItemInfos.add(itemInfo); }); - return perEnvItemInfos; - } - - public int count_PerEnv_ItemInfoNum_BySearch(Env env, String key, String value){ - return itemAPI.countPerEnvItemInfoNumBySearch(env, key, value); + return new PageDTO<>(perEnvItemInfos, PageRequest.of(page, size), perEnvItemInfoDTOs.getTotal()); } } diff --git a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueControllerTest.java b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueControllerTest.java index 9a4bd8d74d3..b7d799f3a05 100644 --- a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueControllerTest.java +++ b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueControllerTest.java @@ -20,7 +20,9 @@ * @author hujiyuan 2024-08-10 */ +import com.ctrip.framework.apollo.common.dto.PageDTO; import com.ctrip.framework.apollo.portal.component.PortalSettings; +import com.ctrip.framework.apollo.portal.component.config.PortalConfig; import com.ctrip.framework.apollo.portal.entity.vo.ItemInfo; import com.ctrip.framework.apollo.portal.environment.Env; import com.ctrip.framework.apollo.portal.service.GlobalSearchValueService; @@ -31,15 +33,13 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.data.domain.PageRequest; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; @@ -54,6 +54,9 @@ public class GlobalSearchValueControllerTest { @Mock private PortalSettings portalSettings; + @Mock + private PortalConfig portalConfig; + @Mock private GlobalSearchValueService globalSearchValueService; @@ -62,9 +65,12 @@ public class GlobalSearchValueControllerTest { private final List activeEnvs = new ArrayList<>(); + private final int perEnvSearchMaxResults = 200; + @Before public void setUp() { when(portalSettings.getActiveEnvs()).thenReturn(activeEnvs); + when(portalConfig.getPerEnvSearchMaxResults()).thenReturn(perEnvSearchMaxResults); mockMvc = MockMvcBuilders.standaloneSetup(globalSearchValueController).build(); } @@ -92,7 +98,7 @@ public void testGet_ItemInfo_BySearch_WithNoActiveEnvs_ReturnBadRequestAndTips() @Test public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnEmptyItemInfos() throws Exception { activeEnvs.add(Env.DEV); - when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(any(Env.class), anyString(), anyString())).thenReturn(new ArrayList<>()); + when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(any(Env.class), anyString(), anyString(),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(new ArrayList<>(), PageRequest.of(0,1), 0L)); List allEnvMockItemInfos = new ArrayList<>(); ObjectMapper objectMapper = new ObjectMapper(); Map body = new HashMap<>(); @@ -105,7 +111,8 @@ public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnEmptyIt .andExpect(status().isOk()) .andExpect(content().json(objectMapper.writeValueAsString(body))); verify(portalSettings,times(1)).getActiveEnvs(); - verify(globalSearchValueService,times(1)).get_PerEnv_ItemInfo_BySearch(any(Env.class), anyString(), anyString()); + verify(portalConfig,times(2)).getPerEnvSearchMaxResults(); + verify(globalSearchValueService,times(1)).get_PerEnv_ItemInfo_BySearch(any(Env.class), anyString(), anyString(),eq(0),eq(perEnvSearchMaxResults)); } @Test @@ -117,17 +124,15 @@ public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnExpecte List allEnvMockItemInfos = new ArrayList<>(); devMockItemInfos.add(new ItemInfo("appid1","env1","cluster1","namespace1","status1","query-key","query-value")); proMockItemInfos.add(new ItemInfo("appid2","env2","cluster2","namespace2","status2","query-key","query-value")); - when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value"))).thenReturn(devMockItemInfos); - when(globalSearchValueService.count_PerEnv_ItemInfoNum_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value"))).thenReturn(201); - when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value"))).thenReturn(proMockItemInfos); - when(globalSearchValueService.count_PerEnv_ItemInfoNum_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value"))).thenReturn(202); + when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(devMockItemInfos, PageRequest.of(0,1), 201L)); + when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(proMockItemInfos, PageRequest.of(0,1), 201L)); allEnvMockItemInfos.addAll(devMockItemInfos); allEnvMockItemInfos.addAll(proMockItemInfos); ObjectMapper objectMapper = new ObjectMapper(); Map body = new HashMap<>(); body.put("data", allEnvMockItemInfos); body.put("hasMoreData", true); - String message = "In DEV , PRO , more than 200 items found (Exceeded the maximum search quantity for a single environment). Please enter more precise criteria to narrow down the search scope."; + String message = "In DEV , PRO , more than "+perEnvSearchMaxResults+" items found (Exceeded the maximum search quantity for a single environment). Please enter more precise criteria to narrow down the search scope."; body.put("message", message); mockMvc.perform(MockMvcRequestBuilders.get("/global-search/item-info/by-key-or-value") .contentType(MediaType.APPLICATION_JSON) @@ -136,12 +141,10 @@ public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnExpecte .andExpect(status().isOk()) .andExpect(content().json(objectMapper.writeValueAsString(body))); verify(portalSettings,times(1)).getActiveEnvs(); - verify(globalSearchValueService, times(1)).get_PerEnv_ItemInfo_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value")); - verify(globalSearchValueService, times(1)).count_PerEnv_ItemInfoNum_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value")); - verify(globalSearchValueService, times(1)).get_PerEnv_ItemInfo_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value")); - verify(globalSearchValueService, times(1)).count_PerEnv_ItemInfoNum_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value")); - verify(globalSearchValueService, times(2)).get_PerEnv_ItemInfo_BySearch(any(Env.class), eq("query-key"), eq("query-value")); - verify(globalSearchValueService, times(2)).count_PerEnv_ItemInfoNum_BySearch(any(Env.class), eq("query-key"), eq("query-value")); + verify(portalConfig,times(5)).getPerEnvSearchMaxResults(); + verify(globalSearchValueService, times(1)).get_PerEnv_ItemInfo_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); + verify(globalSearchValueService, times(1)).get_PerEnv_ItemInfo_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); + verify(globalSearchValueService, times(2)).get_PerEnv_ItemInfo_BySearch(any(Env.class), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); } @Test @@ -153,10 +156,8 @@ public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnExpecte List allEnvMockItemInfos = new ArrayList<>(); devMockItemInfos.add(new ItemInfo("appid1","env1","cluster1","namespace1","status1","query-key","query-value")); proMockItemInfos.add(new ItemInfo("appid2","env2","cluster2","namespace2","status2","query-key","query-value")); - when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value"))).thenReturn(devMockItemInfos); - when(globalSearchValueService.count_PerEnv_ItemInfoNum_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value"))).thenReturn(200); - when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value"))).thenReturn(proMockItemInfos); - when(globalSearchValueService.count_PerEnv_ItemInfoNum_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value"))).thenReturn(199); + when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(devMockItemInfos, PageRequest.of(0,1), 1L)); + when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(proMockItemInfos, PageRequest.of(0,1), 1L)); allEnvMockItemInfos.addAll(devMockItemInfos); allEnvMockItemInfos.addAll(proMockItemInfos); ObjectMapper objectMapper = new ObjectMapper(); @@ -170,11 +171,8 @@ public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnExpecte .andExpect(status().isOk()) .andExpect(content().json(objectMapper.writeValueAsString(body))); verify(portalSettings,times(1)).getActiveEnvs(); - verify(globalSearchValueService, times(1)).get_PerEnv_ItemInfo_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value")); - verify(globalSearchValueService, times(1)).count_PerEnv_ItemInfoNum_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value")); - verify(globalSearchValueService, times(1)).get_PerEnv_ItemInfo_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value")); - verify(globalSearchValueService, times(1)).count_PerEnv_ItemInfoNum_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value")); - verify(globalSearchValueService, times(2)).get_PerEnv_ItemInfo_BySearch(any(Env.class), eq("query-key"), eq("query-value")); - verify(globalSearchValueService, times(2)).count_PerEnv_ItemInfoNum_BySearch(any(Env.class), eq("query-key"), eq("query-value")); + verify(globalSearchValueService, times(1)).get_PerEnv_ItemInfo_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); + verify(globalSearchValueService, times(1)).get_PerEnv_ItemInfo_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); + verify(globalSearchValueService, times(2)).get_PerEnv_ItemInfo_BySearch(any(Env.class), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); } } diff --git a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueServiceTest.java b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueServiceTest.java index 2e72d88eb93..6c8b0804236 100644 --- a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueServiceTest.java +++ b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueServiceTest.java @@ -21,6 +21,7 @@ */ import com.ctrip.framework.apollo.common.dto.ItemInfoDTO; +import com.ctrip.framework.apollo.common.dto.PageDTO; import com.ctrip.framework.apollo.portal.api.AdminServiceAPI; import com.ctrip.framework.apollo.portal.entity.vo.ItemInfo; import com.ctrip.framework.apollo.portal.environment.Env; @@ -30,6 +31,7 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.data.domain.PageRequest; import java.util.ArrayList; import java.util.List; @@ -48,26 +50,29 @@ public class GlobalSearchValueServiceTest { @InjectMocks private GlobalSearchValueService globalSearchValueService; + private final int perEnvSearchMaxResults = 200; + @Test public void testGet_PerEnv_ItemInfo_BySearch_withKeyAndValue_ReturnExpectedItemInfos() { ItemInfoDTO itemInfoDTO = new ItemInfoDTO("TestApp","TestCluster","TestNamespace","1","TestKey","TestValue"); List mockItemInfoDTOs = new ArrayList<>(); mockItemInfoDTOs.add(itemInfoDTO); - Mockito.when(itemAPI.getPerEnvItemInfoBySearch(any(Env.class), eq("TestKey"), eq("TestValue"))).thenReturn(mockItemInfoDTOs); - List mockItemInfos = globalSearchValueService.get_PerEnv_ItemInfo_BySearch(Env.PRO, "TestKey", "TestValue"); - assertEquals(1, mockItemInfos.size()); + Mockito.when(itemAPI.getPerEnvItemInfoBySearch(any(Env.class), eq("TestKey"), eq("TestValue"), eq(0), eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(mockItemInfoDTOs, PageRequest.of(0, 1), 1L)); + PageDTO mockItemInfos = globalSearchValueService.get_PerEnv_ItemInfo_BySearch(Env.PRO, "TestKey", "TestValue", 0, 200); + assertEquals(1, mockItemInfos.getContent().size()); ItemInfo itemInfo = new ItemInfo("TestApp", Env.PRO.getName(), "TestCluster", "TestNamespace", "1", "TestKey", "TestValue"); List expectedResults = new ArrayList<>(); expectedResults.add(itemInfo); - verify(itemAPI,times(1)).getPerEnvItemInfoBySearch(any(Env.class), eq("TestKey"), eq("TestValue")); - assertEquals(expectedResults.toString(), mockItemInfos.toString()); + verify(itemAPI,times(1)).getPerEnvItemInfoBySearch(any(Env.class), eq("TestKey"), eq("TestValue"), eq(0), eq(perEnvSearchMaxResults)); + assertEquals(expectedResults.toString(), mockItemInfos.getContent().toString()); } @Test public void testGet_PerEnv_ItemInfo_withKeyAndValue_BySearch_ReturnEmptyItemInfos() { - Mockito.when(itemAPI.getPerEnvItemInfoBySearch(any(Env.class), anyString(), anyString())).thenReturn(new ArrayList<>()); - List result = globalSearchValueService.get_PerEnv_ItemInfo_BySearch(Env.PRO, "NonExistentKey", "NonExistentValue"); - assertEquals(0, result.size()); + Mockito.when(itemAPI.getPerEnvItemInfoBySearch(any(Env.class), anyString(), anyString(), eq(0), eq(perEnvSearchMaxResults))) + .thenReturn(new PageDTO<>(new ArrayList<>(), PageRequest.of(0, 1), 0L)); + PageDTO result = globalSearchValueService.get_PerEnv_ItemInfo_BySearch(Env.PRO, "NonExistentKey", "NonExistentValue", 0, 200); + assertEquals(0, result.getContent().size()); } } From f2466f140bc80e498c910e643bd457b5d26a4f14 Mon Sep 17 00:00:00 2001 From: xiaoxianhjy <2413421030@qq.com> Date: Mon, 2 Sep 2024 22:02:48 +0800 Subject: [PATCH 06/16] Added some relevant documents --- README.md | 11 +++----- .../controller/ItemController.java | 3 +- docs/en/README.md | 4 +++ docs/en/design/apollo-introduction.md | 6 ++++ ...n-of-global-search-configuration-items.png | Bin 0 -> 27530 bytes docs/en/portal/apollo-user-guide.md | 13 +++++++++ docs/zh/README.md | 4 +++ docs/zh/design/apollo-introduction.md | 26 ++++++++++-------- ...n-of-global-search-configuration-items.png | Bin 0 -> 27530 bytes docs/zh/portal/apollo-user-guide.md | 21 +++++++++++--- 10 files changed, 65 insertions(+), 23 deletions(-) create mode 100644 docs/en/images/System-parameterization-of-global-search-configuration-items.png create mode 100644 docs/zh/images/System-parameterization-of-global-search-configuration-items.png diff --git a/README.md b/README.md index 2dbe99867c3..6c52f9f9ec1 100644 --- a/README.md +++ b/README.md @@ -37,36 +37,33 @@ Demo Environment: * The same codebase could have different configurations when deployed in different clusters * With the namespace concept, it is easy to support multiple applications to share the same configurations, while also allowing them to customize the configurations * Multiple languages is provided in user interface(currently Chinese and English) - * **Configuration changes takes effect in real time (hot release)** * After the user modified the configuration and released it in Apollo, the sdk will receive the latest configurations in real time (1 second) and notify the application - * **Release version management** * Every configuration releases are versioned, which is friendly to support configuration rollback - * **Grayscale release** * Support grayscale configuration release, for example, after clicking release, it will only take effect for some application instances. After a period of observation, we could push the configurations to all application instances if there is no problem +- **Global Search Configuration Items** + - A fuzzy search of the key and value of a configuration item finds in which application, environment, cluster, namespace the configuration item with the corresponding value is used + - It is easy for administrators and SRE roles to quickly and easily find and change the configuration values of resources by highlighting, paging and jumping through configurations + * **Authorization management, release approval and operation audit** * Great authorization mechanism is designed for applications and configurations management, and the management of configurations is divided into two operations: editing and publishing, therefore greatly reducing human errors * All operations have audit logs for easy tracking of problems - * **Client side configuration information monitoring** * It's very easy to see which instances are using the configurations and what versions they are using - * **Rich SDKs available** * Provides native sdks of Java and .Net to facilitate application integration * Support Spring Placeholder, Annotation and Spring Boot ConfigurationProperties for easy application use (requires Spring 3.1.1+) * Http APIs are provided, so non-Java and .Net applications can integrate conveniently * Rich third party sdks are also available, e.g. Golang, Python, NodeJS, PHP, C, etc - * **Open platform API** * Apollo itself provides a unified configuration management interface, which supports features such as multi-environment, multi-data center configuration management, permissions, and process governance * However, for the sake of versatility, Apollo will not put too many restrictions on the modification of the configuration, as long as it conforms to the basic format, it can be saved. * In our research, we found that for some users, their configurations may have more complicated formats, such as xml, json, and the format needs to be verified * There are also some users such as DAL, which not only have a specific format, but also need to verify the entered value before saving, such as checking whether the database, username and password match * For this type of application, Apollo allows the application to modify and release configurations through open APIs, which has great authorization and permission control mechanism built in - * **Simple deployment** * As an infrastructure service, the configuration center has very high availability requirements, which forces Apollo to rely on external dependencies as little as possible * Currently, the only external dependency is MySQL, so the deployment is very simple. Apollo can run as long as Java and MySQL are installed diff --git a/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ItemController.java b/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ItemController.java index 23441390b05..f628748d2fa 100644 --- a/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ItemController.java +++ b/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ItemController.java @@ -206,7 +206,8 @@ public List findDeletedItems(@PathVariable("appId") String appId, public PageDTO getItemInfoBySearch(@RequestParam(value = "key", required = false) String key, @RequestParam(value = "value", required = false) String value, Pageable limit) { - return new PageDTO<>(itemService.getItemInfoBySearch(key, value, limit).getContent(), limit, itemService.getItemInfoBySearch(key, value, limit).getTotalElements()); + Page pageItemInfoDTO = itemService.getItemInfoBySearch(key, value, limit); + return new PageDTO<>(pageItemInfoDTO.getContent(), limit, pageItemInfoDTO.getTotalElements()); } @GetMapping("/items/{itemId}") diff --git a/docs/en/README.md b/docs/en/README.md index 46fb251756f..d76c4540aa2 100644 --- a/docs/en/README.md +++ b/docs/en/README.md @@ -37,6 +37,10 @@ Demo Environment: * **Grayscale release** * Support grayscale configuration release, for example, after clicking release, it will only take effect for some application instances. After a period of observation, we could push the configurations to all application instances if there is no problem +- **Global Search Configuration Items** + - A fuzzy search of the key and value of a configuration item finds in which application, environment, cluster, namespace the configuration item with the corresponding value is used + - It is easy for administrators and SRE roles to quickly and easily find and change the configuration values of resources by highlighting, paging and jumping through configurations + * **Authorization management, release approval and operation audit** * Great authorization mechanism is designed for applications and configurations management, and the management of configurations is divided into two operations: editing and publishing, therefore greatly reducing human errors * All operations have audit logs for easy tracking of problems diff --git a/docs/en/design/apollo-introduction.md b/docs/en/design/apollo-introduction.md index a001f5a3a81..f846e6be867 100644 --- a/docs/en/design/apollo-introduction.md +++ b/docs/en/design/apollo-introduction.md @@ -78,7 +78,13 @@ It is precisely based on the particularity of configuration that Apollo has been * **Client configuration information monitoring** * You can easily see which instances the configuration is being used on the interface +**Global Search Configuration Items** + +- A fuzzy search of the key and value of a configuration item finds in which application, environment, cluster, namespace the configuration item with the corresponding value is used +- It is easy for administrators and SRE roles to quickly and easily find and change the configuration values of resources by highlighting, paging and jumping through configurations + **Java and .Net native clients available** + * Provides native clients of Java and .Net for easy application integration * Support Spring Placeholder, Annotation and Spring Boot's ConfigurationProperties for easy application use (requires Spring 3.1.1+) * Also provides Http interface, non-Java and .Net applications can also be easily used diff --git a/docs/en/images/System-parameterization-of-global-search-configuration-items.png b/docs/en/images/System-parameterization-of-global-search-configuration-items.png new file mode 100644 index 0000000000000000000000000000000000000000..4f47b58cd7b79417467c0f70b24406427cd3825b GIT binary patch literal 27530 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 Date: Tue, 3 Sep 2024 11:30:33 +0800 Subject: [PATCH 07/16] Update docs/zh/portal/apollo-user-guide.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- docs/zh/portal/apollo-user-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/portal/apollo-user-guide.md b/docs/zh/portal/apollo-user-guide.md index 06433237c57..eb20574b544 100644 --- a/docs/zh/portal/apollo-user-guide.md +++ b/docs/zh/portal/apollo-user-guide.md @@ -466,7 +466,7 @@ Apollo从1.6.0版本开始增加访问密钥机制,从而只有经过身份验 请注意,修改系统参数可能会影响搜索功能的性能,因此在修改之前应该进行充分的测试,并确保理解参数的具体作用。 -![System-parameterization-of-global-search-configuration-items](D:\project\pr lastdelast\docs\zh\images\System-parameterization-of-global-search-configuration-items.png) +![System-parameterization-of-global-search-configuration-items](../images/System-parameterization-of-global-search-configuration-items.png) # 七、最佳实践 From fec2635025933da30509a06305b9f289541b8d93 Mon Sep 17 00:00:00 2001 From: xiaoxianhjy <162684719+xiaoxianhjy@users.noreply.github.com> Date: Tue, 3 Sep 2024 11:31:06 +0800 Subject: [PATCH 08/16] Update docs/zh/portal/apollo-user-guide.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- docs/zh/portal/apollo-user-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/portal/apollo-user-guide.md b/docs/zh/portal/apollo-user-guide.md index eb20574b544..ca014e70080 100644 --- a/docs/zh/portal/apollo-user-guide.md +++ b/docs/zh/portal/apollo-user-guide.md @@ -457,7 +457,7 @@ Apollo从1.6.0版本开始增加访问密钥机制,从而只有经过身份验 ## 6.3 全局搜索配置项的系统参数设置 -​ 从2.4.0版本开始,apollo-portal增加了全局搜索配置项的功能,通过对配置项的key与value进行的模糊检索,找到拥有对应值的配置项在哪个应用、环境、集群、命名空间中被使用。为了防止在进行配置项的全局视角搜索时出现内存溢出(OOM)的问题,我们引入了一个系统参数`apollo.portal.search.perEnvMaxResults`。这个参数用于限制每个环境配置项单次最大搜索结果的数量。默认情况下,这个值被设置为`200`,但管理员可以根据实际需求进行调整。 + 从2.4.0版本开始,apollo-portal增加了全局搜索配置项的功能,通过对配置项的key与value进行的模糊检索,找到拥有对应值的配置项在哪个应用、环境、集群、命名空间中被使用。为了防止在进行配置项的全局视角搜索时出现内存溢出(OOM)的问题,我们引入了一个系统参数`apollo.portal.search.perEnvMaxResults`。这个参数用于限制每个环境配置项单次最大搜索结果的数量。默认情况下,这个值被设置为`200`,但管理员可以根据实际需求进行调整。 **设置方法:** From 6dc57515cd7da20ef2a439df1b2b5065fef5830f Mon Sep 17 00:00:00 2001 From: xiaoxianhjy <162684719+xiaoxianhjy@users.noreply.github.com> Date: Tue, 3 Sep 2024 11:39:34 +0800 Subject: [PATCH 09/16] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 6c52f9f9ec1..a8c7fa3a241 100644 --- a/README.md +++ b/README.md @@ -43,11 +43,9 @@ Demo Environment: * Every configuration releases are versioned, which is friendly to support configuration rollback * **Grayscale release** * Support grayscale configuration release, for example, after clicking release, it will only take effect for some application instances. After a period of observation, we could push the configurations to all application instances if there is no problem - - **Global Search Configuration Items** - A fuzzy search of the key and value of a configuration item finds in which application, environment, cluster, namespace the configuration item with the corresponding value is used - It is easy for administrators and SRE roles to quickly and easily find and change the configuration values of resources by highlighting, paging and jumping through configurations - * **Authorization management, release approval and operation audit** * Great authorization mechanism is designed for applications and configurations management, and the management of configurations is divided into two operations: editing and publishing, therefore greatly reducing human errors * All operations have audit logs for easy tracking of problems From 4c34704edd7980100b861493b9eaab5412131e1c Mon Sep 17 00:00:00 2001 From: xiaoxianhjy <2413421030@qq.com> Date: Tue, 3 Sep 2024 17:54:17 +0800 Subject: [PATCH 10/16] Added usage documentation --- README.md | 6 ++--- .../distributed-deployment-guide.md | 14 +++++++--- docs/en/design/apollo-design.md | 2 +- .../Configuration query-Non properties.png | Bin 0 -> 39027 bytes .../images/Configuration query-properties.png | Bin 0 -> 39958 bytes docs/en/portal/apollo-user-guide.md | 14 ++++++++++ docs/zh/README.md | 6 ++--- .../distributed-deployment-guide.md | 8 ++++++ docs/zh/design/apollo-design.md | 2 +- docs/zh/design/apollo-introduction.md | 6 ++--- .../Configuration query-Non properties.png | Bin 0 -> 39027 bytes .../images/Configuration query-properties.png | Bin 0 -> 39958 bytes docs/zh/portal/apollo-user-guide.md | 24 ++++++++++++++---- 13 files changed, 63 insertions(+), 19 deletions(-) create mode 100644 docs/en/images/Configuration query-Non properties.png create mode 100644 docs/en/images/Configuration query-properties.png create mode 100644 docs/zh/images/Configuration query-Non properties.png create mode 100644 docs/zh/images/Configuration query-properties.png diff --git a/README.md b/README.md index a8c7fa3a241..3b1a1f7d7ce 100644 --- a/README.md +++ b/README.md @@ -43,9 +43,9 @@ Demo Environment: * Every configuration releases are versioned, which is friendly to support configuration rollback * **Grayscale release** * Support grayscale configuration release, for example, after clicking release, it will only take effect for some application instances. After a period of observation, we could push the configurations to all application instances if there is no problem -- **Global Search Configuration Items** - - A fuzzy search of the key and value of a configuration item finds in which application, environment, cluster, namespace the configuration item with the corresponding value is used - - It is easy for administrators and SRE roles to quickly and easily find and change the configuration values of resources by highlighting, paging and jumping through configurations +* **Global Search Configuration Items** + * A fuzzy search of the key and value of a configuration item finds in which application, environment, cluster, namespace the configuration item with the corresponding value is used + * It is easy for administrators and SRE roles to quickly and easily find and change the configuration values of resources by highlighting, paging and jumping through configurations * **Authorization management, release approval and operation audit** * Great authorization mechanism is designed for applications and configurations management, and the management of configurations is divided into two operations: editing and publishing, therefore greatly reducing human errors * All operations have audit logs for easy tracking of problems diff --git a/docs/en/deployment/distributed-deployment-guide.md b/docs/en/deployment/distributed-deployment-guide.md index 3251d4c5d5e..4dbe8dd7586 100644 --- a/docs/en/deployment/distributed-deployment-guide.md +++ b/docs/en/deployment/distributed-deployment-guide.md @@ -769,9 +769,9 @@ apollo.service.registry.cluster=same name with apollo Cluster ``` 2. (optional) If you want to customize Config Service and Admin Service's uri for Client, -for example when deploying on the intranet, -if you don't want to expose the intranet ip, -you can add a property in `config/application-github.properties` of the Config Service and Admin Service installation package + for example when deploying on the intranet, + if you don't want to expose the intranet ip, + you can add a property in `config/application-github.properties` of the Config Service and Admin Service installation package ```properties apollo.service.registry.uri=http://your-ip-or-domain:${server.port}/ ``` @@ -1447,6 +1447,14 @@ The default is true, which makes it easy to quickly search for configurations by If set to false, this feature is disabled +### 3.1.14 apollo.portal.search.perEnvMaxResults - set the Administrator Tool-Global Search for Value function's maximum number of search results for a single individual environment + +> For versions 2.4.0 and above + +Default is 200, which means that each environment will return up to 200 results in a single search operation. + +Modifying this parameter may affect the performance of the search function, so before modifying it, you should conduct sufficient testing and adjust the value of `apollo.portal.search.perEnvMaxResults` appropriately according to the actual business requirements and system resources to balance the performance and the number of search results. + ## 3.2 Adjusting ApolloConfigDB configuration Configuration items are uniformly stored in the ApolloConfigDB.ServerConfig table. It should be noted that each environment's ApolloConfigDB.ServerConfig needs to be configured separately, and the modification takes effect in real time for one minute afterwards. diff --git a/docs/en/design/apollo-design.md b/docs/en/design/apollo-design.md index f078c1881d2..0061f696f20 100644 --- a/docs/en/design/apollo-design.md +++ b/docs/en/design/apollo-design.md @@ -130,7 +130,7 @@ Why do we use Eureka as a service registry instead of the traditional zk and etc ### 1.3.2 Admin Service * Provide configuration management interface -* Provides interfaces for configuration modification, publishing, etc. +* Provides interfaces for configuration modification, publishing, retrieval, etc. * Interface service object is Portal ### 1.3.3 Meta Server diff --git a/docs/en/images/Configuration query-Non properties.png b/docs/en/images/Configuration query-Non properties.png new file mode 100644 index 0000000000000000000000000000000000000000..2add2efcd46c10b928896e712631bbaa05623291 GIT binary patch literal 39027 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 literal 0 HcmV?d00001 diff --git a/docs/en/images/Configuration query-properties.png b/docs/en/images/Configuration query-properties.png new file mode 100644 index 0000000000000000000000000000000000000000..a4320354df2863522ae63c2853c0d68ff5df7d2f GIT binary patch literal 39958 zcmeFYRa9I}*DXwx1OlXSOCXJVaEAmMf)m^!c<`W&6OsUp2X{ztx5l9%!LW5_~YtGlOe&-%SmJ4J}!Xi>jMX(Y_7SzpV)@9Pm0Xor$?j1u{P0ys6&JyZ{OzE*8sR# (088s(cQ7Y+ZZ@ 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

    Awc&Hhr=&ho>y`^z_Wku>AZ_L-Rt- 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 W78CC>` 适用于2.4.0及以上版本 + +默认为200,意味着每个环境在单次搜索操作中最多返回200条结果 + +修改该参数可能会影响搜索功能的性能,因此在修改之前应该进行充分的测试,根据实际业务需求和系统资源情况,适当调整`apollo.portal.search.perEnvMaxResults`的值,以平衡性能和搜索结果的数量 + ## 3.2 调整ApolloConfigDB配置 配置项统一存储在ApolloConfigDB.ServerConfig表中,需要注意每个环境的ApolloConfigDB.ServerConfig都需要单独配置,修改完一分钟实时生效。 diff --git a/docs/zh/design/apollo-design.md b/docs/zh/design/apollo-design.md index e2724800c5f..7cd1b49b2c0 100644 --- a/docs/zh/design/apollo-design.md +++ b/docs/zh/design/apollo-design.md @@ -136,7 +136,7 @@ sequenceDiagram ### 1.3.2 Admin Service * 提供配置管理接口 -* 提供配置修改、发布等接口 +* 提供配置修改、发布、检索等接口 * 接口服务对象为Portal ### 1.3.3 Meta Server diff --git a/docs/zh/design/apollo-introduction.md b/docs/zh/design/apollo-introduction.md index d6e1081989d..166af68c3a4 100644 --- a/docs/zh/design/apollo-introduction.md +++ b/docs/zh/design/apollo-introduction.md @@ -69,9 +69,9 @@ Apollo支持4个维度管理Key-Value格式的配置: * **灰度发布** * 支持配置的灰度发布,比如点了发布后,只对部分应用实例生效,等观察一段时间没问题后再推给所有应用实例 -- **配置项的全局视角搜索** - - 通过对配置项的key与value进行的模糊检索,找到拥有对应值的配置项在哪个应用、环境、集群、命名空间中被使用 - - 通过高亮显示、分页与跳转配置等操作,便于让管理员以及SRE角色快速、便捷地找到与更改资源的配置值 +* **配置项的全局视角搜索** + * 通过对配置项的key与value进行的模糊检索,找到拥有对应值的配置项在哪个应用、环境、集群、命名空间中被使用 + * 通过高亮显示、分页与跳转配置等操作,便于让管理员以及SRE角色快速、便捷地找到与更改资源的配置值 * **权限管理、发布审核、操作审计** * 应用和配置的管理都有完善的权限管理机制,对配置的管理还分为了编辑和发布两个环节,从而减少人为的错误。 diff --git a/docs/zh/images/Configuration query-Non properties.png b/docs/zh/images/Configuration query-Non properties.png new file mode 100644 index 0000000000000000000000000000000000000000..2add2efcd46c10b928896e712631bbaa05623291 GIT binary patch literal 39027 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 literal 0 HcmV?d00001 diff --git a/docs/zh/images/Configuration query-properties.png b/docs/zh/images/Configuration query-properties.png new file mode 100644 index 0000000000000000000000000000000000000000..a4320354df2863522ae63c2853c0d68ff5df7d2f GIT binary patch literal 39958 zcmeFYRa9I}*DXwx1OlXSOCXJVaEAmMf)m^!c<`W&6OsUp2X{ztx5l9%!LW5_~YtGlOe&-%SmJ4J}!Xi>jMX(Y_7SzpV)@9Pm0Xor$?j1u{P0ys6&JyZ{OzE*8sR# (088s(cQ7Y+ZZ@ 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

    Awc&Hhr=&ho>y`^z_Wku>AZ_L-Rt- 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 W78CC>` Date: Tue, 3 Sep 2024 18:03:17 +0800 Subject: [PATCH 11/16] Update docs/zh/README.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- docs/zh/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/zh/README.md b/docs/zh/README.md index 9e1e6946d5d..09c04f85647 100644 --- a/docs/zh/README.md +++ b/docs/zh/README.md @@ -40,9 +40,9 @@ Java客户端不依赖任何框架,能够运行于所有Java运行时环境, * **灰度发布** * 支持配置的灰度发布,比如点了发布后,只对部分应用实例生效,等观察一段时间没问题后再推给所有应用实例。 -* **配置项的全局视角搜索** - * 通过对配置项的key与value进行的模糊检索,找到拥有对应值的配置项在哪个应用、环境、集群、命名空间中被使用。 - * 通过高亮显示、分页与跳转配置等操作,便于让管理员以及SRE角色快速、便捷地找到与更改资源的配置值。 +- **配置项的全局视角搜索** + - 通过对配置项的key与value进行的模糊检索,找到拥有对应值的配置项在哪个应用、环境、集群、命名空间中被使用。 + - 通过高亮显示、分页与跳转配置等操作,便于让管理员以及SRE角色快速、便捷地找到与更改资源的配置值。 * **权限管理、发布审核、操作审计** * 应用和配置的管理都有完善的权限管理机制,对配置的管理还分为了编辑和发布两个环节,从而减少人为的错误。 From a90c2ac4bea365f3aacd4bcebec227fc06492253 Mon Sep 17 00:00:00 2001 From: xiaoxianhjy <2413421030@qq.com> Date: Fri, 6 Sep 2024 17:07:32 +0800 Subject: [PATCH 12/16] Fixed some issues --- CHANGES.md | 4 +-- .../controller/ItemControllerTest.java | 29 +++++++++--------- .../biz/repository/ReleaseRepository.java | 2 -- .../apollo/biz/service/ItemService.java | 25 +-------------- .../apollo/biz/service/ItemServiceTest.java | 3 -- .../apollo/common/dto/ItemInfoDTO.java | 24 +-------------- .../GlobalSearchValueController.java | 3 ++ .../apollo/portal/entity/vo/ItemInfo.java | 13 +------- .../service/GlobalSearchValueService.java | 11 +++++-- .../resources/static/global_search_value.html | 27 ++-------------- .../src/main/resources/static/i18n/en.json | 3 -- .../src/main/resources/static/i18n/zh-CN.json | 3 -- .../GlobalSearchValueControllerTest.java | 10 +++--- .../service/GlobalSearchValueServiceTest.java | 4 +-- changes/changes-2.4.0.md | 13 ++++++++ .../Configuration query-Non properties.png | Bin 39027 -> 35238 bytes .../images/Configuration query-properties.png | Bin 39958 -> 35102 bytes docs/en/portal/apollo-user-guide.md | 2 +- .../Configuration query-Non properties.png | Bin 39027 -> 35238 bytes .../images/Configuration query-properties.png | Bin 39958 -> 35102 bytes docs/zh/portal/apollo-user-guide.md | 2 +- 21 files changed, 55 insertions(+), 123 deletions(-) create mode 100644 changes/changes-2.4.0.md diff --git a/CHANGES.md b/CHANGES.md index e67b0b78c40..ed756c3f80e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -7,7 +7,7 @@ Apollo 2.4.0 ------------------ * [Update the server config link in system info page](https://github.com/apolloconfig/apollo/pull/5204) * [Feature support portal restTemplate Client connection pool config](https://github.com/apolloconfig/apollo/pull/5200) - +* [Feature added the ability for administrators to globally search for Value](https://github.com/apolloconfig/apollo/pull/5182) ------------------ -All issues and pull requests are [here](https://github.com/apolloconfig/apollo/milestone/15?closed=1) +All issues and pull requests are [here](https://github.com/apolloconfig/apollo/milestone/15?closed=1) \ No newline at end of file diff --git a/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ItemControllerTest.java b/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ItemControllerTest.java index 7581258fba5..84e791f6c1d 100644 --- a/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ItemControllerTest.java +++ b/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/controller/ItemControllerTest.java @@ -24,7 +24,6 @@ import com.ctrip.framework.apollo.biz.service.ItemService; import com.ctrip.framework.apollo.common.dto.*; -import java.util.Arrays; import java.util.List; import java.util.Objects; import org.junit.Assert; @@ -63,7 +62,7 @@ public void testCreate() { ClusterDTO cluster = restTemplate.getForObject(clusterBaseUrl(), ClusterDTO.class, app.getAppId(), "default"); assert cluster != null; NamespaceDTO namespace = restTemplate.getForObject(namespaceBaseUrl(), - NamespaceDTO.class, app.getAppId(), cluster.getName(), "application"); + NamespaceDTO.class, app.getAppId(), cluster.getName(), "application"); String itemKey = "test-key"; String itemValue = "test-value"; @@ -73,12 +72,12 @@ public void testCreate() { item.setDataChangeLastModifiedBy("apollo"); ResponseEntity response = restTemplate.postForEntity(itemBaseUrl(), - item, ItemDTO.class, app.getAppId(), cluster.getName(), namespace.getNamespaceName()); + item, ItemDTO.class, app.getAppId(), cluster.getName(), namespace.getNamespaceName()); Assert.assertEquals(HttpStatus.OK, response.getStatusCode()); Assert.assertEquals(itemKey, Objects.requireNonNull(response.getBody()).getKey()); List commitList = commitRepository.findByAppIdAndClusterNameAndNamespaceNameOrderByIdDesc(app.getAppId(), cluster.getName(), namespace.getNamespaceName(), - Pageable.ofSize(10)); + Pageable.ofSize(10)); Assert.assertEquals(1, commitList.size()); Commit commit = commitList.get(0); @@ -98,15 +97,15 @@ public void testUpdate() { ClusterDTO cluster = restTemplate.getForObject(clusterBaseUrl(), ClusterDTO.class, app.getAppId(), "default"); assert cluster != null; NamespaceDTO namespace = restTemplate.getForObject(namespaceBaseUrl(), - NamespaceDTO.class, app.getAppId(), cluster.getName(), "application"); + NamespaceDTO.class, app.getAppId(), cluster.getName(), "application"); String itemKey = "test-key"; String itemValue = "test-value-updated"; long itemId = itemRepository.findByKey(itemKey, Pageable.ofSize(1)) - .getContent() - .get(0) - .getId(); + .getContent() + .get(0) + .getId(); ItemDTO item = new ItemDTO(itemKey, itemValue, "", 1); item.setDataChangeLastModifiedBy("apollo"); @@ -120,7 +119,7 @@ public void testUpdate() { }); List commitList = commitRepository.findByAppIdAndClusterNameAndNamespaceNameOrderByIdDesc(app.getAppId(), cluster.getName(), namespace.getNamespaceName(), - Pageable.ofSize(10)); + Pageable.ofSize(10)); assertThat(commitList).hasSize(2); } @@ -136,23 +135,23 @@ public void testDelete() { ClusterDTO cluster = restTemplate.getForObject(clusterBaseUrl(), ClusterDTO.class, app.getAppId(), "default"); assert cluster != null; NamespaceDTO namespace = restTemplate.getForObject(namespaceBaseUrl(), - NamespaceDTO.class, app.getAppId(), cluster.getName(), "application"); + NamespaceDTO.class, app.getAppId(), cluster.getName(), "application"); String itemKey = "test-key"; long itemId = itemRepository.findByKey(itemKey, Pageable.ofSize(1)) - .getContent() - .get(0) - .getId(); + .getContent() + .get(0) + .getId(); String deleteUrl = url( "/items/{itemId}?operator=apollo"); restTemplate.delete(deleteUrl, itemId); assertThat(itemRepository.findById(itemId).isPresent()) - .isFalse(); + .isFalse(); assert namespace != null; List commitList = commitRepository.findByAppIdAndClusterNameAndNamespaceNameOrderByIdDesc(app.getAppId(), cluster.getName(), namespace.getNamespaceName(), - Pageable.ofSize(10)); + Pageable.ofSize(10)); assertThat(commitList).hasSize(2); } diff --git a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ReleaseRepository.java b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ReleaseRepository.java index 20e5c7062fe..992c8c93283 100644 --- a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ReleaseRepository.java +++ b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ReleaseRepository.java @@ -47,8 +47,6 @@ Release findFirstByAppIdAndClusterNameAndNamespaceNameAndIsAbandonedFalseOrderBy List findByIdIn(Set releaseIds); - List findAll(); - @Modifying @Query("update Release set IsDeleted = true, DeletedAt = ROUND(UNIX_TIMESTAMP(NOW(4))*1000), DataChange_LastModifiedBy = ?4 where AppId=?1 and ClusterName=?2 and NamespaceName = ?3 and IsDeleted = false") int batchDelete(String appId, String clusterName, String namespaceName, String operator); diff --git a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemService.java b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemService.java index d5efed3b3d6..3c0d23c1b62 100644 --- a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemService.java +++ b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemService.java @@ -21,9 +21,7 @@ import com.ctrip.framework.apollo.biz.entity.Audit; import com.ctrip.framework.apollo.biz.entity.Item; import com.ctrip.framework.apollo.biz.entity.Namespace; -import com.ctrip.framework.apollo.biz.entity.Release; import com.ctrip.framework.apollo.biz.repository.ItemRepository; -import com.ctrip.framework.apollo.biz.repository.ReleaseRepository; import com.ctrip.framework.apollo.common.dto.ItemInfoDTO; import com.ctrip.framework.apollo.common.exception.BadRequestException; import com.ctrip.framework.apollo.common.exception.NotFoundException; @@ -32,13 +30,10 @@ import org.springframework.context.annotation.Lazy; import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.sql.Clob; -import java.sql.SQLException; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -52,19 +47,16 @@ public class ItemService { private final NamespaceService namespaceService; private final AuditService auditService; private final BizConfig bizConfig; - private final ReleaseRepository releaseRepository; public ItemService( final ItemRepository itemRepository, final @Lazy NamespaceService namespaceService, final AuditService auditService, - final BizConfig bizConfig, - final ReleaseRepository releaseRepository) { + final BizConfig bizConfig) { this.itemRepository = itemRepository; this.namespaceService = namespaceService; this.auditService = auditService; this.bizConfig = bizConfig; - this.releaseRepository = releaseRepository; } @@ -161,21 +153,6 @@ public Page getItemInfoBySearch(String key, String value, Pageable } else { itemInfoDTOs = itemRepository.findItemsByKeyAndValueLike(key, value, limit); } - - List releaseItems = releaseRepository.findAll(); - for (ItemInfoDTO itemInfoDTO : itemInfoDTOs.getContent()) { - boolean isIncluded = false; - for (Release releaseItem : releaseItems) { - if (releaseItem.getConfigurations().contains(itemInfoDTO.getKey()) && releaseItem.getConfigurations().contains(itemInfoDTO.getValue())) { - itemInfoDTO.setStatus("1"); - isIncluded = true; - break; - } - } - if (!isIncluded) { - itemInfoDTO.setStatus("0"); - } - } return itemInfoDTOs; } diff --git a/apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/ItemServiceTest.java b/apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/ItemServiceTest.java index 70f885421f6..6d8003f1d58 100644 --- a/apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/ItemServiceTest.java +++ b/apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/ItemServiceTest.java @@ -27,8 +27,6 @@ import org.springframework.data.domain.PageRequest; import org.springframework.test.context.jdbc.Sql; -import java.util.List; - public class ItemServiceTest extends AbstractIntegrationTest { @Autowired @@ -84,7 +82,6 @@ public void testSearchItem() { itemInfoDTO.setAppId("testApp"); itemInfoDTO.setClusterName("default"); itemInfoDTO.setNamespaceName("application"); - itemInfoDTO.setStatus("0"); itemInfoDTO.setKey("k1"); itemInfoDTO.setValue("v1"); diff --git a/apollo-common/src/main/java/com/ctrip/framework/apollo/common/dto/ItemInfoDTO.java b/apollo-common/src/main/java/com/ctrip/framework/apollo/common/dto/ItemInfoDTO.java index 36a6a157e9b..a28794ed656 100644 --- a/apollo-common/src/main/java/com/ctrip/framework/apollo/common/dto/ItemInfoDTO.java +++ b/apollo-common/src/main/java/com/ctrip/framework/apollo/common/dto/ItemInfoDTO.java @@ -21,29 +21,16 @@ public class ItemInfoDTO extends BaseDTO{ private String appId; private String clusterName; private String namespaceName; - private String status; private String key; private String value; public ItemInfoDTO() { } - public ItemInfoDTO(String appId, String clusterName, String namespaceName, - String status, String key, String value) { + public ItemInfoDTO(String appId, String clusterName, String namespaceName, String key, String value) { this.appId = appId; this.clusterName = clusterName; this.namespaceName = namespaceName; - this.status = status; - this.key = key; - this.value = value; - } - - public ItemInfoDTO(String appId, String clusterName, String namespaceName, - String key, String value) { - this.appId = appId; - this.clusterName = clusterName; - this.namespaceName = namespaceName; - this.status = "0"; this.key = key; this.value = value; } @@ -72,14 +59,6 @@ public void setNamespaceName(String namespaceName) { this.namespaceName = namespaceName; } - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - public String getKey() { return key; } @@ -102,7 +81,6 @@ public String toString() { "appId='" + appId + '\'' + ", clusterName='" + clusterName + '\'' + ", namespaceName='" + namespaceName + '\'' + - ", status='" + status + '\'' + ", key='" + key + '\'' + ", value='" + value + '\'' + '}'; diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueController.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueController.java index 9b30f882842..3850675e43a 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueController.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueController.java @@ -77,6 +77,9 @@ public ResponseEntity get_ItemInfo_BySearch(@RequestParam(value = "key", requ AtomicBoolean hasMoreData = new AtomicBoolean(false); activeEnvs.forEach(env -> { PageDTO perEnvItemInfos = globalSearchValueService.get_PerEnv_ItemInfo_BySearch(env, key, value,0, portalConfig.getPerEnvSearchMaxResults()); + if (!perEnvItemInfos.hasContent()) { + return; + } if(perEnvItemInfos.getTotal() > portalConfig.getPerEnvSearchMaxResults()){ envBeyondLimit.add(env.getName()); hasMoreData.set(true); diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/entity/vo/ItemInfo.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/entity/vo/ItemInfo.java index d490bc42569..f4d8dbf3974 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/entity/vo/ItemInfo.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/entity/vo/ItemInfo.java @@ -22,7 +22,6 @@ public class ItemInfo { private String envName; private String clusterName; private String namespaceName; - private String status; private String key; private String value; @@ -30,12 +29,11 @@ public ItemInfo() { } public ItemInfo(String appId, String envName, String clusterName, - String namespaceName, String status, String key, String value) { + String namespaceName, String key, String value) { this.appId = appId; this.envName = envName; this.clusterName = clusterName; this.namespaceName = namespaceName; - this.status = status; this.key = key; this.value = value; } @@ -72,14 +70,6 @@ public void setNamespaceName(String namespaceName) { this.namespaceName = namespaceName; } - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - public String getKey() { return key; } @@ -103,7 +93,6 @@ public String toString() { ", envName='" + envName + '\'' + ", clusterName='" + clusterName + '\'' + ", namespaceName='" + namespaceName + '\'' + - ", status='" + status + '\'' + ", key='" + key + '\'' + ", value='" + value + '\'' + '}'; diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueService.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueService.java index b223c56e722..8d94b9e12be 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueService.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueService.java @@ -21,6 +21,8 @@ import com.ctrip.framework.apollo.portal.api.AdminServiceAPI; import com.ctrip.framework.apollo.portal.entity.vo.ItemInfo; import com.ctrip.framework.apollo.portal.environment.Env; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; @@ -30,6 +32,7 @@ @Service public class GlobalSearchValueService { + private static final Logger LOGGER = LoggerFactory.getLogger(GlobalSearchValueService.class); private final AdminServiceAPI.ItemAPI itemAPI; public GlobalSearchValueService(AdminServiceAPI.ItemAPI itemAPI) { @@ -40,8 +43,12 @@ public PageDTO get_PerEnv_ItemInfo_BySearch(Env env, String key, Strin List perEnvItemInfos = new ArrayList<>(); PageDTO perEnvItemInfoDTOs = itemAPI.getPerEnvItemInfoBySearch(env, key, value, page, size); perEnvItemInfoDTOs.getContent().forEach(itemInfoDTO -> { - ItemInfo itemInfo = new ItemInfo(itemInfoDTO.getAppId(),env.getName(),itemInfoDTO.getClusterName(),itemInfoDTO.getNamespaceName(),itemInfoDTO.getStatus(),itemInfoDTO.getKey(),itemInfoDTO.getValue()); - perEnvItemInfos.add(itemInfo); + try { + ItemInfo itemInfo = new ItemInfo(itemInfoDTO.getAppId(),env.getName(),itemInfoDTO.getClusterName(),itemInfoDTO.getNamespaceName(),itemInfoDTO.getKey(),itemInfoDTO.getValue()); + perEnvItemInfos.add(itemInfo); + } catch (Exception e) { + LOGGER.error("Error converting ItemInfoDTO to ItemInfo for item: {}", itemInfoDTO, e); + } }); return new PageDTO<>(perEnvItemInfos, PageRequest.of(page, size), perEnvItemInfoDTOs.getTotal()); } diff --git a/apollo-portal/src/main/resources/static/global_search_value.html b/apollo-portal/src/main/resources/static/global_search_value.html index fa60c8cc974..3ac0a86fbf3 100644 --- a/apollo-portal/src/main/resources/static/global_search_value.html +++ b/apollo-portal/src/main/resources/static/global_search_value.html @@ -72,9 +72,8 @@ {{'Global.Env' | translate }} {{'Global.Cluster' | translate }} {{'Global.NameSpace' | translate }} - {{'Global.Status' | translate }} - {{'Global.Key' | translate }} - {{'Global.Value' | translate }} + {{'Global.Key' | translate }} + {{'Global.Value' | translate }} {{'Global.Operate' | translate }} @@ -82,28 +81,6 @@ {{ item.envName }} {{ item.clusterName }} {{ item.namespaceName }} - -

    -
    - {{'Item.Published' | translate}} -
    - {{'Item.UnPublished' | translate}} -
    - {{ item.key }} diff --git a/apollo-portal/src/main/resources/static/i18n/en.json b/apollo-portal/src/main/resources/static/i18n/en.json index 565003ec609..81c3bded0a6 100644 --- a/apollo-portal/src/main/resources/static/i18n/en.json +++ b/apollo-portal/src/main/resources/static/i18n/en.json @@ -899,7 +899,6 @@ "Global.Env": "Env Name", "Global.Cluster": "Cluster Name", "Global.NameSpace": "NameSpace Name", - "Global.Status" : "Posting Status", "Global.Key": "Key", "Global.Value": "Value", "Global.ValueSearch.Tips" : "(Fuzzy search, key can be the name or content of the configuration item, value is the value of the configuration item.)", @@ -910,8 +909,6 @@ "Item.GlobalSearchByKey": "Search by Key", "Item.GlobalSearchByValue": "Search by Value", "Item.GlobalSearch": "Search", - "Item.UnPublished" : "UnPublished", - "Item.Published" : "Published", "Item.GlobalSearchSystemError": "System error, please try again or contact the system administrator", "Item.GlobalSearch.Tips": "Search hint", "ApolloGlobalSearch.NoData" : "No data yet, please search or add", diff --git a/apollo-portal/src/main/resources/static/i18n/zh-CN.json b/apollo-portal/src/main/resources/static/i18n/zh-CN.json index 8cbc3eab2fa..2ef309b46dc 100644 --- a/apollo-portal/src/main/resources/static/i18n/zh-CN.json +++ b/apollo-portal/src/main/resources/static/i18n/zh-CN.json @@ -899,7 +899,6 @@ "Global.Env": "环境", "Global.Cluster": "集群名", "Global.NameSpace": "命名空间", - "Global.Status" : "发布状态", "Global.Key": "Key", "Global.Value": "Value", "Global.ValueSearch.Tips" : "(模糊搜索,key可为配置项名称或content,value为配置项值)", @@ -910,8 +909,6 @@ "Item.GlobalSearchByKey": "按照Key值检索", "Item.GlobalSearchByValue": "按照Value值检索", "Item.GlobalSearch": "查询", - "Item.UnPublished" : "未发布", - "Item.Published" : "已发布", "Item.GlobalSearchSystemError": "系统出错,请重试或联系系统负责人", "Item.GlobalSearch.Tips": "搜索提示", "ApolloGlobalSearch.NoData" : "暂无数据,请进行检索或者添加", diff --git a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueControllerTest.java b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueControllerTest.java index b7d799f3a05..e908caec654 100644 --- a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueControllerTest.java +++ b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueControllerTest.java @@ -111,7 +111,7 @@ public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnEmptyIt .andExpect(status().isOk()) .andExpect(content().json(objectMapper.writeValueAsString(body))); verify(portalSettings,times(1)).getActiveEnvs(); - verify(portalConfig,times(2)).getPerEnvSearchMaxResults(); + verify(portalConfig,times(1)).getPerEnvSearchMaxResults(); verify(globalSearchValueService,times(1)).get_PerEnv_ItemInfo_BySearch(any(Env.class), anyString(), anyString(),eq(0),eq(perEnvSearchMaxResults)); } @@ -122,8 +122,8 @@ public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnExpecte List devMockItemInfos = new ArrayList<>(); List proMockItemInfos = new ArrayList<>(); List allEnvMockItemInfos = new ArrayList<>(); - devMockItemInfos.add(new ItemInfo("appid1","env1","cluster1","namespace1","status1","query-key","query-value")); - proMockItemInfos.add(new ItemInfo("appid2","env2","cluster2","namespace2","status2","query-key","query-value")); + devMockItemInfos.add(new ItemInfo("appid1","env1","cluster1","namespace1","query-key","query-value")); + proMockItemInfos.add(new ItemInfo("appid2","env2","cluster2","namespace2","query-key","query-value")); when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(devMockItemInfos, PageRequest.of(0,1), 201L)); when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(proMockItemInfos, PageRequest.of(0,1), 201L)); allEnvMockItemInfos.addAll(devMockItemInfos); @@ -154,8 +154,8 @@ public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnExpecte List devMockItemInfos = new ArrayList<>(); List proMockItemInfos = new ArrayList<>(); List allEnvMockItemInfos = new ArrayList<>(); - devMockItemInfos.add(new ItemInfo("appid1","env1","cluster1","namespace1","status1","query-key","query-value")); - proMockItemInfos.add(new ItemInfo("appid2","env2","cluster2","namespace2","status2","query-key","query-value")); + devMockItemInfos.add(new ItemInfo("appid1","env1","cluster1","namespace1","query-key","query-value")); + proMockItemInfos.add(new ItemInfo("appid2","env2","cluster2","namespace2","query-key","query-value")); when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(devMockItemInfos, PageRequest.of(0,1), 1L)); when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(proMockItemInfos, PageRequest.of(0,1), 1L)); allEnvMockItemInfos.addAll(devMockItemInfos); diff --git a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueServiceTest.java b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueServiceTest.java index 6c8b0804236..d4544a7f695 100644 --- a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueServiceTest.java +++ b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueServiceTest.java @@ -54,13 +54,13 @@ public class GlobalSearchValueServiceTest { @Test public void testGet_PerEnv_ItemInfo_BySearch_withKeyAndValue_ReturnExpectedItemInfos() { - ItemInfoDTO itemInfoDTO = new ItemInfoDTO("TestApp","TestCluster","TestNamespace","1","TestKey","TestValue"); + ItemInfoDTO itemInfoDTO = new ItemInfoDTO("TestApp","TestCluster","TestNamespace","TestKey","TestValue"); List mockItemInfoDTOs = new ArrayList<>(); mockItemInfoDTOs.add(itemInfoDTO); Mockito.when(itemAPI.getPerEnvItemInfoBySearch(any(Env.class), eq("TestKey"), eq("TestValue"), eq(0), eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(mockItemInfoDTOs, PageRequest.of(0, 1), 1L)); PageDTO mockItemInfos = globalSearchValueService.get_PerEnv_ItemInfo_BySearch(Env.PRO, "TestKey", "TestValue", 0, 200); assertEquals(1, mockItemInfos.getContent().size()); - ItemInfo itemInfo = new ItemInfo("TestApp", Env.PRO.getName(), "TestCluster", "TestNamespace", "1", "TestKey", "TestValue"); + ItemInfo itemInfo = new ItemInfo("TestApp", Env.PRO.getName(), "TestCluster", "TestNamespace", "TestKey", "TestValue"); List expectedResults = new ArrayList<>(); expectedResults.add(itemInfo); verify(itemAPI,times(1)).getPerEnvItemInfoBySearch(any(Env.class), eq("TestKey"), eq("TestValue"), eq(0), eq(perEnvSearchMaxResults)); diff --git a/changes/changes-2.4.0.md b/changes/changes-2.4.0.md new file mode 100644 index 00000000000..615d7c1d7a4 --- /dev/null +++ b/changes/changes-2.4.0.md @@ -0,0 +1,13 @@ +Changes by Version +================== +Release Notes. + +Apollo 2.4.0 + +------------------ +* [Update the server config link in system info page](https://github.com/apolloconfig/apollo/pull/5204) +* [Feature support portal restTemplate Client connection pool config](https://github.com/apolloconfig/apollo/pull/5200) +* [Feature added the ability for administrators to globally search for Value](https://github.com/apolloconfig/apollo/pull/5182) + +------------------ +All issues and pull requests are [here](https://github.com/apolloconfig/apollo/milestone/15?closed=1) diff --git a/docs/en/images/Configuration query-Non properties.png b/docs/en/images/Configuration query-Non properties.png index 2add2efcd46c10b928896e712631bbaa05623291..1a355074cbc6c388f74598aab746a66592d59737 100644 GIT binary patch literal 35238 zcmeFZcT|&U_crRxypGPGFe-vd$vB82RYU=4nXycSPz01-L_my`&}%|;6c7nBnD?FU_kL%cf6hN=t#j6S)?$&|d2;72``-K7 z*WUX{ym1@+y(Z!8^7ZS2{TYHE4)x0|tEYofGvDj@>H3`yI(9kaC3yc&-+sDESXQ~Q`lvR@ zPg|M5K4h=#qy0yapZj@*+sFO1dla6%KmY06`J9?(Ix}_YK?F9l%G)LNh$Rcxu7?!C2pT_!)cl4qJT{G6l zBjkZR1OB!Dv=8)GJRMX1?%(guC19R{K3j-3$M~3kJ|C^1*f-FJ3JHkarITK_bG*1q z#mHnCMcoB#by2QvhrDV6n-#jT^m@ZCX7xwFOyfn5I4U03XoUD>HvDVT#`{!ga{aLR z5ieWuzJK>oFu1K zu$m08_m0D4W1w>jt5@mT)e_&-8D@(LawcNWUn*Wv%U{Zc_;Hr#3_y+uj|TakHPsfZ z&!JS~WTaoOtZumiT%QFd3S(ngJ&GLgH%plA#KIVQSxOj1cg_t)C&DVpkX+7OtWfy1e%LHa^2%$##-$B+h+)vow@eYD4Zb z2F9WGWHn!YvcF9}30@yFE<(Z#`@!arBby64%E%-*9)# zB`>|iG(9-vufKHI)!3biO+z^gSck*tdS?LEQB^9b?=@@x=l9W>TS=j~E<5hi2}H|U z7K7GIigx$?O^LH;)OogZFqLWUaTWp59BxoywD|X_~D5?pM=FE6W5innOlm zx2L>D;s*m1a9~BRA4%|S@_fw5L_NP>YfNClp6uJ~LSPdT;z@e5F){JGXYX7>^x}7w zI!!BkKFd}(jC#fLFK^Gj*4wn2)`ALSjiV{~3`kncT%@C~rQkV17tBcN}oOl2@(>do8qGGOA)R6RLK(QAJ~ zmQfDDLP*|NkLjv+9_>{NVq%$H!uk3}4oZBsLx3S2oyUfFx}Ctsy-Jau>BqcIo;joA zZ$-gI!cKKaC{g6e@8lMmr89ppjxO2j;yzvLiOH_#K69VwrTB)?qVS@$+~iK=B6h%4 z+Z!vGV3hO4>rohW^q4%T7hga@e(^$PNa6KBn6&MuQVRI?4WS~;MA#k;|_D+S9bRIsK zc7KrM-n3n!*{X2140j{|Wlge9+;{|d3{T)CW4FhEYeyRuG46^*ml6z7-9cu&)q1j# zgo;T)30V@g!C~=$U5b)843xOGY$DZ_+kBKrjsg2fq+vV6$ZkDx_i##rY~m&C?pdm= zrmYSjHs2p4Cx1uloJA(LLt9R_uC9j?E;c_d=A*%;Z38pTJ^Yr%SApF+-ott?lQ5)A zvt9?zF%eiF9@Sk<*%d}3uwfCdt zC|s6xpbNErAu?H;9yz}IZF@QBgw z7T~jtT3trPy%f-r~lv~=}IA+y?^3X5pU z!M;dnUc;gat^+*%al}2-|2+Frum8x+UncYjIa6O@8TM@3s%Hafd>2^8%e%0l?98T^ zndJx@{4MCzi=v1tC*9-b!Dfj)zgp(&>Fw32xF{t4;@PV4a~7bt>LqyN!sCW4Ul&5OL}g zDUh6obdJN2!`RXvhlV3=^$(JrJVtF9*56al4tpEs;DMgo{~8WHT6N!23HegA+?y9C=%3z2L$3p=qUE^tE4l-1wUXpGgy_x#j?cnv(YP65Pd)@b7XOrXu@$D4!0T)ipqO*Oir*4C*TFn51)s zxoU{PTn)>8R@0?)(#z$D>YNrh7&(~fW|^O}Sg#!M`Rl4wfB6CgE||a4fq262c~DDt z9qm`qbx7SXgYU}1(=F4AjYYAj)v$i_EniF1h5dL|jM$E}!(G8CVz+xjrJx{`JMNtF zXrJ6xMv1f!qOn&D(K80!T;(v@bSrLPtJgVBn6BBL{A|pJfh665KcP(C+ZA>Vr7JdL zYdy~!2tT1fxbx2#k(NsMzWWL&8lTX+6y7v8zJ_QYC@D$zr`8W!BNLZj zd0Dn|7wsOG6~&og4YdHk=Tb8q>*9NhjGPkl?(e3PWi1sd@SsYCb!s!zPKHrq^|BUDWT~ zjo=qcObeq2^dzHt$yG!#oc2PVDn0U-B#vykO7_`T2xbi8j5#INi-eZqp!d^_qiPV} z_%c)7?E6z|Y&AI!p|}4q=6pMcR#NsR0U79Bm%SfZ054!mCbU8mcquKl+Ml>2V!ME93bDs7EQ zTRawcYkJmbr ziga&{PBiCbM^&?)EH8I#LQ#YGCbe;XIR>W&z??_)Y>sN3=K}rS>dn+<>_H*Ra~f*> zgcQZDpXLQdh^(UXEs3_m?al^CsNhV(-Zd$*I}H=f$Sn}J%r`$@A*(CrlW%6#@vuxdIa$TD8zEsz%ynFH)rJDi8pE|O>2)qJM@hv@m|zBCe}XUqP2}V= z{Qaf)O){wkT1n-#-sga{t_6F1AGQPJ9sw53FJ8oMrjdc-X-qOo+=sfZC&*f8g;AAA z*P-n#{o25qZ0mQ}9az^hJTdMX+ zJ4FAao7jIC1uO7`m44=2S+jN)u?y=_F;+1I{snMm zoEW&lW3MzoNnM*3HmSrxFd9~!eY<=oR@H6xC;{eTMbOiCiJb#d#3I22(@1;JxAG@% z)Uxn^Rfs{78f0dtjdu_+_q!hM>UqN^Zpc`Nt!%Z?_%HS6i!_OJOq73oCzo!aG+k_+qDQJ4aD?C7|P+Mu>W}}>nFgMoz@$j>znh1VQ^W!VL`Fv7>8S5s# zcH!Axx-)XKc`+=}FmdS$gT}O--&lT{X_!-yMudVR<|YEi94>jO5{Lx7c5Q6bep3kp zHA=X{-$9y+PnyqtG8i^HlA$VslI0{{8yRr%*G4QV5&8aYrlA+FI;KNSCjdcjMrh4O z41b6;u>*=CTSQInI84`K?wCL%5tAfF9ZOGkJ*`qdzWUloDDU7n6BTULS+aJtIQvWg zJD1pTFtIK^%uVmpn^FRsuhC!k@Umg{(fgghRByRF+6(zb?{G>E%$ETEh;f$bxIf|o zm(7cH6}1{3%>=)A&W`}JuAa#OZarLR%_dAyu#H4mG-yorm%-acy_g;#L)){nHQLBQ7rZ~t}yRu>aEj{0!<6%A*EwrLgX8iJ+RS$t21 zb#K~R+~ZsZDpO7PE4~D3KdS2y4@tB6#GaDZn{OBx21Op>B2~zifNbd%Ih46rTZN7^-}8Kq@3z z#}Wb(F*WZLAJ}VuSVq%-;zw%wFC9a>Ux-}@a?*9Os&i{~yUxtd^-WI->d_rOlkR0Z<{zg zyz%A}j=i-hzxC$JkCfYgX}erY;H@82G77PlTTaE?GW(L5AhGm~uBQbb zc2PGgneNc|r3LEd+)wS$wyj{WgIt~Qc2S}yy;@7J%1B1WbML}RM~D+dbA#>abg#tL z=d=(H3$=-Ss}EDoUUn5LQE~BuV?(`xTdyvpKV%=%bI^5InHd*T^+d7bGcU@BW@|xH z*=5I}#EoMIof5RGT1q;l}`JIvv^rg6284UXjHbB!p|K_8J^`%_1ia~B)Q*_ zy9vcuyDg4@$NO;-89cAtB}D6?(GX!Gar>pBh>vo%nr_B&t9*~XKmx_Fv4eUN2e%?a zm4`~$87`a|XXlpV6~?DABD4=^L5cywulvXt5_f2GC-z@!55J2+1HCs(vDb62WJ!%H z%MihPEtjDUAt6|8n{2xv(!6n1EUCGZHpqD1)E*;s7IrOJ_HikE)qW-Qs+7$?1AACY ze_+aM24$*}FIQ_&z6XDtl|Z`^MgIXnbE0nPcXso9Y-BV8V#k5Sw8k;%=6CiMdb5&y~5tFlaC?!P|N&E zlQ29CawakA42;hnx%PYKsVCUnm@h`2B#F6&lendJzs6BNo?b??8p4S}q{A1~0G4(E zFu_`LS(&l!-#C^)iDDUYF-q1&{%$T8bebbubHVvmsUtTsUsx4A6#Sn3t-5aW!o>>t z^r@A+&eJrMffQtTIU`ilk-*E^PSdx(_z%~bHSHVo&Kd00%iEz)7srA%g;r;C5b#b* zrnCFjcg@Fd#Ls>+6*zN2?ux-;AgPOJu7AH33G;fi5*}s#gwSH4S|=#M_y>!$H?3x` znsmNa4~7?7zi9e_ySDh1nq6l93X>`Bc*cs&=4;tOLocC6XQKVOd;E3a>*jCk5HKTrZPQzaZBRZ|xhtWPUx6Ge)k0#zn*myt{&b z#!A|;S@Vlgh;39iV@#wNd(%>hq(ME@!`cb7=u-Ei(J-7po5Z4pmk-Hkdpg{aYBjuKMto10%p`&_`fG+bG zJ^d821w{dy(K+^FWu|Qo?|tBYgLBMGL)W;`!evq2o5|-zYi|LV_t#4uw4PF!v_hc` z(K}u+KkXYNGowlSt)Q8v;4^lV=Z!Zw=M_EWPkxi8`{OQSlaTb=-)vJ_b82(d2?v)` zqnAq?tm}*C`_a~Gak(;?9ru>?$|#M?xj!>D_a*ABXU%oRNZz#cgNq`)tT;}y%{;U3 zRe|#XU6`?O`Qd=_3!NcwF1Pe7%|TPM$}#&}bK8o<8S4V#PP`*3T4eZ$LN&CLWS?@! z=h()1@WzQWVPoZs92zN&_|9dWAA8)sq_i2T4Otm`T8FQw#G&ya1<}l{o=F`Wy-v}2 zRXtH>3*4}CKB^INl<3@h51#1m*Q35h;S!xQ-iTJDK12b0hp{os0q*y1VXoJ3B2cpK z7I06@U!uwCDl!(qBn#(@dyMiZ>5F6S(Mdo!RSCzGtTU5=aX6)JAdGT^aR?J8Ub(hL zM9NAwl+sAe*tIH1-X&Yg*<@%tcS8Dg@U)^=tc6F%I-J3kY^1LFFxQ&VK*?ac#01;( zm)-ink5suzZ(v=CP8X+%(a>k_VapWd$CNdJ=s zjko02Jq$Ypb?mg;+UCanF_nj~R61(9mg4uUkP%jv*lGRLbWPB69a08wI|B4_(*1@# zBm2UcRw&{e;&FQ){Y9~_SM-L3#fnzEQK!YqdTGRi3Jvz0@WC8MZd-6Oo>CuMJ^sh( zqq$SR{@^$Zbj^T-xp@_hGZd3z8?X0a>`L34>sD8I=7n8`->HMcB&S5|(u8>5hVxrF zbzdf*5qaK7ioPbHrYwHu_a63o`oqc#V0uCy*I+(6l>zD`Hb6X844Eo7lq!7DkUXc- zdY#quYjp3&emxJFCI@-L(F?MMqC)I;*%2!=`w=(-Rb`_eivVt%KOvNNCHXm0e z6az43|90cD*T%k1mRk^`UBfH|DTs}IoqucvAa=@dc~Vk*m&di>x7zWZPKAeH=@DeK zj2=44PdmaF(spxwvb|YKWZuyiruOtis&1)6tr1(jMq5_XgU();7Hl*h@00rYSg2vn zYg8vKXEPFyW7k#~mZ9kqQJbVd^{8_Cj_ov+wBuy5hT2I5$blp?2ypH-Vb@fw8;x0L za`BuUs~tv-q4dr$w?CfwJ*Q!p@;0fGaEuVeQXmBB?sy{;X_?h1sMjzb8hiEOY` zUETI~avR+O*PcrEceB5d4eoWg6umRD&`dGB@?(92wvtz=KRVFs0h*I#<`ma;e{Vp% zK&fubh!^5`_QxYVk!)|rY)CJju-N_*(@U!_dGqT4BKWh%O zDnC1I#O;;UwA;x!;cP{Yc78FXQL8i?S^kjNS^2tT4Tuuc7-l&|&SM=Vg!okYH)Eq2 znN64uUxd2pNLpre5bbbX$0ID-l&S zT?<$_S_Xx4@^QO7N=D(f)1Ss zaf5o|J3Fy*7TdRXCa+nxiz#VignW;k7({N)UkDD7c_PkjK_llamV*#QyJgJtTZhrP zN7dI%#mks(DIJw`0VNTNH$P30Y(kV|h-oBV*G4#7+4pQa>k7b1Pk>EaksJ_gtsk_r z;QPg{x6((8;Sv-Vk+0B#G(X^gJ04}d+{xn9`kD6M!=BQ6~cKgMXc0>+xKF2Dfm5e{?wT zYgjx7xZUA<$V1NpKlq+1?;G;TEC6W`-%;t&IFRBR=xzyCoCP%9vMO19(gIOoxadvR zhle~<(!wnrNok5b5T6K&aCapOQG%aT9iSBGC zp#)P6H`95hu%#PrOBtGw;%#^Xc5~VLI#UtKd*x>m79ZBevcR%dunMYi3(q&3q)UA6 zU|>jqSQ$KhSsR#(_y~!qs6sQ%1Zoyp%tf>xqQC642svh=hF}kP;tA+l)C)E zQp1FmJO?n2mLd{ZJrK(Ti4j(zTDX8$0#CcIcj*)$7_j)A`S2+dONuYP*unSE&QLS9 z(|NQ@0%umpqmzc2B!GB%4RKsou+jZ_>?F~A0ViJv|!>(#Ws5fFksa?;|BigedXPI<5#ZJyBOU0Turqj}kDM*tw5t z&!p%&<}nsFurQFdO)#HM6C`=7|Z9i#yhlp$Abs7nWpc1E8?y$teq?0I~XC|iu zc5cV6*5cXjQf2c#QUl`i`_tmsfW#8rn`a^4{G}r0ti|jK?>Q|SZ$Sc9u?QHWTVTO) z*%r*rNGI;{wfB!roQzDTK=cXAHzF51dmO6XSpq3>_F*N0&Y2v}dQ7KQ;e?1cr>MKb z0Wz~2dJc6)>2+;fj(;rWe4;&SjnjFlsX#^bH7Nt{oj}SHSZC5v2n#HzK9&Rmz%Rg7 z+(}k;!!XLn)P~#DX}LXP+KNae1O}Mv@+*)n4O;z8qHWq1njH0lg$e2ZlI}3I?tem! zVU|i*Nu!31?^GLaYi5kHxpalJeY6x!LCcy`QL%q&djYX zcj#c*Ik;5Ugfh^4b?H!QqW>#)DRsT*Uq5Ud0dDzrc60x>OrGAtJMpKMj@Y4oAnmMQ zAy1}4lN^!2R|?f~DC0xor6|nGoJCHxvqxfFyyu)VQrXhZUfG<#kVRhqZeMo*v{ijJ zis(sBJyUd@89`TxdEDH=u#uWQ%=}i<#^#t^882_Ix{h=pm{b1~{@exg<#E22ZZE3! zfm|w3HDtEcz>G6sz<@lUGLop}3D~W1OfqRFo%D9rFsIEM=q6fBkG;9pH6x7}W71}t z&^>`>Zw$Q@B}#Vs!ak*trMc6K!;%HNc=UQ@fmIGM7rTkxSW8ju{~K~Q5{6(88hfHu z_DuWqNF$zH48mO4uP1Uq!_rf8MLj5yYwWJBOyo5qO#db^vR4qRBvE^)Bm4DViSof_ ze{2n+i+z3P`CH8?T1LS?x=X}N+@cod0F%FhtuCM#pH4&sYbWpGd&X|Y!QV*(q&-V@ zE#^pRApN$u)M4~@5`QSB8zbt++_ajs=Z_!+P+YYg{2l88p7nNS(AmTO?CsosG=djH zZlxCy%A||7#~PR0wTTWDZnK0&d)l-^hN;p?yu_AELu1Wd{J{+(6Be*Nh2rP+-Z5MR zN#?LJ(CuR2k1>hs5e(jh>=8SNa4H`vyQ?zN(LvT`nOnP_@iyJFeRNE7H-BR+YH=WM z^Q|;5fpn;G&zyWSDa=&0nI6_IyJvuO6FjYvgC=eF8jX$}mN1k^$GkXTtbC#vC`{Ry zCJ8z>yp4jcV~4qYXHWxBb2qd8tyDZfj+aQ&BEQmc?VjicF1oNTXTh2+3 zyv507xS`tR%ct!J4||9!_*zoW$^NB{elL#{ple>eYLqTRL09-^fh z1mOCz%DS7eqP30BSL9Nk{Lgjabo39kj!)(;JJNqXkI{gj9aEJ?T7HxIU}d-@8O48Z z==*cE;3tKbR~6(NM@x6_k(yP%j?+qxyTY;OL0C`7$+crA+V(w!fL+1_AV*xi$>u%9LVLGE=@$JUWh0{Uel9xH zFX23sKm6Tkj}TB3MkejbnceijJ@2)WGM%R7)vF>krR?nRs$9O_jL{A4twNcUYWMx^ zfFXp+-5m8bTsy9`5YP6u(p8o*)tfq=;rR&xAn-#e6E;4$tvMfhcWDjtW+LkbsGIVM z<~RYH+07lYHWoLEe0Yud-Q70$Za%D4rL)|7Go-cRWj7=A>nn$EJo=NlE8RN>2Z>xJ z>G!_#(_X>3!>CKD87LD)Tc+m$f$E^1$0(x)Drmug2?ZwdvgR-gi8^bktLBFL>A(+t zo%xxyv8N@$d6YJI6v&(8{D;gL-0K9pQ|@Dz>nywsDMS-w2`kFYK#oLXxQ-Iz|t zfhQyO;U*&H8sr-&=i(;DsDqnc(R$(d2s*1FfM#gWA8$ zGlegV6Ew6#X63iCW$M3i)P-cx8d#;p#kly%l(0B7=)>{!l~-}p*%NL9I<}=skDQF*PlRd& zyMrn4YV()bHU4zF$0BFwekG`xQ|J2X>l$BbZ_PGs3|-vapYgcokiX+arS2UEOLt|J zb{}}6#O3aI?wA8suJ(-*gu=$P0kP!Gm@X*bCuRiv?f!IQClIYPQQdFe_@_iN@U zBiqG`LpX*SsE%GBDbf_d;+dBrUIg{vMq!mg`S{BB7v%|R*6k%K&fM1Af@wv=;Mt=Y zWkBW+Y1B&79=0mq;~jzaX)8$_oJH)E7?00z7wcdDIr!svcWRAb+5Gj}#qT|gkI1e~ zN_W-t4?_#4R&)w=_%5~xm|$3d{c`|J(-<%yzrVGD+mUmks||hzzSnrsJD5~Yo}Bk2 zfAyWh7-VZV4;o$Q{G4?OPF$?!- zq9@e$oqgw~I7-@n6##U^inSaau;`O&qED`b!O{3AZRtvT|qW>(c2`jqEkXn~?Sc+2G)x&4eX zTr)4kUOW%~MGugsww^gN?k#wFzpv%RM0P_eht2`Ye8RuaWc#;uWJbd$BRxHeEURba z4NtE`IGwwNygDDx-&uw^{WzD2&y0e6vd7W^^MEF=+Ka2e@N?Q;MbB!d+akqexDV%+ z=#M6h)2Ky@LD2o3;^!$bDLQ?$V&t9qpC*iyJ%Jp@2S&jaPPf0bePZ-PsIguP|_@^9bvM0@5n;azIaf++_tUZ(DyGE%hv}A-A`|aL`rw) z0Ykbwf7@mMb@gD%{qCLIl`NHr&vR*4q32PnE64 zU(|A7O1dPK4D%wJO<|s|509p_!_j|N0{?o$SbuE_CA%*-3xz(S()5+kMf%b*`poB3ww;=xoJits^*jc#`I)NwXN-6H# zl9}e@su>QOn%q;vo$lGBzximBHlLt?qolWYXC!dS)j9K8`c^z^l=nXVU}ZY?>#=676mx)zOiIvRjXffGXxtWW_zR+5f2t(zC=pn4tGd(|w{!VteG zyHHpw{_egXTucjNfbQK7H#I&B!`O#mD>Nkzh5IW)w8F@3z}X&|!6M9SjfYDQpTN_8>N^8WTJ}%Q6U`Q(P1b9<7Ev`M)HxKflVMbUfTS--XY89#Fn5;#S zcZ@5<%~G@HYo5r5@SYcOhOoHf=ZdGj2mv&0NnS3#GbdkVowAzA={?-iv1VCNF+iHA zVZMf4PDhw!1_h)Pg#D%Qsh;Ih*(|DSWXbpRZ23->cjaf?9~=V)$3zK61@lZlC2ycj zqU0XSc&I7)5q}F?w^k0k8)q7^e!EUbIjlc?SIUk%{zuBt2c=w6iQz=F*hrySJ=?L| zDS88Nytu^tP_%c~G1+nCJJWh#kgiqEA@$(p=jJ|~jN&-fbFDf0>~{iOms%N)kM44; zzi##|x0@fz{xlL==X_dy*#A2JoHn<3OG;D~+&wSJ&aCi?A4f__fBc0ZVrP5zqE=J# z9P5&QZgQxh!bpC1M&&`U^1=4sRV-&B@6RnXl0Iue1nS^`BAELfye_v#0i1 zW~9KT$8foVz8nVMfIJz{bc$f$g?cu!a-TpkZO7fgv;@aiPQMJ+#@)AN&ds(Iaq0Z) zlZxK;Fup>rb1v9td&T*!F8$Fr6&ok^?^A(Te`amy>4aKbE6BDCu^PG_XxiPYwSzc! z*vt4x#%#+^hI7yD&bn?X8EQYS^0vscVG2`g=HIA73eB-+?F}r1jRiE8-?9 zj2_#V$|lvb1ixYKTU>5Tw3i@pi9_V_+OL__66-Yon56E%q4`kcJsnhv~p`4L*}p^T!e zI`Vlo^-Re8;b>mQ00H^)`do+Cms9tt(1OgZr3@YNuVMcR>}!#Ni5lyiky|vDTY*Iz zs#FcKFXOIt5xyp~$wO97r*?F#7<$muBB5k+`T*sb@j<%|rbxWf z)Xo--acR@uPJJC-B+1b1cHy*p8qugox0NB!sNL>pLu~qy@@gcnVD2xp1zfJ03t;xR zp(5dJ*WB?-)f9Fm;Ap`B?v{vVa(}jL!>7 zXfHP#ib%=gt_Sjmqr7JhHC=$m#6gtPbs>Quw72J6(*b20Qsk+%_wnAIK!R^0(5s(7 zu{M!y^72$Ap~sS(M@be(Wj#q)z%H=3|GyN9%C17$F?Yrhz@uA(2StK1%TGDx_T zQNtvFa4h_gv=F8Uqi_MOB4iA)^sT0oM$ej8^u!l#!?Ql`Djt?U7>hyyh4kXf|AYs`f@#;JybYXF!u{GY=X{amo z{OXMUJfpy|k9wZ!(ReZlT;+Iv)Qg02v{!G@$^IVN*vKQt z$~v_ym6d2I=5TyzGAp;l_ylJ_T;n32&{sEYf61-J?OU`|L~c&yTsjnuxFFX5DD{bY z;b^rM-;*7eyj5K-rO3FaMqt_(q-^U|7D(ZR-CgNh!XNW$rx&<3 z$nY*r(;nt$rnN3culCQ*u)xVz)`(#h_wF21+tXu~If02cAyDftw&tFQAyMrSNoes) ztlw0QZ6RzYql&>+ioD?Z{b1R33szp$R3tUlqQG;)(d&0E5x&s!PN6S}9j?NEb($I) z1`4C))gThMNXU={Ok=ejq95cndCc(Rn5yCoWwfa@Y^QT2i{IX1NQ#RGDG&>`2Nolz zin;;=Bo`?5<)3W9)7yC947JYU(3VHzCGD-=`9FEjW}mO2nMJ_^w;``=>m#Qe)Ytfe zJ0q~W+uPO0Ja`1&u5NJ&{>O7@kfvaPUg>zmXcT~v%hR*KHs%Q2$1y%`{PhaxMT5*E z^{ePl*Aqj`%wDm2rG?1{Ymk2 zafL6|u6}u&%|?4|PT0kmE!^y(+o}8@hz^p?k6C3F{?R~ZJ@R2?+W0t+#h6a0bDVXW zr8Y`V5!8&%eHL?S?Ynl|x{@L;XU()br&H>I&PNOo(iXzrm6=*7$)4t5R|pB2f`ubz zZS!aI6Z!jxM|s5xcP=H2<<#)o#1I!px?KsUgY&TTmCh0G_Sgm9I`d|(=Z;V*t-ZT7 zG&I3!^Pp<2vCEeOFQSV3o0c9Hc8-noGVf*Zbc(JaJk&8FoA&OBiVD&dk7pGlNc+U# zlY3;0>4<58>~tibt2ON+tLK5$Q-*!@GZx$w7AN~Xvz1o=xa%Z>G*MCHsqNT4jz)%6 zwb^1<&B|C`yqhWKx26MN&eUzjw+%j?m7Y%Xw!D7cRk-U5K;R|NsIECuy7znPrEHqv zwOxiQ&}usN=EN;`+-pYxZZZ6*Ako7v^ z7gI{~OXjMqdjf&(VH_C)D@;+08!X!}Q8%%5|@@ zPTgzQ`X$wNO(tKL^o|ePXv3`NN0iY#zj@hFu96%bLiyE5pc&G zZ(UC6Mx9;N?X}vx&D}qEn!awM%K5~2sHQMRcQEmcc(r1f#6{DM>Vn$;tUQwomEC70 zhhR@E#LeY(9;RhR(`oJ%$Sgk#&}eU6gJj>a&NwrK1t128cX;jn_B3^=E%p_ey_uyS z=PB77rm-*T^l`?7y>t(YxwQ$uOIs5k{8ocIIk#P&aa>ie(8i89`<0oh8h1k5R(GT? zTzYB#H%U(E%Fcs?d%{e^Fh8l$=Xn^1aqdVHI{G44KuZ=0=Yk*_kTL&AJMItowTLiL ztrB%a!a#zb`bI~TA3)9w*f_5OVh3D2cDN>DXDZkxFzK&|1BN~R?{$$$Uk3;6nD%H)5?A1j{AVGJF)n;%X87Rn=+18nWTOD za~NfD)zrnV>nDUMV92b-G-&5*^8JTV_|h8k@~HiDy@DU`*aB-Kz4BgN2qCA0X|FuHr+z)x!uLPB{`2Vu{pNT}tiu(s){Pl^?hD zV_gJ!`w{rdzgVBz9u|L}Hu`p}^G}w*Mz35Eme4(-*4~}7J=td_Kinu$u4hvgq*V~b z$BUQGm**;_?u$u2n9Ka(Oy-#|F^gZTAXKn5)-gsG1*SCCEQ zUo}p!Xzkh*B7>kBf+5v|rh4v6fT#rW)ydA9v#W_;t(y)E2l$5C@!O4jpTn-PmA|)Y zmgYhlybA(@`8y2XEP8B{SePlX!)7&=wj_Sl*DW{z%A#kbUZb+Dra8k!vUsL#uQPiZ zYLzpXfy3{pFUL^gJEVY&anCrv=xwFJfF6-$WI(Vcn^dA1Q zgnKrfTNG}o1TZLib183~?`N)JUi~W9KF;*H%3hdZA>NN`3&64qF=5v0li8;vT~jx; z^No_s`6HC6==dv>pKp%#`o~RG&vVQLx7lsg-qPBgqUT@PVzx12G1j<6&6PJsvZ4TP zdgyO^44q~MmXC%Lx}@`OK9Chv?lf8yw{(yBVu_#&@itbnwW!ew>he1o5TZ0vQY z$;#f-S`aEPN|rzWv5vK?2T94(XG1_r%_ZqW<_)GnZ9)30Eq5a(!``WH?c|+7`YYT%K`WEP0K?l6ZvS5BD3B?ky?^~a1j8? z4f;Xw)InRd93G5)|Lz66Z_+Flt_|P>4yzt)*F}P~&iICkdTXMXwGBZlgp6%vv(a$K z8ECLB#BRP(U1bJ$Ca>dkuHrB>Pd&KROqo6H^a3iWGWS{Gw&TRHZL^zl+UMz6YhU=W znlo~DLE<9O^iU1s-5fdAU-=ps=tXP1uFmU|!i&zoSo=pVbDR2hwi)Kx#d%boJSuVN zp7AE%uOM;j9y=Z-1B(90yfgPj4+5A`Y?3eg6|ogN8MD?K)V?X^`i$9#fX|F0jE`So zZBqG7_g3adTlA!o*dLyOY(F_Op}qpXztnQy>-X%nt96wzuygICb!d;8d-IkZ5M>%Y zmfT-wRcP{4Q^j_5^-E@}&TbK1L(qxrCM`P^>j{yk4~a}AZ`O+r-q|Ufpxd2Zxz%K2 zC;9o5D}H$Mk=c+4<|I@ zymqNqr}0q@^ZV;kM-A*X)O$XTaMZN>L&}gJ=w}71p7D|VXfCo&U>h!A^ZYV2Aj80f z^U4BYbxj;KxdtMrt~q8m1q*IHWp;eaJKLiPjxcswdGft&4@?{>C08y_Zj6Y?k>};o z8pmwyR;2*jKR`6Bki3G}$4;&xvpvZ!{Ko6OOCw5ItQhXYS5$LJapj-^*q&Av<1F89J`7;a?a9w<-H!_ds>$^EtXw66XuC z+~Lkclgg4REkw*c@@j5#a=MI+kB?7;OUKFMS}Dk6DzZoIPrH;yMCgHhrg2`!-F=z* z`MIC^jH^)7&F;33=Vl0?fgx{ghEZY-`3bMiuM*G^9l>nqE4GV)U07}D@EE;YCMV8q zub&BS^?RlUNpnP!<{El3KsHQpX?<&a8)x&=&hpvMxzdV?;#U||?Kx>MevebuKmNDX z^vOGxZkn48pqM0`n4|5u;m6-exilGPKN7f&Q8(y=CsQt9v|_@c1@mvi>GvjY!9YPU zA)z@LjxH1htPk~<*v!bG{bv}aMk(n^MoCphYceT!$a!;>XL6cB)I$%6AqNxgj0jg5 zp>?o(tKYS=-vnN90mx+bvVXRvTTAx8KWV!@cW5iyc3*x@Lx5b8icGEcJPEiKNba5r zrEGN7P~TPgAXqInAjMwh#jX&L@ri)1s~>6vJ3TcJpMV`fpJ^r?V24V8n#mg!g-2d- zY0=C>;_zCaJ@`yx-ISgR!z54EljcnrrZr{ju?_$HWGuYNV}-J2$DF$qx;OLarr8O8wU~hiN#Uoi za%b4dDb=q44QxOjT z<52xwFD!*omj76-Hzm8}+S8Oeoj?zcpE_|NGPF zchiQT64s^h%WYQZZn-QjMJ_E;Gi*7C9RvVnr?A4TmKoc@Ep`F&3#iHD!8OJTK+Li2@h4qV?Mr_ zFwyoLZkQmu-0%H^V>F-Wx;=}9X%!@pVTm>|ALBAOs;Db4-G4tNB;lXD1J^+HV6*tM z>&n1{t)N)xV;Q8?4vJSzvW-Ki+v!x}47&4)m6}NNF}D=zNLlUdvukt_j|A}IwGop5 zJFfvhN|wDv6}G2_0t@KIOxC53^uwqlyW?*9?{UX2j5^wxAN7i7prudt(4*&Gj``29 z!_2UwE-8#QNEMFtX)IR$zV;d?x;YRN`0y59*<}tb1QvqQ!PV_VNZ$LYGUD(2$s=tCWu3e^!BY zX;*Ovru}m`18b%AW%-Y*)2Q3oZli7~t};$-vWiJ}!=6%gk2YMRnBn7)!zcev1$saI zk5?=`8J%Ml;ArN}L2WQlA&b(`VXMKOpyS`zq zXYmJ~=PrBS_b%7IHs-a3snbVw8JO^A)JMhFD9l+P2hb9_zXDvZC_kl}>$VHP9WY76 zzDn>GBQDYI#`U;5cbT6p(H2!rzHT2;$Tt(!>>A%8c@*jfkgnCLz@-Fd)}8wIu^g9$ zBIGaq{HF0%HT%s}L2tpki7$b(2K=@T{HaYissVbi}$1wCU-Ds za^cFS*hSC%_gC;PNMgF!Uk8gTQs~SLz8FwP%RS?>IS=J5>bgXgd!f64B6Hi#*}tIR zl&Vk0s~{gj=cc^Xowdl>>iPBYEVIh{rcMrJ3uzc2Fv)Wzo=dAow{I;jn0vZ=VQZ{r zFlMg5>oZ{HDYfK}qp}lYMjeJGZ!~=n4Na3#0`gdo0-gE_es%g~sWne(r{)!E-z8J0 zzIddtPK%9XMqiuz%Gm_k@J_Ztr_m6gS|ja)qzKI`Kf!HtF0mV9m$nxcc~)jxnt(FH zRHr!p9!4a|M185ttuEOPuke6x?wkLMhT71fj$(S4>u01+(HHs5@-~TdbltR7NO`5u zN6y6G{-{U7^+!<{x=Ls6W$yLyyekYJH!;_oaS08iPtRoVdQTs#r+PJV&4r;kp*LL? z4o*KQh@u~4Sl0#SQ)1q)aW@Lta6-2=S`t0~QOka%D5vb8% zNMb71eiJ2C_<1={2;Ns3I*5^T30-3DsmNPM$E-+uldZ8qjiU}!!xxqiaW*Jyax~E0 z1T+o3i(CUDRbyqpB*rVDa-gLshPGw#jqgl8#Mz6*m?3)*^rx%el{x zN+X6qr-~n$n^7t0os{Mi3K?i1Cs&d&OB|d+$J3W&d{GxVrAnPOwNgV^PT?kCa7Jg$ z^05bv7K*qcm}U#Nogn5nlB(`z&y4wa&duvW-K*jvmr0?vq`Y6;l8o>l;-z8aLQf{Q z(ChOEPn`TioseacCQbaHvTB9ocBY$tX7i56LMLVm1?gU?*S&1tWJ$JZUvUu}q1d+g zCQTMkoiG9C7%J+yhB&$&JD;2^(To7blWk}MRy0kRt+p=^X1d7SOUJaa#A-}sV55!N z=LVloW|^6Qi!@;Y?7I71>y>`66 ze+X^l5tWf$^bUH|?0A=fcbf1igKOI7o*n{xIcDiOMVVYbGDHsQW&$8J=Q_!^s_#}o z+NAWyGPY|q!Y`Z9nqp#fr2rtyO~B=ht1KUgC@J!k{NPGbgaR9^s01CA1ya|*hMg$- zBKABp>Y0gOS}LlcdYx6)FNF>KvI~xws)|3;Fr}DM-!oED=a7EdGO!wNMyZYk8T2@~ zKLvH#lp0IhOF!vSLFh7i1>}T7MPw9w+6K+2qLL=%pRJHhU#t{>O~O2FbIwHrSaFep zo10?bhU9l*u+;0N)(w5CZuW9F4;_WpLbpT?eju5cESaiQrec>j?qC!;%N0+~!3z;Z zNu4pqR@!iG^{k#*Wsw9#H?N{dqNYlFNcpNNKQ+YU^WA!Z@pVxRO+XT4EtknNKU=zv zr4f4~tJ*jB#xhCnK^{NkT$YFCwAN#tejU1M5Rl`UhM6T?GS74}p(z8qc!OzE(|VA3 zFEu?pE7AnSNx^i)Sn7)VIRQ4DK~~f6pu2CfPRa)8RnmsTj9zU!9`Nj52D**^+|D$Y z8ob`9D%png;b)(fRmTo$en|0!eT79^JEVE7w2+ThPl8fXLw*dm%8^-pc7rT&TpxgM z9X7Qi8KQrylro`N%7^{FMTTD__DKe&n2ky*%lk2W!Or&6iG(B2(vv2{WkBL3n5u+e z%bPi*B?7l@{z+a%CQCFt%}?#~nmEwDtO@kINfTU#@cL33recpN6?%@OqJLEu3I=u! z5QcA;!>g8}Toqs^Z>5IpOT)ZE{3jR75$MBQ;M#$iQsw{hbt}>-kSz2eFdE0tu*GjH zSWt8;#F})f-n_hM?!LNqegBT5ttYZo!0+>rh#N`Zp`$vnl-T5=GY8k%mL*@b_(d-Co7qn2!I$GCAhcW=eS9l|E(o9PJem3U=(LT>{dL~9T~Na^W^1cw0woammyTtrOwR*loD@@q_!&ImII^z z6=W%n3lJx8mQ5iNmlQJb+RNaW#pzFC0AY;ok80`n0c&F9Edj7cD4IP1!=qPk_sHlS z1{VGT>?2+^?Qp_eg#A9&wybwI5BGuCr$zJ>v%VQZGzuL%0aBc$RrgNZGNexTqGS4_f9Ov^(po1$pF}&Yc>vmJN}Xb{QnP93Y3-MmlD2#e~mS2cX3wD zzkqW+_ldm&3L{T?TvEn+^nH8IQ1>v4fd4vsTo2q{v769u`f^Dlc>95w+W-z13HALg zM}6u5IbQitZSuE=RON6O0CRg}a|TXb%GJc%9T>)yMefJ~a$}^jvyk=Ko; zg1=9OBzEsBkb#x_Lo7yq%i5(S?ug@KfT%QSm|IWG;g}v)|I2nz+ z&G(;_Jo91a8kUsYzfJ?zZ&0!aa`uwMx2MPjZ4rO_cDw3m?X6eZ0g07onqzGEzp5Yr zGuJrg>1&_Wv5MP;*m7Fh_=T24ir{-cIDbO~N zdya&!&u*xF#XVp`DqZuw`)e)4A#yv}^slJr67&y#)arz@a`?60FkpAm6MTd$B~T|At=ZO__P{WopV5=l!OC;{KwSJ|XGI5$+n zG^j~Dj^E}cMX;8YYE>At!&Rig;%b+41DVAg>{;c@zOAI1`z#0bOI&5%5bb$!K!tNm z0|#5Ui!fDOua_#2Bsjka12rp%)pmqM7eze@QoPqZDgv6wc5y<`n12!6rA3|4&QLTpj;bF6Scf1J?#ES1-Ch2r7@hY^+4|uLUqS zi0$I6o(72TmFAa1#ZJ&yX{kvWtJ|t4=S2k{RVG645|A4Pc6x?}Eb%UZRod`jiNcPs z#^Cl4S%DGhX-LJz2)t*#%3O%NB|uaIDd1;o;JlLL9U|G+R$v$WsgOe!^&^w~LM1@@+sE6DZvoDy~YFOEbdzpkMX<%(2XjO~!#W-{HP)EH1LpcZbB0g14?qvk6YZz`MI;aQ>?Dh4Y-r0*tktoDhuEZGW-JqHieEw}1UM>eE}L_79{RA7_5mv8LY>1c&_ zIvmMnn$sqfSBGo|={PUou;`1zuV{GA`PWZ+CA=wHY5H|V<22X5vEW^u($t=Ne|svT zN}(J5>k^Hvr!F7STW1?$im*@~8VLZZhm|{%yFCV#?V9@-xm}C{A+*X4A6K!B3}ww@ zk~6lZI~?zcdL^F6Tl<631&~W`yWfmRX$Cm=3eYxYEk|UrUdaBPv<`V)ykXknX=^DZ zhBDRch5n;j+8$ctq|}c^6b4@w@77#3G45S6alTZcJPSQ6m(X*j!)Gv3A_ptm#^QQF zD)kMQXirID)iZ`gsX&#bdZm4D?b9uOSIzQGfY=E~@0hRCEI~Xo54bNd>Z8+QL_LrP zo822DeJG<>Z=524hfY*-%Cl1QN4=I7^_(1M{s)PT*I0p3GBzbFZv_aU2Aj;$ko|&B zujxBorfiR}&bIs843=gZvh~_F-o2K4w+kdz3^ocXKh9zRr3t{b47Ej?#4KClrt*sv~ICD$i^d6;HJ)^R=KalJ>lE#mxA zOF*vts*8;;fuIOYp!~VECK^l^ z13XQ7;IVwMef+Ymt4k;QEdKV$Z^?5%JY5{FoXrYr4;8WvkxvWZF+j3u7}QiE2tPSm ztRbv-e?>z#6{{{BA0SF_UKr;F)do!5_~_IfNN|YBN%1#|ogRFJV(-~kmv{u4zyYb8 zma?a&bMOu?x@U&%l1+ct)dQLJ??Md!Qg;At9&E?=6~Cq2dTbTshC z4v&+s#r7B?(dXo%ynnWe(LSIu=aoQ>P>Wd7iI5O)_GittEe?Xc5`u?Az-P`Bu|)Z` z1{`)>L;k}>_RF!E6D<1r0UR59ijItH-Rf4B;Ey*-Fo+(k@2=hgF+TZtGleu3em1=Pmar9-aXdU1OQG z%T$@?< zmloyrr|^=H*|%8zS)tMD`js+7SrquK?G+Ecg!(Es;BgV_EM5#!%<6fHeI(+wuylb@ z=O5-T@0A$iyuFpa4cCerl0Pg~UP!2Xr2KyJiGo7x{>p)dw5S8CJ7BeZx-d>xXh?a20h_& zdR4LUyw2F=(_Reh1TSqX>Ly@{L_jxFE4bz1v{$2IkmOT9Bc?4&)g!gbC(v2ORl5^>0!>(`{uc;ms^f65^j1BwP z-5ZrFUxk8yV0pezn#15DGD5KqAPxFK*Y#|bo+BNYUprywR^Vs*@MQ~uvu z)5tATLKVP0aFw&a07|$ZsNp7$a@l4`Oo(C7;n76&@S77RlTso~NRe@~rKh+Mq}ckA zC*Q2p--wspFpXo-1rP*B~0t1srm2}suY^lK6&#G}xR+o{;&qW*~tcH{)Mgm)FK z(AX-7wv#wsNAh(r^nDQvJ4|S4HCFfANLil+KeVc2w|L(+vHTg!ZdOgf4fi&4M|kli z$9#oU9-Uv#1TV}yE$$dk>ck<|V8<)JMh{rTvyx3)GHUMPFHeJkRo(Ma6Q&bVvQCOMM1 zcCGLUvAMKy?X1h_75Sm)cj_uL6}*-}M_Jdav|m#m zI`)3H_xqyK>*xnoX{b4NyQ@jgu(}}hB6_<#t`Z0({a^VtcK(U83DLKj+duVB1J2if z;B-{rMVKp|(fhoVcZ%+z!T%#KC%0DwvXUCoU)FC>beq-skNft&+I{;|S#(j3<6j)Y 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 literal 39027 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 diff --git a/docs/en/images/Configuration query-properties.png b/docs/en/images/Configuration query-properties.png index a4320354df2863522ae63c2853c0d68ff5df7d2f..2f8fd7711093c9a116aaf0f71b1d2b41d6b92fa5 100644 GIT binary patch literal 35102 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
    3~Uud@r0JtwO~G;^{rx0*sZ2SeJC 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 literal 39958 zcmeFYRa9I}*DXwx1OlXSOCXJVaEAmMf)m^!c<`W&6OsUp2X{ztx5l9%!LW5_~YtGlOe&-%SmJ4J}!Xi>jMX(Y_7SzpV)@9Pm0Xor$?j1u{P0ys6&JyZ{OzE*8sR# (088s(cQ7Y+ZZ@ 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
    3~Uud@r0JtwO~G;^{rx0*sZ2SeJC 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 literal 39958 zcmeFYRa9I}*DXwx1OlXSOCXJVaEAmMf)m^!c<`W&6OsUp2X{ztx5l9%!LW5_~YtGlOe&-%SmJ4J}!Xi>jMX(Y_7SzpV)@9Pm0Xor$?j1u{P0ys6&JyZ{OzE*8sR# (088s(cQ7Y+ZZ@ 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

    Awc&Hhr=&ho>y`^z_Wku>AZ_L-Rt- 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 W78CC>` Date: Wed, 11 Sep 2024 19:30:31 +0800 Subject: [PATCH 13/16] Fixed the front-end --- ...oller.java => GlobalSearchController.java} | 14 +- ...eService.java => GlobalSearchService.java} | 8 +- .../resources/static/global_search_value.html | 25 ++-- .../controller/GlobalSearchValueController.js | 120 +++++++++++++----- ...t.java => GlobalSearchControllerTest.java} | 34 ++--- ...Test.java => GlobalSearchServiceTest.java} | 8 +- 6 files changed, 136 insertions(+), 73 deletions(-) rename apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/{GlobalSearchValueController.java => GlobalSearchController.java} (85%) rename apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/{GlobalSearchValueService.java => GlobalSearchService.java} (88%) rename apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/{GlobalSearchValueControllerTest.java => GlobalSearchControllerTest.java} (74%) rename apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/{GlobalSearchValueServiceTest.java => GlobalSearchServiceTest.java} (88%) diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueController.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchController.java similarity index 85% rename from apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueController.java rename to apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchController.java index 3850675e43a..b0ecf9b25b9 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueController.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchController.java @@ -22,7 +22,7 @@ import com.ctrip.framework.apollo.portal.component.config.PortalConfig; import com.ctrip.framework.apollo.portal.entity.vo.ItemInfo; import com.ctrip.framework.apollo.portal.environment.Env; -import com.ctrip.framework.apollo.portal.service.GlobalSearchValueService; +import com.ctrip.framework.apollo.portal.service.GlobalSearchService; import com.google.gson.Gson; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -40,20 +40,20 @@ @RestController -public class GlobalSearchValueController { +public class GlobalSearchController { private final PortalSettings portalSettings; - private final GlobalSearchValueService globalSearchValueService; + private final GlobalSearchService globalSearchService; private final PortalConfig portalConfig; - public GlobalSearchValueController(final PortalSettings portalSettings, final GlobalSearchValueService globalSearchValueService, final PortalConfig portalConfig) { + public GlobalSearchController(final PortalSettings portalSettings, final GlobalSearchService globalSearchService, final PortalConfig portalConfig) { this.portalSettings = portalSettings; - this.globalSearchValueService = globalSearchValueService; + this.globalSearchService = globalSearchService; this.portalConfig = portalConfig; } @PreAuthorize(value = "@permissionValidator.isSuperAdmin()") @GetMapping("/global-search/item-info/by-key-or-value") - public ResponseEntity get_ItemInfo_BySearch(@RequestParam(value = "key", required = false, defaultValue = "") String key, + public ResponseEntity getItemInfoBySearch(@RequestParam(value = "key", required = false, defaultValue = "") String key, @RequestParam(value = "value", required = false , defaultValue = "") String value) { if(key.isEmpty() && value.isEmpty()) { @@ -76,7 +76,7 @@ public ResponseEntity get_ItemInfo_BySearch(@RequestParam(value = "key", requ List envBeyondLimit = new ArrayList<>(); AtomicBoolean hasMoreData = new AtomicBoolean(false); activeEnvs.forEach(env -> { - PageDTO perEnvItemInfos = globalSearchValueService.get_PerEnv_ItemInfo_BySearch(env, key, value,0, portalConfig.getPerEnvSearchMaxResults()); + PageDTO perEnvItemInfos = globalSearchService.getPerEnvItemInfoBySearch(env, key, value,0, portalConfig.getPerEnvSearchMaxResults()); if (!perEnvItemInfos.hasContent()) { return; } diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueService.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchService.java similarity index 88% rename from apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueService.java rename to apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchService.java index 8d94b9e12be..e25b289e91c 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueService.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchService.java @@ -30,16 +30,16 @@ import java.util.List; @Service -public class GlobalSearchValueService { +public class GlobalSearchService { - private static final Logger LOGGER = LoggerFactory.getLogger(GlobalSearchValueService.class); + private static final Logger LOGGER = LoggerFactory.getLogger(GlobalSearchService.class); private final AdminServiceAPI.ItemAPI itemAPI; - public GlobalSearchValueService(AdminServiceAPI.ItemAPI itemAPI) { + public GlobalSearchService(AdminServiceAPI.ItemAPI itemAPI) { this.itemAPI = itemAPI; } - public PageDTO get_PerEnv_ItemInfo_BySearch(Env env, String key, String value, int page, int size) { + public PageDTO getPerEnvItemInfoBySearch(Env env, String key, String value, int page, int size) { List perEnvItemInfos = new ArrayList<>(); PageDTO perEnvItemInfoDTOs = itemAPI.getPerEnvItemInfoBySearch(env, key, value, page, size); perEnvItemInfoDTOs.getContent().forEach(itemInfoDTO -> { diff --git a/apollo-portal/src/main/resources/static/global_search_value.html b/apollo-portal/src/main/resources/static/global_search_value.html index 3ac0a86fbf3..1d59578914b 100644 --- a/apollo-portal/src/main/resources/static/global_search_value.html +++ b/apollo-portal/src/main/resources/static/global_search_value.html @@ -73,7 +73,7 @@ {{'Global.Cluster' | translate }} {{'Global.NameSpace' | translate }} {{'Global.Key' | translate }} - {{'Global.Value' | translate }} + {{'Global.Value' | translate }} {{'Global.Operate' | translate }} @@ -82,18 +82,21 @@ {{ item.clusterName }} {{ item.namespaceName }} - {{ item.key }} - + {{ item.key }} + - {{ item.value }} - - {{ needToBeHighlightedValue }}... - ...{{ needToBeHighlightedValue }} - ...{{ needToBeHighlightedValue }}... - | {{'Global.Expand' | translate }} - - | {{'Global.Abbreviate' | translate }} + {{ item.value }} + + {{ item.value }} + + {{ needToBeHighlightedValue }}... + ...{{ needToBeHighlightedValue }} + ...{{ needToBeHighlightedValue }}... + | {{'Global.Expand' | translate }} + + | {{'Global.Abbreviate' | translate }} + diff --git a/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js b/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js index 8846596f063..e719c29f956 100644 --- a/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js +++ b/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js @@ -26,10 +26,12 @@ function GlobalSearchValueController($scope, $window, $translate, toastr, AppUti $scope.needToBeHighlightedKey = ''; $scope.needToBeHighlightedValue = ''; $scope.isShowHighlightKeyword = []; - $scope.isAllItemInfoDirectlyDisplayKey = []; - $scope.isAllItemInfoDirectlyDisplayValue = []; - $scope.isPageItemInfoDirectlyDisplayKey = []; - $scope.isPageItemInfoDirectlyDisplayValue = []; + $scope.isAllItemInfoDirectlyDisplayKeyWithoutShowHighlightKeyword = []; + $scope.isAllItemInfoDirectlyDisplayValueWithoutShowHighlightKeyword = []; + $scope.isAllItemInfoDisplayValueInARow = []; + $scope.isPageItemInfoDirectlyDisplayKeyWithoutShowHighlightKeyword = []; + $scope.isPageItemInfoDirectlyDisplayValueWithoutShowHighlightKeyword = []; + $scope.isPageItemInfoDisplayValueInARow = []; $scope.currentPage = 1; $scope.pageSize = '10'; $scope.totalItems = 0; @@ -45,8 +47,8 @@ function GlobalSearchValueController($scope, $window, $translate, toastr, AppUti $scope.convertPageSizeToInt = convertPageSizeToInt; $scope.changePage = changePage; $scope.getPagesArray = getPagesArray; - $scope.determineDisplayValue = determineDisplayValue; - $scope.determineDisplayKey = determineDisplayKey; + $scope.determineDisplayKeyOrValueWithoutShowHighlightKeyword = determineDisplayKeyOrValueWithoutShowHighlightKeyword; + $scope.determineDisplayValueInARow = determineDisplayValueInARow; init(); function init() { @@ -66,10 +68,12 @@ function GlobalSearchValueController($scope, $window, $translate, toastr, AppUti $scope.itemInfoSearchValue = itemInfoSearchValue || ''; $scope.allItemInfo = []; $scope.pageItemInfo = []; - $scope.isAllItemInfoDirectlyDisplayKey = []; - $scope.isPageItemInfoDirectlyDisplayKey = []; - $scope.isAllItemInfoDirectlyDisplayValue = []; - $scope.isPageItemInfoDirectlyDisplayValue = []; + $scope.isAllItemInfoDirectlyDisplayKeyWithoutShowHighlightKeyword = []; + $scope.isAllItemInfoDirectlyDisplayValueWithoutShowHighlightKeyword = []; + $scope.isAllItemInfoDisplayValueInARow = []; + $scope.isPageItemInfoDirectlyDisplayKeyWithoutShowHighlightKeyword = []; + $scope.isPageItemInfoDirectlyDisplayValueWithoutShowHighlightKeyword = []; + $scope.isPageItemInfoDisplayValueInARow = []; $scope.tempKey = itemInfoSearchKey || ''; $scope.tempValue = itemInfoSearchValue || ''; $scope.isShowHighlightKeyword = []; @@ -77,31 +81,34 @@ function GlobalSearchValueController($scope, $window, $translate, toastr, AppUti .then(handleSuccess).catch(handleError); function handleSuccess(result) { let allItemInfo = []; - let isAllItemInfoDirectlyDisplayValue = []; - let isAllItemInfoDirectlyDisplayKey = []; + let isAllItemInfoDirectlyDisplayValueWithoutShowHighlightKeyword = []; + let isAllItemInfoDirectlyDisplayKeyWithoutShowHighlightKeyword = []; + let isAllItemInfoDisplayValueInARow = []; if(($scope.itemInfoSearchKey === '') && !($scope.itemInfoSearchValue === '')){ $scope.needToBeHighlightedValue = $scope.itemInfoSearchValue; $scope.needToBeHighlightedKey = ''; result.data.forEach((itemInfo, index) => { allItemInfo.push(itemInfo); - isAllItemInfoDirectlyDisplayValue[index] = determineDisplayValue(itemInfo.value, itemInfoSearchValue); - isAllItemInfoDirectlyDisplayKey[index] = determineDisplayKey(itemInfo.key, ''); + isAllItemInfoDirectlyDisplayKeyWithoutShowHighlightKeyword[index] = '0'; + isAllItemInfoDirectlyDisplayValueWithoutShowHighlightKeyword[index] = determineDisplayKeyOrValueWithoutShowHighlightKeyword(itemInfo.value, itemInfoSearchValue); + isAllItemInfoDisplayValueInARow[index] = determineDisplayValueInARow(itemInfo.value, itemInfoSearchValue); }); }else if(!($scope.itemInfoSearchKey === '') && ($scope.itemInfoSearchValue === '')){ $scope.needToBeHighlightedKey = $scope.itemInfoSearchKey; $scope.needToBeHighlightedValue = ''; result.data.forEach((itemInfo, index) => { allItemInfo.push(itemInfo); - isAllItemInfoDirectlyDisplayKey[index] = determineDisplayKey(itemInfo.key, itemInfoSearchKey); - isAllItemInfoDirectlyDisplayValue[index] = '0'; + isAllItemInfoDirectlyDisplayKeyWithoutShowHighlightKeyword[index] = determineDisplayKeyOrValueWithoutShowHighlightKeyword(itemInfo.key, itemInfoSearchKey); + isAllItemInfoDirectlyDisplayValueWithoutShowHighlightKeyword[index] = '0'; }); }else{ $scope.needToBeHighlightedKey = $scope.itemInfoSearchKey; $scope.needToBeHighlightedValue = $scope.itemInfoSearchValue; result.data.forEach((itemInfo, index) => { allItemInfo.push(itemInfo); - isAllItemInfoDirectlyDisplayValue[index] = determineDisplayValue(itemInfo.value, itemInfoSearchValue); - isAllItemInfoDirectlyDisplayKey[index] = determineDisplayKey(itemInfo.key, itemInfoSearchKey); + isAllItemInfoDirectlyDisplayValueWithoutShowHighlightKeyword[index] = determineDisplayKeyOrValueWithoutShowHighlightKeyword(itemInfo.value, itemInfoSearchValue); + isAllItemInfoDirectlyDisplayKeyWithoutShowHighlightKeyword[index] = determineDisplayKeyOrValueWithoutShowHighlightKeyword(itemInfo.key, itemInfoSearchKey); + isAllItemInfoDisplayValueInARow[index] = determineDisplayValueInARow(itemInfo.value, itemInfoSearchValue); }); } $scope.totalItems = allItemInfo.length; @@ -110,10 +117,12 @@ function GlobalSearchValueController($scope, $window, $translate, toastr, AppUti const startIndex = ($scope.currentPage - 1) * parseInt($scope.pageSize, 10); const endIndex = Math.min(startIndex + parseInt($scope.pageSize, 10), allItemInfo.length); $scope.pageItemInfo = allItemInfo.slice(startIndex, endIndex); - $scope.isAllItemInfoDirectlyDisplayValue = isAllItemInfoDirectlyDisplayValue; - $scope.isAllItemInfoDirectlyDisplayKey = isAllItemInfoDirectlyDisplayKey; - $scope.isPageItemInfoDirectlyDisplayValue = isAllItemInfoDirectlyDisplayValue.slice(startIndex, endIndex); - $scope.isPageItemInfoDirectlyDisplayKey = isAllItemInfoDirectlyDisplayKey.slice(startIndex, endIndex); + $scope.isAllItemInfoDirectlyDisplayValueWithoutShowHighlightKeyword = isAllItemInfoDirectlyDisplayValueWithoutShowHighlightKeyword; + $scope.isAllItemInfoDirectlyDisplayKeyWithoutShowHighlightKeyword = isAllItemInfoDirectlyDisplayKeyWithoutShowHighlightKeyword; + $scope.isAllItemInfoDisplayValueInARow = isAllItemInfoDisplayValueInARow; + $scope.isPageItemInfoDirectlyDisplayValueWithoutShowHighlightKeyword = isAllItemInfoDirectlyDisplayValueWithoutShowHighlightKeyword.slice(startIndex, endIndex); + $scope.isPageItemInfoDirectlyDisplayKeyWithoutShowHighlightKeyword = isAllItemInfoDirectlyDisplayKeyWithoutShowHighlightKeyword.slice(startIndex, endIndex); + $scope.isPageItemInfoDisplayValueInARow = isAllItemInfoDisplayValueInARow.slice(startIndex, endIndex); getPagesArray(); if(result.hasMoreData){ toastr.warning(result.message, $translate.instant('Item.GlobalSearch.Tips')); @@ -141,15 +150,17 @@ function GlobalSearchValueController($scope, $window, $translate, toastr, AppUti if (page >= 1 && page <= $scope.totalPages) { $scope.currentPage = page; $scope.isShowHighlightKeyword = []; - $scope.isPageItemInfoDirectlyDisplayKey = []; - $scope.isPageItemInfoDirectlyDisplayValue = []; + $scope.isPageItemInfoDirectlyDisplayValueWithoutShowHighlightKeyword = []; + $scope.isPageItemInfoDirectlyDisplayKeyWithoutShowHighlightKeyword = []; + $scope.isPageItemInfoDisplayValueInARow = []; $scope.itemInfoSearchKey = $scope.tempKey; $scope.itemInfoSearchValue = $scope.tempValue; const startIndex = ($scope.currentPage - 1)* parseInt($scope.pageSize, 10); const endIndex = Math.min(startIndex + parseInt($scope.pageSize, 10), $scope.totalItems); $scope.pageItemInfo = $scope.allItemInfo.slice(startIndex, endIndex); - $scope.isPageItemInfoDirectlyDisplayValue = $scope.isAllItemInfoDirectlyDisplayValue.slice(startIndex, endIndex); - $scope.isPageItemInfoDirectlyDisplayKey = $scope.isAllItemInfoDirectlyDisplayKey.slice(startIndex, endIndex); + $scope.isPageItemInfoDirectlyDisplayValueWithoutShowHighlightKeyword = $scope.isAllItemInfoDirectlyDisplayValueWithoutShowHighlightKeyword.slice(startIndex, endIndex); + $scope.isPageItemInfoDirectlyDisplayKeyWithoutShowHighlightKeyword = $scope.isAllItemInfoDirectlyDisplayKeyWithoutShowHighlightKeyword.slice(startIndex, endIndex); + $scope.isPageItemInfoDisplayValueInARow = $scope.isAllItemInfoDisplayValueInARow.slice(startIndex, endIndex); getPagesArray(); } } @@ -189,8 +200,57 @@ function GlobalSearchValueController($scope, $window, $translate, toastr, AppUti $scope.pagesArray = pagesArray; } - function determineDisplayValue(value, highlight) { - if (value === highlight) return '0'; + function determineDisplayValueInARow(value, highlight) { + var valueColumn = document.getElementById('valueColumn'); + var testElement = document.createElement('span'); + setupTestElement(testElement, valueColumn); + testElement.innerText = value; + document.body.appendChild(testElement); + const position = determinePosition(value, highlight); + let displayValue = '0'; + if (testElement.scrollWidth > testElement.offsetWidth) { + displayValue = position; + } else { + if (testElement.scrollWidth === testElement.offsetWidth) { + return '0'; + } + switch (position) { + case '1': + testElement.innerText = value + '...' + '| ' + $translate.instant('Global.Expand'); + break; + case '2': + testElement.innerText = '...' + value + '| ' + $translate.instant('Global.Expand'); + break; + case '3': + testElement.innerText = '...' + value + '...' + '| ' + $translate.instant('Global.Expand'); + break; + default: + return '0'; + } + if (testElement.scrollWidth === testElement.offsetWidth) { + displayValue = '0'; + } else { + displayValue = position; + } + } + document.body.removeChild(testElement); + return displayValue; + } + + function setupTestElement(element, valueColumn) { + element.style.visibility = 'hidden'; + element.style.position = 'absolute'; + element.style.whiteSpace = 'nowrap'; + element.style.display = 'inline-block'; + element.style.fontFamily = '"Open Sans", sans-serif'; + const devicePixelRatio = window.devicePixelRatio; + const zoomLevel = Math.round((window.outerWidth / window.innerWidth) * 100) / 100; + element.style.fontSize = `${13 * devicePixelRatio * zoomLevel}px`; + element.style.padding = `${8 * devicePixelRatio * zoomLevel}px`; + element.style.width = `${valueColumn.offsetWidth * devicePixelRatio * zoomLevel}px`; + } + + function determinePosition(value, highlight) { const position = value.indexOf(highlight); if (position === -1) return '-1'; if (position === 0) return '1'; @@ -198,8 +258,8 @@ function GlobalSearchValueController($scope, $window, $translate, toastr, AppUti return "3"; } - function determineDisplayKey(key, highlight) { - return key === highlight ? '0' : '-1'; + function determineDisplayKeyOrValueWithoutShowHighlightKeyword(keyorvalue, highlight) { + return keyorvalue === highlight ? '0' : '-1'; } function jumpToTheEditingPage(appid,env,cluster){ diff --git a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueControllerTest.java b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchControllerTest.java similarity index 74% rename from apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueControllerTest.java rename to apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchControllerTest.java index e908caec654..4a433dc12f5 100644 --- a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchValueControllerTest.java +++ b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchControllerTest.java @@ -25,7 +25,7 @@ import com.ctrip.framework.apollo.portal.component.config.PortalConfig; import com.ctrip.framework.apollo.portal.entity.vo.ItemInfo; import com.ctrip.framework.apollo.portal.environment.Env; -import com.ctrip.framework.apollo.portal.service.GlobalSearchValueService; +import com.ctrip.framework.apollo.portal.service.GlobalSearchService; import com.google.gson.Gson; import org.junit.Before; import org.junit.Test; @@ -47,7 +47,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; @RunWith(MockitoJUnitRunner.class) -public class GlobalSearchValueControllerTest { +public class GlobalSearchControllerTest { private MockMvc mockMvc; @@ -58,10 +58,10 @@ public class GlobalSearchValueControllerTest { private PortalConfig portalConfig; @Mock - private GlobalSearchValueService globalSearchValueService; + private GlobalSearchService globalSearchService; @InjectMocks - private GlobalSearchValueController globalSearchValueController; + private GlobalSearchController globalSearchController; private final List activeEnvs = new ArrayList<>(); @@ -71,7 +71,7 @@ public class GlobalSearchValueControllerTest { public void setUp() { when(portalSettings.getActiveEnvs()).thenReturn(activeEnvs); when(portalConfig.getPerEnvSearchMaxResults()).thenReturn(perEnvSearchMaxResults); - mockMvc = MockMvcBuilders.standaloneSetup(globalSearchValueController).build(); + mockMvc = MockMvcBuilders.standaloneSetup(globalSearchController).build(); } @Test @@ -98,7 +98,7 @@ public void testGet_ItemInfo_BySearch_WithNoActiveEnvs_ReturnBadRequestAndTips() @Test public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnEmptyItemInfos() throws Exception { activeEnvs.add(Env.DEV); - when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(any(Env.class), anyString(), anyString(),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(new ArrayList<>(), PageRequest.of(0,1), 0L)); + when(globalSearchService.getPerEnvItemInfoBySearch(any(Env.class), anyString(), anyString(),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(new ArrayList<>(), PageRequest.of(0,1), 0L)); List allEnvMockItemInfos = new ArrayList<>(); ObjectMapper objectMapper = new ObjectMapper(); Map body = new HashMap<>(); @@ -112,7 +112,7 @@ public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnEmptyIt .andExpect(content().json(objectMapper.writeValueAsString(body))); verify(portalSettings,times(1)).getActiveEnvs(); verify(portalConfig,times(1)).getPerEnvSearchMaxResults(); - verify(globalSearchValueService,times(1)).get_PerEnv_ItemInfo_BySearch(any(Env.class), anyString(), anyString(),eq(0),eq(perEnvSearchMaxResults)); + verify(globalSearchService,times(1)).getPerEnvItemInfoBySearch(any(Env.class), anyString(), anyString(),eq(0),eq(perEnvSearchMaxResults)); } @Test @@ -124,8 +124,8 @@ public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnExpecte List allEnvMockItemInfos = new ArrayList<>(); devMockItemInfos.add(new ItemInfo("appid1","env1","cluster1","namespace1","query-key","query-value")); proMockItemInfos.add(new ItemInfo("appid2","env2","cluster2","namespace2","query-key","query-value")); - when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(devMockItemInfos, PageRequest.of(0,1), 201L)); - when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(proMockItemInfos, PageRequest.of(0,1), 201L)); + when(globalSearchService.getPerEnvItemInfoBySearch(eq(Env.DEV), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(devMockItemInfos, PageRequest.of(0,1), 201L)); + when(globalSearchService.getPerEnvItemInfoBySearch(eq(Env.PRO), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(proMockItemInfos, PageRequest.of(0,1), 201L)); allEnvMockItemInfos.addAll(devMockItemInfos); allEnvMockItemInfos.addAll(proMockItemInfos); ObjectMapper objectMapper = new ObjectMapper(); @@ -142,9 +142,9 @@ public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnExpecte .andExpect(content().json(objectMapper.writeValueAsString(body))); verify(portalSettings,times(1)).getActiveEnvs(); verify(portalConfig,times(5)).getPerEnvSearchMaxResults(); - verify(globalSearchValueService, times(1)).get_PerEnv_ItemInfo_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); - verify(globalSearchValueService, times(1)).get_PerEnv_ItemInfo_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); - verify(globalSearchValueService, times(2)).get_PerEnv_ItemInfo_BySearch(any(Env.class), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); + verify(globalSearchService, times(1)).getPerEnvItemInfoBySearch(eq(Env.DEV), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); + verify(globalSearchService, times(1)).getPerEnvItemInfoBySearch(eq(Env.PRO), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); + verify(globalSearchService, times(2)).getPerEnvItemInfoBySearch(any(Env.class), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); } @Test @@ -156,8 +156,8 @@ public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnExpecte List allEnvMockItemInfos = new ArrayList<>(); devMockItemInfos.add(new ItemInfo("appid1","env1","cluster1","namespace1","query-key","query-value")); proMockItemInfos.add(new ItemInfo("appid2","env2","cluster2","namespace2","query-key","query-value")); - when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(devMockItemInfos, PageRequest.of(0,1), 1L)); - when(globalSearchValueService.get_PerEnv_ItemInfo_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(proMockItemInfos, PageRequest.of(0,1), 1L)); + when(globalSearchService.getPerEnvItemInfoBySearch(eq(Env.DEV), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(devMockItemInfos, PageRequest.of(0,1), 1L)); + when(globalSearchService.getPerEnvItemInfoBySearch(eq(Env.PRO), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(proMockItemInfos, PageRequest.of(0,1), 1L)); allEnvMockItemInfos.addAll(devMockItemInfos); allEnvMockItemInfos.addAll(proMockItemInfos); ObjectMapper objectMapper = new ObjectMapper(); @@ -171,8 +171,8 @@ public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnExpecte .andExpect(status().isOk()) .andExpect(content().json(objectMapper.writeValueAsString(body))); verify(portalSettings,times(1)).getActiveEnvs(); - verify(globalSearchValueService, times(1)).get_PerEnv_ItemInfo_BySearch(eq(Env.DEV), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); - verify(globalSearchValueService, times(1)).get_PerEnv_ItemInfo_BySearch(eq(Env.PRO), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); - verify(globalSearchValueService, times(2)).get_PerEnv_ItemInfo_BySearch(any(Env.class), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); + verify(globalSearchService, times(1)).getPerEnvItemInfoBySearch(eq(Env.DEV), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); + verify(globalSearchService, times(1)).getPerEnvItemInfoBySearch(eq(Env.PRO), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); + verify(globalSearchService, times(2)).getPerEnvItemInfoBySearch(any(Env.class), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); } } diff --git a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueServiceTest.java b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchServiceTest.java similarity index 88% rename from apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueServiceTest.java rename to apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchServiceTest.java index d4544a7f695..ffafe9ba944 100644 --- a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchValueServiceTest.java +++ b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchServiceTest.java @@ -42,13 +42,13 @@ import static org.mockito.Mockito.verify; @RunWith(MockitoJUnitRunner.class) -public class GlobalSearchValueServiceTest { +public class GlobalSearchServiceTest { @Mock private AdminServiceAPI.ItemAPI itemAPI; @InjectMocks - private GlobalSearchValueService globalSearchValueService; + private GlobalSearchService globalSearchService; private final int perEnvSearchMaxResults = 200; @@ -58,7 +58,7 @@ public void testGet_PerEnv_ItemInfo_BySearch_withKeyAndValue_ReturnExpectedItemI List mockItemInfoDTOs = new ArrayList<>(); mockItemInfoDTOs.add(itemInfoDTO); Mockito.when(itemAPI.getPerEnvItemInfoBySearch(any(Env.class), eq("TestKey"), eq("TestValue"), eq(0), eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(mockItemInfoDTOs, PageRequest.of(0, 1), 1L)); - PageDTO mockItemInfos = globalSearchValueService.get_PerEnv_ItemInfo_BySearch(Env.PRO, "TestKey", "TestValue", 0, 200); + PageDTO mockItemInfos = globalSearchService.getPerEnvItemInfoBySearch(Env.PRO, "TestKey", "TestValue", 0, 200); assertEquals(1, mockItemInfos.getContent().size()); ItemInfo itemInfo = new ItemInfo("TestApp", Env.PRO.getName(), "TestCluster", "TestNamespace", "TestKey", "TestValue"); List expectedResults = new ArrayList<>(); @@ -71,7 +71,7 @@ public void testGet_PerEnv_ItemInfo_BySearch_withKeyAndValue_ReturnExpectedItemI public void testGet_PerEnv_ItemInfo_withKeyAndValue_BySearch_ReturnEmptyItemInfos() { Mockito.when(itemAPI.getPerEnvItemInfoBySearch(any(Env.class), anyString(), anyString(), eq(0), eq(perEnvSearchMaxResults))) .thenReturn(new PageDTO<>(new ArrayList<>(), PageRequest.of(0, 1), 0L)); - PageDTO result = globalSearchValueService.get_PerEnv_ItemInfo_BySearch(Env.PRO, "NonExistentKey", "NonExistentValue", 0, 200); + PageDTO result = globalSearchService.getPerEnvItemInfoBySearch(Env.PRO, "NonExistentKey", "NonExistentValue", 0, 200); assertEquals(0, result.getContent().size()); } From ea2f0c4f0175e3092e1f7d134032da9cae462408 Mon Sep 17 00:00:00 2001 From: xiaoxianhjy <162684719+xiaoxianhjy@users.noreply.github.com> Date: Wed, 11 Sep 2024 20:26:39 +0800 Subject: [PATCH 14/16] Update GlobalSearchValueController.js --- .../scripts/controller/GlobalSearchValueController.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js b/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js index e719c29f956..9468ae272c7 100644 --- a/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js +++ b/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js @@ -245,9 +245,9 @@ function GlobalSearchValueController($scope, $window, $translate, toastr, AppUti element.style.fontFamily = '"Open Sans", sans-serif'; const devicePixelRatio = window.devicePixelRatio; const zoomLevel = Math.round((window.outerWidth / window.innerWidth) * 100) / 100; - element.style.fontSize = `${13 * devicePixelRatio * zoomLevel}px`; - element.style.padding = `${8 * devicePixelRatio * zoomLevel}px`; - element.style.width = `${valueColumn.offsetWidth * devicePixelRatio * zoomLevel}px`; + element.style.fontSize = 13 * devicePixelRatio * zoomLevel + 'px'; + element.style.padding = 8 * devicePixelRatio * zoomLevel + 'px'; + element.style.width = valueColumn.offsetWidth * devicePixelRatio * zoomLevel + 'px'; } function determinePosition(value, highlight) { From de2a39605254a09a8650966005efd9782fa9c529 Mon Sep 17 00:00:00 2001 From: xiaoxianhjy <2413421030@qq.com> Date: Sun, 15 Sep 2024 19:14:11 +0800 Subject: [PATCH 15/16] Optimized some of the logic --- .../common/http/SearchResponseEntity.java | 67 ++++++++++ .../controller/GlobalSearchController.java | 71 +--------- .../portal/service/GlobalSearchService.java | 45 +++++-- .../controller/GlobalSearchValueController.js | 15 +-- .../GlobalSearchControllerTest.java | 125 ++++++------------ .../service/GlobalSearchServiceTest.java | 77 +++++++++-- 6 files changed, 215 insertions(+), 185 deletions(-) create mode 100644 apollo-common/src/main/java/com/ctrip/framework/apollo/common/http/SearchResponseEntity.java diff --git a/apollo-common/src/main/java/com/ctrip/framework/apollo/common/http/SearchResponseEntity.java b/apollo-common/src/main/java/com/ctrip/framework/apollo/common/http/SearchResponseEntity.java new file mode 100644 index 00000000000..0eb6cf446da --- /dev/null +++ b/apollo-common/src/main/java/com/ctrip/framework/apollo/common/http/SearchResponseEntity.java @@ -0,0 +1,67 @@ +/* + * Copyright 2024 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.ctrip.framework.apollo.common.http; + +import org.springframework.http.HttpStatus; + +public class SearchResponseEntity { + + private T body; + private boolean hasMoreData; + private Object message; + private int code; + + public static SearchResponseEntity ok(T body){ + SearchResponseEntity SearchResponseEntity = new SearchResponseEntity<>(); + SearchResponseEntity.message = HttpStatus.OK.getReasonPhrase(); + SearchResponseEntity.code = HttpStatus.OK.value(); + SearchResponseEntity.body = body; + SearchResponseEntity.hasMoreData = false; + return SearchResponseEntity; + } + + public static SearchResponseEntity okWithMessage(T body, Object message){ + SearchResponseEntity SearchResponseEntity = new SearchResponseEntity<>(); + SearchResponseEntity.message = message; + SearchResponseEntity.code = HttpStatus.OK.value(); + SearchResponseEntity.body = body; + SearchResponseEntity.hasMoreData = true; + return SearchResponseEntity; + } + + public static SearchResponseEntity error(HttpStatus httpCode, Object message){ + SearchResponseEntity SearchResponseEntity = new SearchResponseEntity<>(); + SearchResponseEntity.message = message; + SearchResponseEntity.code = httpCode.value(); + return SearchResponseEntity; + } + + public int getCode() { + return code; + } + + public Object getMessage() { + return message; + } + + public T getBody() { + return body; + } + + public boolean isHasMoreData() {return hasMoreData;} + +} \ No newline at end of file diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchController.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchController.java index b0ecf9b25b9..bb44b22932f 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchController.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchController.java @@ -17,95 +17,38 @@ package com.ctrip.framework.apollo.portal.controller; -import com.ctrip.framework.apollo.common.dto.PageDTO; -import com.ctrip.framework.apollo.portal.component.PortalSettings; +import com.ctrip.framework.apollo.common.exception.BadRequestException; +import com.ctrip.framework.apollo.common.http.SearchResponseEntity; import com.ctrip.framework.apollo.portal.component.config.PortalConfig; import com.ctrip.framework.apollo.portal.entity.vo.ItemInfo; -import com.ctrip.framework.apollo.portal.environment.Env; import com.ctrip.framework.apollo.portal.service.GlobalSearchService; -import com.google.gson.Gson; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; - @RestController public class GlobalSearchController { - private final PortalSettings portalSettings; private final GlobalSearchService globalSearchService; private final PortalConfig portalConfig; - public GlobalSearchController(final PortalSettings portalSettings, final GlobalSearchService globalSearchService, final PortalConfig portalConfig) { - this.portalSettings = portalSettings; + public GlobalSearchController(final GlobalSearchService globalSearchService, final PortalConfig portalConfig) { this.globalSearchService = globalSearchService; this.portalConfig = portalConfig; } @PreAuthorize(value = "@permissionValidator.isSuperAdmin()") @GetMapping("/global-search/item-info/by-key-or-value") - public ResponseEntity getItemInfoBySearch(@RequestParam(value = "key", required = false, defaultValue = "") String key, - @RequestParam(value = "value", required = false , defaultValue = "") String value) { + public SearchResponseEntity> getItemInfoBySearch(@RequestParam(value = "key", required = false, defaultValue = "") String key, + @RequestParam(value = "value", required = false , defaultValue = "") String value) { if(key.isEmpty() && value.isEmpty()) { - return ResponseEntity - .status(HttpStatus.BAD_REQUEST) - .contentType(MediaType.APPLICATION_JSON) - .body(new Gson().toJson("Please enter at least one search criterion in either key or value.")); - } - - List activeEnvs = portalSettings.getActiveEnvs(); - if(activeEnvs.isEmpty()){ - return ResponseEntity - .status(HttpStatus.BAD_REQUEST) - .contentType(MediaType.APPLICATION_JSON) - .body(new Gson().toJson("Request accepted. Looking for available admin service.")); - - } - - List allEnvItemInfos = new ArrayList<>(); - List envBeyondLimit = new ArrayList<>(); - AtomicBoolean hasMoreData = new AtomicBoolean(false); - activeEnvs.forEach(env -> { - PageDTO perEnvItemInfos = globalSearchService.getPerEnvItemInfoBySearch(env, key, value,0, portalConfig.getPerEnvSearchMaxResults()); - if (!perEnvItemInfos.hasContent()) { - return; - } - if(perEnvItemInfos.getTotal() > portalConfig.getPerEnvSearchMaxResults()){ - envBeyondLimit.add(env.getName()); - hasMoreData.set(true); - } - allEnvItemInfos.addAll(perEnvItemInfos.getContent()); - }); - - Map body = new HashMap<>(); - if(hasMoreData.get()){ - body.put("data", allEnvItemInfos); - body.put("hasMoreData", true); - body.put("message", String.format( - "In %s , more than %d items found (Exceeded the maximum search quantity for a single environment). Please enter more precise criteria to narrow down the search scope.", - String.join(" , ", envBeyondLimit), portalConfig.getPerEnvSearchMaxResults())); - return ResponseEntity - .ok() - .contentType(MediaType.APPLICATION_JSON) - .body(body); + throw new BadRequestException("Please enter at least one search criterion in either key or value."); } - body.put("data", allEnvItemInfos); - body.put("hasMoreData", false); - return ResponseEntity - .ok() - .contentType(MediaType.APPLICATION_JSON) - .body(body); + return globalSearchService.getAllEnvItemInfoBySearch(key, value, 0, portalConfig.getPerEnvSearchMaxResults()); } } diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchService.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchService.java index e25b289e91c..5c7cbdcf5ba 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchService.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/GlobalSearchService.java @@ -18,39 +18,60 @@ import com.ctrip.framework.apollo.common.dto.ItemInfoDTO; import com.ctrip.framework.apollo.common.dto.PageDTO; +import com.ctrip.framework.apollo.common.http.SearchResponseEntity; import com.ctrip.framework.apollo.portal.api.AdminServiceAPI; +import com.ctrip.framework.apollo.portal.component.PortalSettings; import com.ctrip.framework.apollo.portal.entity.vo.ItemInfo; import com.ctrip.framework.apollo.portal.environment.Env; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; @Service public class GlobalSearchService { private static final Logger LOGGER = LoggerFactory.getLogger(GlobalSearchService.class); private final AdminServiceAPI.ItemAPI itemAPI; + private final PortalSettings portalSettings; - public GlobalSearchService(AdminServiceAPI.ItemAPI itemAPI) { + public GlobalSearchService(AdminServiceAPI.ItemAPI itemAPI, PortalSettings portalSettings) { this.itemAPI = itemAPI; + this.portalSettings = portalSettings; } - public PageDTO getPerEnvItemInfoBySearch(Env env, String key, String value, int page, int size) { - List perEnvItemInfos = new ArrayList<>(); - PageDTO perEnvItemInfoDTOs = itemAPI.getPerEnvItemInfoBySearch(env, key, value, page, size); - perEnvItemInfoDTOs.getContent().forEach(itemInfoDTO -> { - try { - ItemInfo itemInfo = new ItemInfo(itemInfoDTO.getAppId(),env.getName(),itemInfoDTO.getClusterName(),itemInfoDTO.getNamespaceName(),itemInfoDTO.getKey(),itemInfoDTO.getValue()); - perEnvItemInfos.add(itemInfo); - } catch (Exception e) { - LOGGER.error("Error converting ItemInfoDTO to ItemInfo for item: {}", itemInfoDTO, e); + public SearchResponseEntity> getAllEnvItemInfoBySearch(String key, String value, int page, int size) { + List activeEnvs = portalSettings.getActiveEnvs(); + List envBeyondLimit = new ArrayList<>(); + AtomicBoolean hasMoreData = new AtomicBoolean(false); + List allEnvItemInfos = new ArrayList<>(); + activeEnvs.forEach(env -> { + PageDTO perEnvItemInfoDTOs = itemAPI.getPerEnvItemInfoBySearch(env, key, value, page, size); + if (!perEnvItemInfoDTOs.hasContent()) { + return; + } + perEnvItemInfoDTOs.getContent().forEach(itemInfoDTO -> { + try { + ItemInfo itemInfo = new ItemInfo(itemInfoDTO.getAppId(),env.getName(),itemInfoDTO.getClusterName(),itemInfoDTO.getNamespaceName(),itemInfoDTO.getKey(),itemInfoDTO.getValue()); + allEnvItemInfos.add(itemInfo); + } catch (Exception e) { + LOGGER.error("Error converting ItemInfoDTO to ItemInfo for item: {}", itemInfoDTO, e); + } + }); + if(perEnvItemInfoDTOs.getTotal() > size){ + envBeyondLimit.add(env.getName()); + hasMoreData.set(true); } }); - return new PageDTO<>(perEnvItemInfos, PageRequest.of(page, size), perEnvItemInfoDTOs.getTotal()); + if(hasMoreData.get()){ + return SearchResponseEntity.okWithMessage(allEnvItemInfos,String.format( + "In %s , more than %d items found (Exceeded the maximum search quantity for a single environment). Please enter more precise criteria to narrow down the search scope.", + String.join(" , ", envBeyondLimit), size)); + } + return SearchResponseEntity.ok(allEnvItemInfos); } } diff --git a/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js b/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js index 9468ae272c7..ee720aacc58 100644 --- a/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js +++ b/apollo-portal/src/main/resources/static/scripts/controller/GlobalSearchValueController.js @@ -87,7 +87,7 @@ function GlobalSearchValueController($scope, $window, $translate, toastr, AppUti if(($scope.itemInfoSearchKey === '') && !($scope.itemInfoSearchValue === '')){ $scope.needToBeHighlightedValue = $scope.itemInfoSearchValue; $scope.needToBeHighlightedKey = ''; - result.data.forEach((itemInfo, index) => { + result.body.forEach((itemInfo, index) => { allItemInfo.push(itemInfo); isAllItemInfoDirectlyDisplayKeyWithoutShowHighlightKeyword[index] = '0'; isAllItemInfoDirectlyDisplayValueWithoutShowHighlightKeyword[index] = determineDisplayKeyOrValueWithoutShowHighlightKeyword(itemInfo.value, itemInfoSearchValue); @@ -96,7 +96,7 @@ function GlobalSearchValueController($scope, $window, $translate, toastr, AppUti }else if(!($scope.itemInfoSearchKey === '') && ($scope.itemInfoSearchValue === '')){ $scope.needToBeHighlightedKey = $scope.itemInfoSearchKey; $scope.needToBeHighlightedValue = ''; - result.data.forEach((itemInfo, index) => { + result.body.forEach((itemInfo, index) => { allItemInfo.push(itemInfo); isAllItemInfoDirectlyDisplayKeyWithoutShowHighlightKeyword[index] = determineDisplayKeyOrValueWithoutShowHighlightKeyword(itemInfo.key, itemInfoSearchKey); isAllItemInfoDirectlyDisplayValueWithoutShowHighlightKeyword[index] = '0'; @@ -104,7 +104,7 @@ function GlobalSearchValueController($scope, $window, $translate, toastr, AppUti }else{ $scope.needToBeHighlightedKey = $scope.itemInfoSearchKey; $scope.needToBeHighlightedValue = $scope.itemInfoSearchValue; - result.data.forEach((itemInfo, index) => { + result.body.forEach((itemInfo, index) => { allItemInfo.push(itemInfo); isAllItemInfoDirectlyDisplayValueWithoutShowHighlightKeyword[index] = determineDisplayKeyOrValueWithoutShowHighlightKeyword(itemInfo.value, itemInfoSearchValue); isAllItemInfoDirectlyDisplayKeyWithoutShowHighlightKeyword[index] = determineDisplayKeyOrValueWithoutShowHighlightKeyword(itemInfo.key, itemInfoSearchKey); @@ -131,14 +131,7 @@ function GlobalSearchValueController($scope, $window, $translate, toastr, AppUti function handleError(error) { $scope.itemInfo = []; - switch (error.status) { - case 400: - toastr.warning(error.data, $translate.instant('Item.GlobalSearch.Tips')); - break; - default: - toastr.error(AppUtil.errorMsg(error), $translate.instant('Item.GlobalSearchSystemError')); - break; - } + toastr.error(AppUtil.errorMsg(error), $translate.instant('Item.GlobalSearchSystemError')); } } diff --git a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchControllerTest.java b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchControllerTest.java index 4a433dc12f5..03231dcc59e 100644 --- a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchControllerTest.java +++ b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/controller/GlobalSearchControllerTest.java @@ -20,20 +20,16 @@ * @author hujiyuan 2024-08-10 */ -import com.ctrip.framework.apollo.common.dto.PageDTO; -import com.ctrip.framework.apollo.portal.component.PortalSettings; +import com.ctrip.framework.apollo.common.http.SearchResponseEntity; import com.ctrip.framework.apollo.portal.component.config.PortalConfig; import com.ctrip.framework.apollo.portal.entity.vo.ItemInfo; -import com.ctrip.framework.apollo.portal.environment.Env; import com.ctrip.framework.apollo.portal.service.GlobalSearchService; -import com.google.gson.Gson; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; -import org.springframework.data.domain.PageRequest; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; @@ -44,16 +40,12 @@ import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import com.fasterxml.jackson.databind.ObjectMapper; @RunWith(MockitoJUnitRunner.class) public class GlobalSearchControllerTest { private MockMvc mockMvc; - @Mock - private PortalSettings portalSettings; - @Mock private PortalConfig portalConfig; @@ -63,116 +55,81 @@ public class GlobalSearchControllerTest { @InjectMocks private GlobalSearchController globalSearchController; - private final List activeEnvs = new ArrayList<>(); - private final int perEnvSearchMaxResults = 200; @Before public void setUp() { - when(portalSettings.getActiveEnvs()).thenReturn(activeEnvs); when(portalConfig.getPerEnvSearchMaxResults()).thenReturn(perEnvSearchMaxResults); mockMvc = MockMvcBuilders.standaloneSetup(globalSearchController).build(); } - @Test - public void testGet_ItemInfo_BySearch_WithEmptyKeyAndValue_ReturnBadRequestAndTips() throws Exception { - mockMvc.perform(MockMvcRequestBuilders.get("/global-search/item-info/by-key-or-value") - .contentType(MediaType.APPLICATION_JSON) - .param("key", "") - .param("value", "")) - .andExpect(status().isBadRequest()) - .andExpect(content().json(new Gson().toJson("Please enter at least one search criterion in either key or value."))); - } - - @Test - public void testGet_ItemInfo_BySearch_WithNoActiveEnvs_ReturnBadRequestAndTips() throws Exception { - activeEnvs.clear(); - mockMvc.perform(MockMvcRequestBuilders.get("/global-search/item-info/by-key-or-value") - .contentType(MediaType.APPLICATION_JSON) - .param("key", "query-key") - .param("value", "query-value")) - .andExpect(status().isBadRequest()) - .andExpect(content().json(new Gson().toJson("Request accepted. Looking for available admin service."))); - } - @Test public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnEmptyItemInfos() throws Exception { - activeEnvs.add(Env.DEV); - when(globalSearchService.getPerEnvItemInfoBySearch(any(Env.class), anyString(), anyString(),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(new ArrayList<>(), PageRequest.of(0,1), 0L)); - List allEnvMockItemInfos = new ArrayList<>(); - ObjectMapper objectMapper = new ObjectMapper(); - Map body = new HashMap<>(); - body.put("data", allEnvMockItemInfos); - body.put("hasMoreData", false); + when(globalSearchService.getAllEnvItemInfoBySearch(anyString(), anyString(),eq(0),eq(perEnvSearchMaxResults))).thenReturn(SearchResponseEntity.ok(new ArrayList<>())); mockMvc.perform(MockMvcRequestBuilders.get("/global-search/item-info/by-key-or-value") .contentType(MediaType.APPLICATION_JSON) .param("key", "query-key") .param("value", "query-value")) .andExpect(status().isOk()) - .andExpect(content().json(objectMapper.writeValueAsString(body))); - verify(portalSettings,times(1)).getActiveEnvs(); + .andExpect(content().json("{\"body\":[],\"hasMoreData\":false,\"message\":\"OK\",\"code\":200}")); verify(portalConfig,times(1)).getPerEnvSearchMaxResults(); - verify(globalSearchService,times(1)).getPerEnvItemInfoBySearch(any(Env.class), anyString(), anyString(),eq(0),eq(perEnvSearchMaxResults)); + verify(globalSearchService,times(1)).getAllEnvItemInfoBySearch(anyString(), anyString(),eq(0),eq(perEnvSearchMaxResults)); } @Test public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnExpectedItemInfos_ButOverPerEnvLimit() throws Exception { - activeEnvs.add(Env.DEV); - activeEnvs.add(Env.PRO); - List devMockItemInfos = new ArrayList<>(); - List proMockItemInfos = new ArrayList<>(); List allEnvMockItemInfos = new ArrayList<>(); - devMockItemInfos.add(new ItemInfo("appid1","env1","cluster1","namespace1","query-key","query-value")); - proMockItemInfos.add(new ItemInfo("appid2","env2","cluster2","namespace2","query-key","query-value")); - when(globalSearchService.getPerEnvItemInfoBySearch(eq(Env.DEV), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(devMockItemInfos, PageRequest.of(0,1), 201L)); - when(globalSearchService.getPerEnvItemInfoBySearch(eq(Env.PRO), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(proMockItemInfos, PageRequest.of(0,1), 201L)); - allEnvMockItemInfos.addAll(devMockItemInfos); - allEnvMockItemInfos.addAll(proMockItemInfos); - ObjectMapper objectMapper = new ObjectMapper(); - Map body = new HashMap<>(); - body.put("data", allEnvMockItemInfos); - body.put("hasMoreData", true); - String message = "In DEV , PRO , more than "+perEnvSearchMaxResults+" items found (Exceeded the maximum search quantity for a single environment). Please enter more precise criteria to narrow down the search scope."; - body.put("message", message); + allEnvMockItemInfos.add(new ItemInfo("appid1","env1","cluster1","namespace1","query-key","query-value")); + allEnvMockItemInfos.add(new ItemInfo("appid2","env2","cluster2","namespace2","query-key","query-value")); + when(globalSearchService.getAllEnvItemInfoBySearch(eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(SearchResponseEntity.okWithMessage(allEnvMockItemInfos,"In DEV , PRO , more than "+perEnvSearchMaxResults+" items found (Exceeded the maximum search quantity for a single environment). Please enter more precise criteria to narrow down the search scope.")); mockMvc.perform(MockMvcRequestBuilders.get("/global-search/item-info/by-key-or-value") .contentType(MediaType.APPLICATION_JSON) .param("key", "query-key") .param("value", "query-value")) .andExpect(status().isOk()) - .andExpect(content().json(objectMapper.writeValueAsString(body))); - verify(portalSettings,times(1)).getActiveEnvs(); - verify(portalConfig,times(5)).getPerEnvSearchMaxResults(); - verify(globalSearchService, times(1)).getPerEnvItemInfoBySearch(eq(Env.DEV), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); - verify(globalSearchService, times(1)).getPerEnvItemInfoBySearch(eq(Env.PRO), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); - verify(globalSearchService, times(2)).getPerEnvItemInfoBySearch(any(Env.class), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); + .andExpect(content().json("{\"body\":[" + + " { \"appId\": \"appid1\",\n" + + " \"envName\": \"env1\",\n" + + " \"clusterName\": \"cluster1\",\n" + + " \"namespaceName\": \"namespace1\",\n" + + " \"key\": \"query-key\",\n" + + " \"value\": \"query-value\"}," + + " { \"appId\": \"appid2\",\n" + + " \"envName\": \"env2\",\n" + + " \"clusterName\": \"cluster2\",\n" + + " \"namespaceName\": \"namespace2\",\n" + + " \"key\": \"query-key\",\n" + + " \"value\": \"query-value\"}],\"hasMoreData\":true,\"message\":\"In DEV , PRO , more than 200 items found (Exceeded the maximum search quantity for a single environment). Please enter more precise criteria to narrow down the search scope.\",\"code\":200}")); + verify(portalConfig,times(1)).getPerEnvSearchMaxResults(); + verify(globalSearchService, times(1)).getAllEnvItemInfoBySearch(eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); } @Test public void testGet_ItemInfo_BySearch_WithKeyAndValueAndActiveEnvs_ReturnExpectedItemInfos() throws Exception { - activeEnvs.add(Env.DEV); - activeEnvs.add(Env.PRO); - List devMockItemInfos = new ArrayList<>(); - List proMockItemInfos = new ArrayList<>(); List allEnvMockItemInfos = new ArrayList<>(); - devMockItemInfos.add(new ItemInfo("appid1","env1","cluster1","namespace1","query-key","query-value")); - proMockItemInfos.add(new ItemInfo("appid2","env2","cluster2","namespace2","query-key","query-value")); - when(globalSearchService.getPerEnvItemInfoBySearch(eq(Env.DEV), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(devMockItemInfos, PageRequest.of(0,1), 1L)); - when(globalSearchService.getPerEnvItemInfoBySearch(eq(Env.PRO), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(proMockItemInfos, PageRequest.of(0,1), 1L)); - allEnvMockItemInfos.addAll(devMockItemInfos); - allEnvMockItemInfos.addAll(proMockItemInfos); - ObjectMapper objectMapper = new ObjectMapper(); - Map body = new HashMap<>(); - body.put("data", allEnvMockItemInfos); - body.put("hasMoreData", false); + allEnvMockItemInfos.add(new ItemInfo("appid1","env1","cluster1","namespace1","query-key","query-value")); + allEnvMockItemInfos.add(new ItemInfo("appid2","env2","cluster2","namespace2","query-key","query-value")); + when(globalSearchService.getAllEnvItemInfoBySearch(eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults))).thenReturn(SearchResponseEntity.ok(allEnvMockItemInfos)); + mockMvc.perform(MockMvcRequestBuilders.get("/global-search/item-info/by-key-or-value") .contentType(MediaType.APPLICATION_JSON) .param("key", "query-key") .param("value", "query-value")) .andExpect(status().isOk()) - .andExpect(content().json(objectMapper.writeValueAsString(body))); - verify(portalSettings,times(1)).getActiveEnvs(); - verify(globalSearchService, times(1)).getPerEnvItemInfoBySearch(eq(Env.DEV), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); - verify(globalSearchService, times(1)).getPerEnvItemInfoBySearch(eq(Env.PRO), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); - verify(globalSearchService, times(2)).getPerEnvItemInfoBySearch(any(Env.class), eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); + .andExpect(content().json("{\"body\":[" + + " { \"appId\": \"appid1\",\n" + + " \"envName\": \"env1\",\n" + + " \"clusterName\": \"cluster1\",\n" + + " \"namespaceName\": \"namespace1\",\n" + + " \"key\": \"query-key\",\n" + + " \"value\": \"query-value\"}," + + " { \"appId\": \"appid2\",\n" + + " \"envName\": \"env2\",\n" + + " \"clusterName\": \"cluster2\",\n" + + " \"namespaceName\": \"namespace2\",\n" + + " \"key\": \"query-key\",\n" + + " \"value\": \"query-value\"}],\"hasMoreData\":false,\"message\":\"OK\",\"code\":200}")); + verify(globalSearchService, times(1)).getAllEnvItemInfoBySearch(eq("query-key"), eq("query-value"),eq(0),eq(perEnvSearchMaxResults)); } + } diff --git a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchServiceTest.java b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchServiceTest.java index ffafe9ba944..661a692447d 100644 --- a/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchServiceTest.java +++ b/apollo-portal/src/test/java/com/ctrip/framework/apollo/portal/service/GlobalSearchServiceTest.java @@ -22,9 +22,12 @@ import com.ctrip.framework.apollo.common.dto.ItemInfoDTO; import com.ctrip.framework.apollo.common.dto.PageDTO; +import com.ctrip.framework.apollo.common.http.SearchResponseEntity; import com.ctrip.framework.apollo.portal.api.AdminServiceAPI; +import com.ctrip.framework.apollo.portal.component.PortalSettings; import com.ctrip.framework.apollo.portal.entity.vo.ItemInfo; import com.ctrip.framework.apollo.portal.environment.Env; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; @@ -38,8 +41,8 @@ import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.*; +import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class GlobalSearchServiceTest { @@ -47,32 +50,78 @@ public class GlobalSearchServiceTest { @Mock private AdminServiceAPI.ItemAPI itemAPI; + @Mock + private PortalSettings portalSettings; + @InjectMocks private GlobalSearchService globalSearchService; - private final int perEnvSearchMaxResults = 200; + private final List activeEnvs = new ArrayList<>(); + + @Before + public void setUp() { + when(portalSettings.getActiveEnvs()).thenReturn(activeEnvs); + } @Test public void testGet_PerEnv_ItemInfo_BySearch_withKeyAndValue_ReturnExpectedItemInfos() { + activeEnvs.add(Env.DEV); + activeEnvs.add(Env.PRO); + ItemInfoDTO itemInfoDTO = new ItemInfoDTO("TestApp","TestCluster","TestNamespace","TestKey","TestValue"); List mockItemInfoDTOs = new ArrayList<>(); mockItemInfoDTOs.add(itemInfoDTO); - Mockito.when(itemAPI.getPerEnvItemInfoBySearch(any(Env.class), eq("TestKey"), eq("TestValue"), eq(0), eq(perEnvSearchMaxResults))).thenReturn(new PageDTO<>(mockItemInfoDTOs, PageRequest.of(0, 1), 1L)); - PageDTO mockItemInfos = globalSearchService.getPerEnvItemInfoBySearch(Env.PRO, "TestKey", "TestValue", 0, 200); - assertEquals(1, mockItemInfos.getContent().size()); - ItemInfo itemInfo = new ItemInfo("TestApp", Env.PRO.getName(), "TestCluster", "TestNamespace", "TestKey", "TestValue"); - List expectedResults = new ArrayList<>(); - expectedResults.add(itemInfo); - verify(itemAPI,times(1)).getPerEnvItemInfoBySearch(any(Env.class), eq("TestKey"), eq("TestValue"), eq(0), eq(perEnvSearchMaxResults)); - assertEquals(expectedResults.toString(), mockItemInfos.getContent().toString()); + Mockito.when(itemAPI.getPerEnvItemInfoBySearch(any(Env.class), eq("TestKey"), eq("TestValue"), eq(0), eq(1))).thenReturn(new PageDTO<>(mockItemInfoDTOs, PageRequest.of(0, 1), 1L)); + SearchResponseEntity> mockItemInfos = globalSearchService.getAllEnvItemInfoBySearch("TestKey", "TestValue", 0, 1); + assertEquals(2, mockItemInfos.getBody().size()); + + List devMockItemInfos = new ArrayList<>(); + List proMockItemInfos = new ArrayList<>(); + List allEnvMockItemInfos = new ArrayList<>(); + devMockItemInfos.add(new ItemInfo("TestApp", Env.DEV.getName(), "TestCluster", "TestNamespace", "TestKey", "TestValue")); + proMockItemInfos.add(new ItemInfo("TestApp", Env.PRO.getName(), "TestCluster", "TestNamespace", "TestKey", "TestValue")); + allEnvMockItemInfos.addAll(devMockItemInfos); + allEnvMockItemInfos.addAll(proMockItemInfos); + + verify(itemAPI,times(2)).getPerEnvItemInfoBySearch(any(Env.class), eq("TestKey"), eq("TestValue"), eq(0), eq(1)); + verify(portalSettings,times(1)).getActiveEnvs(); + assertEquals(allEnvMockItemInfos.toString(), mockItemInfos.getBody().toString()); } @Test public void testGet_PerEnv_ItemInfo_withKeyAndValue_BySearch_ReturnEmptyItemInfos() { - Mockito.when(itemAPI.getPerEnvItemInfoBySearch(any(Env.class), anyString(), anyString(), eq(0), eq(perEnvSearchMaxResults))) + activeEnvs.add(Env.DEV); + activeEnvs.add(Env.PRO); + Mockito.when(itemAPI.getPerEnvItemInfoBySearch(any(Env.class), anyString(), anyString(), eq(0), eq(1))) .thenReturn(new PageDTO<>(new ArrayList<>(), PageRequest.of(0, 1), 0L)); - PageDTO result = globalSearchService.getPerEnvItemInfoBySearch(Env.PRO, "NonExistentKey", "NonExistentValue", 0, 200); - assertEquals(0, result.getContent().size()); + SearchResponseEntity> result = globalSearchService.getAllEnvItemInfoBySearch("NonExistentKey", "NonExistentValue", 0, 1); + assertEquals(0, result.getBody().size()); + } + + @Test + public void testGet_PerEnv_ItemInfo_BySearch_withKeyAndValue_ReturnExpectedItemInfos_ButOverPerEnvLimit() { + activeEnvs.add(Env.DEV); + activeEnvs.add(Env.PRO); + + ItemInfoDTO itemInfoDTO = new ItemInfoDTO("TestApp","TestCluster","TestNamespace","TestKey","TestValue"); + List mockItemInfoDTOs = new ArrayList<>(); + mockItemInfoDTOs.add(itemInfoDTO); + Mockito.when(itemAPI.getPerEnvItemInfoBySearch(any(Env.class), eq("TestKey"), eq("TestValue"), eq(0), eq(1))).thenReturn(new PageDTO<>(mockItemInfoDTOs, PageRequest.of(0, 1), 2L)); + SearchResponseEntity> mockItemInfos = globalSearchService.getAllEnvItemInfoBySearch("TestKey", "TestValue", 0, 1); + assertEquals(2, mockItemInfos.getBody().size()); + + List devMockItemInfos = new ArrayList<>(); + List proMockItemInfos = new ArrayList<>(); + List allEnvMockItemInfos = new ArrayList<>(); + devMockItemInfos.add(new ItemInfo("TestApp", Env.DEV.getName(), "TestCluster", "TestNamespace", "TestKey", "TestValue")); + proMockItemInfos.add(new ItemInfo("TestApp", Env.PRO.getName(), "TestCluster", "TestNamespace", "TestKey", "TestValue")); + allEnvMockItemInfos.addAll(devMockItemInfos); + allEnvMockItemInfos.addAll(proMockItemInfos); + String message = "In DEV , PRO , more than 1 items found (Exceeded the maximum search quantity for a single environment). Please enter more precise criteria to narrow down the search scope."; + verify(itemAPI,times(2)).getPerEnvItemInfoBySearch(any(Env.class), eq("TestKey"), eq("TestValue"), eq(0), eq(1)); + verify(portalSettings,times(1)).getActiveEnvs(); + assertEquals(allEnvMockItemInfos.toString(), mockItemInfos.getBody().toString()); + assertEquals(message, mockItemInfos.getMessage()); } } From c63a2d60c69da75c4159867e8f3552dd5e0eb4ad Mon Sep 17 00:00:00 2001 From: xiaoxianhjy <2413421030@qq.com> Date: Mon, 16 Sep 2024 21:47:34 +0800 Subject: [PATCH 16/16] Added some unit tests --- .../apollo/common/dto/ItemInfoDTOTest.java | 61 ++++++++++++++++++ .../common/http/SearchResponseEntityTest.java | 62 +++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 apollo-common/src/test/java/com/ctrip/framework/apollo/common/dto/ItemInfoDTOTest.java create mode 100644 apollo-common/src/test/java/com/ctrip/framework/apollo/common/http/SearchResponseEntityTest.java diff --git a/apollo-common/src/test/java/com/ctrip/framework/apollo/common/dto/ItemInfoDTOTest.java b/apollo-common/src/test/java/com/ctrip/framework/apollo/common/dto/ItemInfoDTOTest.java new file mode 100644 index 00000000000..5a138b691cf --- /dev/null +++ b/apollo-common/src/test/java/com/ctrip/framework/apollo/common/dto/ItemInfoDTOTest.java @@ -0,0 +1,61 @@ +/* + * Copyright 2024 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ +package com.ctrip.framework.apollo.common.dto; + + +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class ItemInfoDTOTest { + + private ItemInfoDTO itemInfoDTO; + + @Before + public void setUp() { + itemInfoDTO = new ItemInfoDTO("testAppId", "testClusterName", "testNamespaceName", "testKey", "testValue"); + } + + @Test + public void testGetAppId_ShouldReturnCorrectAppId() { + assertEquals("testAppId", itemInfoDTO.getAppId()); + } + + @Test + public void testGetClusterName_ShouldReturnCorrectClusterName() { + assertEquals("testClusterName", itemInfoDTO.getClusterName()); + } + + @Test + public void testGetNamespaceName_ShouldReturnCorrectNamespaceName() { + assertEquals("testNamespaceName", itemInfoDTO.getNamespaceName()); + } + + @Test + public void testGetKey_ShouldReturnCorrectKey() { + assertEquals("testKey", itemInfoDTO.getKey()); + } + + @Test + public void testGetValue_ShouldReturnCorrectValue() { + assertEquals("testValue", itemInfoDTO.getValue()); + } + + @Test + public void testToString_ShouldReturnExpectedString() { + assertEquals("ItemInfoDTO{appId='testAppId', clusterName='testClusterName', namespaceName='testNamespaceName', key='testKey', value='testValue'}", itemInfoDTO.toString()); + } +} diff --git a/apollo-common/src/test/java/com/ctrip/framework/apollo/common/http/SearchResponseEntityTest.java b/apollo-common/src/test/java/com/ctrip/framework/apollo/common/http/SearchResponseEntityTest.java new file mode 100644 index 00000000000..14e250004eb --- /dev/null +++ b/apollo-common/src/test/java/com/ctrip/framework/apollo/common/http/SearchResponseEntityTest.java @@ -0,0 +1,62 @@ +/* + * Copyright 2024 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ +package com.ctrip.framework.apollo.common.http; + + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.http.HttpStatus; + +import static org.junit.Assert.*; + +@RunWith(MockitoJUnitRunner.class) +public class SearchResponseEntityTest { + + @Test + public void testOk_WithValidBody_ShouldReturnOkResponse() { + String body = "test body"; + SearchResponseEntity response = SearchResponseEntity.ok(body); + + assertEquals(HttpStatus.OK.value(), response.getCode()); + assertEquals(HttpStatus.OK.getReasonPhrase(), response.getMessage()); + assertEquals(body, response.getBody()); + assertFalse(response.isHasMoreData()); + } + + @Test + public void testOkWithMessage_WithValidBodyAndMessage_ShouldReturnOkResponseWithMessage() { + String body = "test body"; + String message = "test message"; + SearchResponseEntity response = SearchResponseEntity.okWithMessage(body, message); + + assertEquals(HttpStatus.OK.value(), response.getCode()); + assertEquals(message, response.getMessage()); + assertEquals(body, response.getBody()); + assertTrue(response.isHasMoreData()); + } + + @Test + public void testError_WithValidCodeAndMessage_ShouldReturnErrorResponse() { + HttpStatus httpCode = HttpStatus.BAD_REQUEST; + String message = "error message"; + SearchResponseEntity response = SearchResponseEntity.error(httpCode, message); + + assertEquals(httpCode.value(), response.getCode()); + assertEquals(message, response.getMessage()); + assertEquals(null, response.getBody()); + assertFalse(response.isHasMoreData()); + } +}

    Awc&Hhr=&ho>y`^z_Wku>AZ_L-Rt- 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%0DwvXUCoU)FC>beq-skNft&+I{;|S#(j3<6j)Y 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 literal 39027 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 diff --git a/docs/zh/images/Configuration query-properties.png b/docs/zh/images/Configuration query-properties.png index a4320354df2863522ae63c2853c0d68ff5df7d2f..2f8fd7711093c9a116aaf0f71b1d2b41d6b92fa5 100644 GIT binary patch literal 35102 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