This is an automated email from the ASF dual-hosted git repository.

Aias00 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git


The following commit(s) were added to refs/heads/master by this push:
     new 0a177ae3c4   fix: guard empty deletedIds in PermissionServiceImpl 
event listeners (#6868) (#6946)
0a177ae3c4 is described below

commit 0a177ae3c4bade1909912970bad5ae907a9b4f5b
Author: Southern <[email protected]>
AuthorDate: Sun Sep 6 08:06:01 2026 +0800

      fix: guard empty deletedIds in PermissionServiceImpl event listeners 
(#6868) (#6946)
    
    - Guard onResourcesDeleted and onRoleDeleted with CollectionUtils.isNotEmpty
        to avoid rendering invalid `IN ()` SQL for empty deletedIds
      - Rename copy-paste misnamed onResourcesCreated(BatchResourceDeletedEvent)
        to onResourcesDeleted
      - Add unit tests for empty and non-empty deletedIds on both listeners
    
    Co-authored-by: aias00 <[email protected]>
---
 .../admin/service/impl/PermissionServiceImpl.java  | 12 +++++---
 .../admin/service/PermissionServiceTest.java       | 36 ++++++++++++++++++++++
 2 files changed, 44 insertions(+), 4 deletions(-)

diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/PermissionServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/PermissionServiceImpl.java
index 8ded4a8502..3c5ecec6e7 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/PermissionServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/PermissionServiceImpl.java
@@ -162,10 +162,12 @@ public class PermissionServiceImpl implements 
PermissionService {
      * @param event event
      */
     @EventListener(BatchResourceDeletedEvent.class)
-    public void onResourcesCreated(final BatchResourceDeletedEvent event) {
-        permissionMapper.deleteByResourceId(event.getDeletedIds());
+    public void onResourcesDeleted(final BatchResourceDeletedEvent event) {
+        if (CollectionUtils.isNotEmpty(event.getDeletedIds())) {
+            permissionMapper.deleteByResourceId(event.getDeletedIds());
+        }
     }
-    
+
     /**
      * listen {@link BatchRoleDeletedEvent} delete  permission.
      *
@@ -173,7 +175,9 @@ public class PermissionServiceImpl implements 
PermissionService {
      */
     @EventListener(BatchRoleDeletedEvent.class)
     public void onRoleDeleted(final BatchRoleDeletedEvent event) {
-        permissionMapper.deleteByObjectIds(event.getDeletedIds());
+        if (CollectionUtils.isNotEmpty(event.getDeletedIds())) {
+            permissionMapper.deleteByObjectIds(event.getDeletedIds());
+        }
     }
     
     /**
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/PermissionServiceTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/PermissionServiceTest.java
index bbb8054469..3fa002eaf5 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/PermissionServiceTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/PermissionServiceTest.java
@@ -26,7 +26,10 @@ import org.apache.shenyu.admin.model.custom.UserInfo;
 import org.apache.shenyu.admin.model.entity.DashboardUserDO;
 import org.apache.shenyu.admin.model.entity.PermissionDO;
 import org.apache.shenyu.admin.model.entity.ResourceDO;
+import org.apache.shenyu.admin.model.entity.RoleDO;
 import org.apache.shenyu.admin.model.entity.UserRoleDO;
+import org.apache.shenyu.admin.model.event.resource.BatchResourceDeletedEvent;
+import org.apache.shenyu.admin.model.event.role.BatchRoleDeletedEvent;
 import org.apache.shenyu.admin.model.vo.PermissionMenuVO;
 import org.apache.shenyu.admin.service.impl.PermissionServiceImpl;
 import org.apache.shenyu.admin.spring.SpringBeanUtils;
@@ -57,8 +60,11 @@ import java.util.stream.Stream;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static 
org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
+import static org.mockito.ArgumentMatchers.anyList;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.mockStatic;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 /**
@@ -166,4 +172,34 @@ public final class PermissionServiceTest {
         final Set<String> result = 
permissionServiceImplUnderTest.getAuthPermByUserName("admin");
         assertThat(result.size(), is(1));
     }
+
+    @Test
+    public void testOnResourcesDeletedEmpty() {
+        final BatchResourceDeletedEvent event = new 
BatchResourceDeletedEvent(Collections.emptyList(), "admin");
+        permissionServiceImplUnderTest.onResourcesDeleted(event);
+        verify(mockPermissionMapper, never()).deleteByResourceId(anyList());
+    }
+
+    @Test
+    public void testOnResourcesDeleted() {
+        final ResourceDO resourceDO = 
ResourceDO.builder().id("resource-1").build();
+        final BatchResourceDeletedEvent event = new 
BatchResourceDeletedEvent(Collections.singletonList(resourceDO), "admin");
+        permissionServiceImplUnderTest.onResourcesDeleted(event);
+        
verify(mockPermissionMapper).deleteByResourceId(Collections.singletonList("resource-1"));
+    }
+
+    @Test
+    public void testOnRoleDeletedEmpty() {
+        final BatchRoleDeletedEvent event = new 
BatchRoleDeletedEvent(Collections.emptyList(), "admin");
+        permissionServiceImplUnderTest.onRoleDeleted(event);
+        verify(mockPermissionMapper, never()).deleteByObjectIds(anyList());
+    }
+
+    @Test
+    public void testOnRoleDeleted() {
+        final RoleDO roleDO = RoleDO.builder().id("role-1").build();
+        final BatchRoleDeletedEvent event = new 
BatchRoleDeletedEvent(Collections.singletonList(roleDO), "admin");
+        permissionServiceImplUnderTest.onRoleDeleted(event);
+        
verify(mockPermissionMapper).deleteByObjectIds(Collections.singletonList("role-1"));
+    }
 }

Reply via email to