This is an automated email from the ASF dual-hosted git repository.
lizhimins pushed a commit to branch rocketmq-studio
in repository https://gitbox.apache.org/repos/asf/rocketmq-dashboard.git
The following commit(s) were added to refs/heads/rocketmq-studio by this push:
new d0720ecf1 fix: normalize batch instance deletion ids (#2421)
d0720ecf1 is described below
commit d0720ecf1a626daa5a30d784dd5037c30815438a
Author: xdz997 <[email protected]>
AuthorDate: Fri Aug 21 17:40:47 2026 +0800
fix: normalize batch instance deletion ids (#2421)
---
.../rocketmq/studio/instance/InstanceService.java | 16 ++++++++-----
.../studio/instance/InstanceServiceTest.java | 26 ++++++++++++++++++++++
2 files changed, 37 insertions(+), 5 deletions(-)
diff --git
a/server/src/main/java/org/apache/rocketmq/studio/instance/InstanceService.java
b/server/src/main/java/org/apache/rocketmq/studio/instance/InstanceService.java
index cd0ecea03..b31464a3b 100644
---
a/server/src/main/java/org/apache/rocketmq/studio/instance/InstanceService.java
+++
b/server/src/main/java/org/apache/rocketmq/studio/instance/InstanceService.java
@@ -476,14 +476,20 @@ public class InstanceService {
if (instanceIds == null || instanceIds.isEmpty()) {
throw new BusinessException(400, "Instance IDs are required");
}
+ List<String> normalizedIds = instanceIds.stream()
+ .filter(Objects::nonNull)
+ .map(String::trim)
+ .filter(instanceId -> !instanceId.isEmpty())
+ .distinct()
+ .toList();
+ if (normalizedIds.isEmpty()) {
+ throw new BusinessException(400, "Instance IDs are required");
+ }
int deleted = 0;
List<String> failed = new ArrayList<>();
- for (String instanceId : instanceIds) {
- if (instanceId == null || instanceId.isBlank()) {
- continue;
- }
+ for (String instanceId : normalizedIds) {
try {
- deleteInstance(resolveInstanceId(instanceId.trim()));
+ deleteInstance(resolveInstanceId(instanceId));
deleted++;
} catch (BusinessException ex) {
failed.add(instanceId + ": " + ex.getMessage());
diff --git
a/server/src/test/java/org/apache/rocketmq/studio/instance/InstanceServiceTest.java
b/server/src/test/java/org/apache/rocketmq/studio/instance/InstanceServiceTest.java
index c39a6240c..405569b9f 100644
---
a/server/src/test/java/org/apache/rocketmq/studio/instance/InstanceServiceTest.java
+++
b/server/src/test/java/org/apache/rocketmq/studio/instance/InstanceServiceTest.java
@@ -757,6 +757,32 @@ class InstanceServiceTest {
.satisfies(ex -> assertThat(((BusinessException)
ex).getCode()).isEqualTo(400));
}
+ @Test
+ void deleteInstancesShouldDeduplicateTrimmedIdentifiersTest() {
+ InstanceVO existing = InstanceVO.builder().name("inst-a").build();
+ existing.setId(1L);
+
when(instanceRepository.findByIdentifier("inst-a")).thenReturn(Optional.of(existing));
+
when(instanceRepository.findById(1L)).thenReturn(Optional.of(existing));
+
when(providerRegistry.forVendor(InstanceVendor.APACHE)).thenReturn(instanceProvider);
+ when(instanceProvider.countTopics("1")).thenReturn(0);
+ when(instanceProvider.countGroups("1")).thenReturn(0);
+ when(instanceRepository.deleteById(1L)).thenReturn(true);
+
+ BatchDeleteResultVO result =
instanceService.deleteInstances(List.of("inst-a", " inst-a ", "inst-a"));
+
+ assertThat(result.getDeleted()).isEqualTo(1);
+ assertThat(result.getFailed()).isEmpty();
+ verify(instanceRepository).deleteById(1L);
+ }
+
+ @Test
+ void deleteInstancesShouldRejectAllBlankIdentifiersTest() {
+ assertThatThrownBy(() ->
instanceService.deleteInstances(Arrays.asList(" ", null, "")))
+ .isInstanceOf(BusinessException.class)
+ .hasMessage("Instance IDs are required")
+ .satisfies(ex -> assertThat(((BusinessException)
ex).getCode()).isEqualTo(400));
+ }
+
@Test
void deleteInstanceShouldRejectInstanceWithTopics() {
InstanceVO existing = InstanceVO.builder()