fix(message): allow users to delete their own notifications

(cherry picked from commit ea051ea5d76ee9e553754f027e6d3c5ce3aec2b1)
This commit is contained in:
PIGCLOUD committed 2026-11-03 14:49:23 +08:00
1 parent ec93f78417
commit 9d5ff9c022
4 files changed
+57

No files matched your search

@@ -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));
}
/**
* 查询用户公告
*
@@ -44,6 +44,9 @@ public interface SysMessageService extends IService<SysMessageEntity> {
*/
Boolean readMessage(Long id);
/** 删除当前用户的消息接收记录。 */
Boolean removeUserMessage(Long id);
/**
* 获取信息
*
@@ -217,6 +217,14 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
return Boolean.TRUE;
}
@Override
public Boolean removeUserMessage(Long id) {
relationMapper.delete(Wrappers.<SysMessageRelationEntity>lambdaQuery()
.eq(SysMessageRelationEntity::getMsgId, id)
.eq(SysMessageRelationEntity::getUserId, SecurityUtils.getUser().getId()));
return Boolean.TRUE;
}
/**
* 获取信息
*
@@ -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);
}
}