From 5dd39dafa5afa2d9aef6a6e8b4e99b04f254fc70 Mon Sep 17 00:00:00 2001 From: limbo Date: Wed, 19 Aug 2026 09:52:30 +0800 Subject: [PATCH] fix: update tag relations logic to clear existing tags when tagIds is empty and skip processing when null --- .../admin/service/impl/ApiServiceImpl.java | 22 ++++++++-------- .../shenyu/admin/service/ApiServiceTest.java | 25 +++++++++++++++++++ 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ApiServiceImpl.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ApiServiceImpl.java index ad05dbc78855..8bb0b7765f00 100644 --- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ApiServiceImpl.java +++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ApiServiceImpl.java @@ -112,18 +112,20 @@ private String update(final ApiDTO apiDTO) { ApiDO apiDO = ApiDO.buildApiDO(apiDTO); final int updateRows = apiMapper.updateByPrimaryKeySelective(apiDO); if (updateRows > 0) { - if (CollectionUtils.isNotEmpty(apiDTO.getTagIds())) { + if (Objects.nonNull(apiDTO.getTagIds())) { List tagIds = apiDTO.getTagIds(); - Timestamp currentTime = new Timestamp(System.currentTimeMillis()); - List tags = tagIds.stream().map(tagId -> TagRelationDO.builder() - .id(UUIDUtils.getInstance().generateShortUuid()) - .apiId(apiDO.getId()) - .tagId(tagId) - .dateCreated(currentTime) - .dateUpdated(currentTime) - .build()).collect(Collectors.toList()); tagRelationMapper.deleteByApiId(apiDO.getId()); - tagRelationMapper.batchInsert(tags); + if (CollectionUtils.isNotEmpty(tagIds)) { + Timestamp currentTime = new Timestamp(System.currentTimeMillis()); + List tags = tagIds.stream().map(tagId -> TagRelationDO.builder() + .id(UUIDUtils.getInstance().generateShortUuid()) + .apiId(apiDO.getId()) + .tagId(tagId) + .dateCreated(currentTime) + .dateUpdated(currentTime) + .build()).collect(Collectors.toList()); + tagRelationMapper.batchInsert(tags); + } } } return ShenyuResultMessage.UPDATE_SUCCESS; diff --git a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/ApiServiceTest.java b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/ApiServiceTest.java index 7ffc2c87b057..7a743fc6c7b9 100644 --- a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/ApiServiceTest.java +++ b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/ApiServiceTest.java @@ -47,8 +47,12 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** @@ -91,6 +95,27 @@ public void testCreateOrUpdate() { testUpdate("123"); } + @Test + public void testUpdateWithEmptyTagIdsClearsRelations() { + ApiDTO apiDTO = buildApiDTO("123"); + apiDTO.setTagIds(Collections.emptyList()); + when(apiMapper.updateByPrimaryKeySelective(any(ApiDO.class))).thenReturn(1); + + assertEquals(ShenyuResultMessage.UPDATE_SUCCESS, apiService.createOrUpdate(apiDTO)); + verify(tagRelationMapper).deleteByApiId("123"); + verify(tagRelationMapper, never()).batchInsert(anyList()); + } + + @Test + public void testUpdateWithNullTagIdsKeepsRelations() { + ApiDTO apiDTO = buildApiDTO("123"); + when(apiMapper.updateByPrimaryKeySelective(any(ApiDO.class))).thenReturn(1); + + assertEquals(ShenyuResultMessage.UPDATE_SUCCESS, apiService.createOrUpdate(apiDTO)); + verify(tagRelationMapper, never()).deleteByApiId("123"); + verify(tagRelationMapper, never()).batchInsert(anyList()); + } + @Test public void testDelete() { List apis = Collections.singletonList(buildApiDO("123"));