MessageController.java 3.2 KB

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