From 9d5ff9c02294a53eb1a898756e16b784cba1420e Mon Sep 17 00:00:00 2001 From: PIGCLOUD Date: Wed, 14 Oct 2026 17:29:08 +0800 Subject: [PATCH] fix(message): allow users to delete their own notifications (cherry picked from commit ea051ea5d76ee9e553754f027e6d3c5ce3aec2b1) --- .../controller/SysMessageController.java | 7 ++++ .../pigx/admin/service/SysMessageService.java | 3 ++ .../service/impl/SysMessageServiceImpl.java | 8 ++++ .../service/impl/SysMessageDeletionTests.java | 39 +++++++++++++++++++ 4 files changed, 57 insertions(+) create mode 100644 pigx-upms/pigx-upms-biz/src/test/java/com/pig4cloud/pigx/admin/service/impl/SysMessageDeletionTests.java diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysMessageController.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysMessageController.java index 552b69ed1..3f59c6c82 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysMessageController.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysMessageController.java @@ -157,6 +157,13 @@ public class SysMessageController { return R.ok(sysMessageService.readMessage(id)); } + @Operation(summary = "删除当前用户消息", description = "仅删除当前用户的接收记录") + @SysLog("删除当前用户消息") + @DeleteMapping("/user/{id}") + public R removeUserMessage(@PathVariable("id") Long id) { + return R.ok(sysMessageService.removeUserMessage(id)); + } + /** * 查询用户公告 * diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysMessageService.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysMessageService.java index 32b422b38..5b9c79de2 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysMessageService.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysMessageService.java @@ -44,6 +44,9 @@ public interface SysMessageService extends IService { */ Boolean readMessage(Long id); + /** 删除当前用户的消息接收记录。 */ + Boolean removeUserMessage(Long id); + /** * 获取信息 * diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMessageServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMessageServiceImpl.java index 214917f17..9e3fe80d9 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMessageServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMessageServiceImpl.java @@ -217,6 +217,14 @@ public class SysMessageServiceImpl extends ServiceImpllambdaQuery() + .eq(SysMessageRelationEntity::getMsgId, id) + .eq(SysMessageRelationEntity::getUserId, SecurityUtils.getUser().getId())); + return Boolean.TRUE; + } + /** * 获取信息 * diff --git a/pigx-upms/pigx-upms-biz/src/test/java/com/pig4cloud/pigx/admin/service/impl/SysMessageDeletionTests.java b/pigx-upms/pigx-upms-biz/src/test/java/com/pig4cloud/pigx/admin/service/impl/SysMessageDeletionTests.java new file mode 100644 index 000000000..e31a1fb19 --- /dev/null +++ b/pigx-upms/pigx-upms-biz/src/test/java/com/pig4cloud/pigx/admin/service/impl/SysMessageDeletionTests.java @@ -0,0 +1,39 @@ +package com.pig4cloud.pigx.admin.service.impl; + +import com.baomidou.mybatisplus.core.MybatisConfiguration; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; +import com.pig4cloud.pigx.admin.api.entity.SysMessageRelationEntity; +import com.pig4cloud.pigx.admin.mapper.SysMessageRelationMapper; +import com.pig4cloud.pigx.common.security.service.PigxUser; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.apache.ibatis.builder.MapperBuilderAssistant; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; + +class SysMessageDeletionTests { + + @Test + void deletesOnlyTheCurrentUsersReceipt() { + TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), "relation"), SysMessageRelationEntity.class); + var relations = mock(SysMessageRelationMapper.class); + var service = new SysMessageServiceImpl(null, null, relations, null, null, null, null); + var user = mock(PigxUser.class); + when(user.getId()).thenReturn(1001L); + try { + SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(user, null)); + assertThat(service.removeUserMessage(123L)).isTrue(); + } finally { + SecurityContextHolder.clearContext(); + } + var condition = ArgumentCaptor.forClass(LambdaQueryWrapper.class); + verify(relations).delete(condition.capture()); + assertThat(condition.getValue().getSqlSegment()).contains("msg_id =", "user_id ="); + assertThat(condition.getValue().getParamNameValuePairs().values()).containsExactlyInAnyOrder(123L, 1001L); + verifyNoMoreInteractions(relations); + } +}