MessageController.java 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package com.zhentao.information.controller;
  2. import com.alibaba.fastjson2.JSON;
  3. import com.zhentao.config.NullLogin;
  4. import com.zhentao.information.entity.ChatMessage;
  5. import com.zhentao.information.entity.Message;
  6. import com.zhentao.information.handler.WebSocketHandler;
  7. import com.zhentao.information.repository.ChatMessageRepository;
  8. import io.netty.channel.ChannelHandlerContext;
  9. import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.springframework.web.bind.annotation.*;
  12. import javax.annotation.Resource;
  13. import java.util.List;
  14. import java.util.Map;
  15. /**
  16. * 消息控制器
  17. */
  18. @Slf4j
  19. @RestController
  20. @RequestMapping("/api/message")
  21. public class MessageController {
  22. @Resource
  23. private WebSocketHandler webSocketHandler;
  24. @Resource
  25. private ChatMessageRepository chatMessageRepository;
  26. /**
  27. * 发送消息接口
  28. */
  29. @PostMapping("/send")
  30. @NullLogin
  31. public String sendMessage(@RequestBody Message message) {
  32. log.info("收到消息:发送者={}, 接收者={}, 内容={}",
  33. message.getFromUserId(),
  34. message.getToUserId(),
  35. message.getContent());
  36. // 生成聊天ID(确保两个用户之间的聊天ID唯一)
  37. String chatId = generateChatId(message.getFromUserId(), message.getToUserId());
  38. // 创建MongoDB消息对象
  39. ChatMessage chatMessage = new ChatMessage();
  40. chatMessage.setFromUserId(message.getFromUserId());
  41. chatMessage.setToUserId(message.getToUserId());
  42. chatMessage.setContent(message.getContent());
  43. chatMessage.setType(message.getType());
  44. chatMessage.setTimestamp(System.currentTimeMillis());
  45. chatMessage.setIsRead(false);
  46. chatMessage.setChatId(chatId);
  47. // 保存消息到MongoDB
  48. chatMessageRepository.save(chatMessage);
  49. // 获取接收者的Channel
  50. Map<String, ChannelHandlerContext> userChannelMap = webSocketHandler.getUserChannelMap();
  51. ChannelHandlerContext toUserCtx = userChannelMap.get(message.getToUserId());
  52. if (toUserCtx != null) {
  53. // 发送消息给接收者
  54. toUserCtx.channel().writeAndFlush(new TextWebSocketFrame(JSON.toJSONString(message)));
  55. return "消息已发送";
  56. } else {
  57. return "消息已保存,等待接收者上线";
  58. }
  59. }
  60. /**
  61. * 获取两个用户之间的聊天记录
  62. */
  63. @GetMapping("/history")
  64. public List<ChatMessage> getChatHistory(@RequestParam String userId1, @RequestParam String userId2) {
  65. String chatId = generateChatId(userId1, userId2);
  66. return chatMessageRepository.findByChatId(chatId);
  67. }
  68. /**
  69. * 获取用户的未读消息
  70. */
  71. @GetMapping("/unread")
  72. public List<ChatMessage> getUnreadMessages(@RequestParam String userId) {
  73. return chatMessageRepository.findByToUserIdAndIsReadFalse(userId);
  74. }
  75. /**
  76. * 生成聊天ID
  77. */
  78. private String generateChatId(String userId1, String userId2) {
  79. // 确保两个用户之间的聊天ID唯一,且与顺序无关
  80. return userId1.compareTo(userId2) < 0 ?
  81. userId1 + "_" + userId2 :
  82. userId2 + "_" + userId1;
  83. }
  84. }