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()

Reply via email to