package com.zhentao.information.controller; import com.alibaba.fastjson2.JSON; import com.zhentao.config.NullLogin; import com.zhentao.information.entity.ChatMessage; import com.zhentao.information.entity.Message; import com.zhentao.information.handler.WebSocketHandler; import com.zhentao.information.repository.ChatMessageRepository; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; import java.util.Map; /** * 消息控制器 */ @Slf4j @RestController @RequestMapping("/api/message") public class MessageController { @Resource private WebSocketHandler webSocketHandler; @Resource private ChatMessageRepository chatMessageRepository; /** * 发送消息接口 */ @PostMapping("/send") @NullLogin public String sendMessage(@RequestBody Message message) { log.info("收到消息:发送者={}, 接收者={}, 内容={}", message.getFromUserId(), message.getToUserId(), message.getContent()); // 生成聊天ID(确保两个用户之间的聊天ID唯一) String chatId = generateChatId(message.getFromUserId(), message.getToUserId()); // 创建MongoDB消息对象 ChatMessage chatMessage = new ChatMessage(); chatMessage.setFromUserId(message.getFromUserId()); chatMessage.setToUserId(message.getToUserId()); chatMessage.setContent(message.getContent()); chatMessage.setType(message.getType()); chatMessage.setTimestamp(System.currentTimeMillis()); chatMessage.setIsRead(false); chatMessage.setChatId(chatId); // 保存消息到MongoDB chatMessageRepository.save(chatMessage); // 获取接收者的Channel Map userChannelMap = webSocketHandler.getUserChannelMap(); ChannelHandlerContext toUserCtx = userChannelMap.get(message.getToUserId()); if (toUserCtx != null) { // 发送消息给接收者 toUserCtx.channel().writeAndFlush(new TextWebSocketFrame(JSON.toJSONString(message))); return "消息已发送"; } else { return "消息已保存,等待接收者上线"; } } /** * 获取两个用户之间的聊天记录 */ @GetMapping("/history") public List getChatHistory(@RequestParam String userId1, @RequestParam String userId2) { String chatId = generateChatId(userId1, userId2); return chatMessageRepository.findByChatId(chatId); } /** * 获取用户的未读消息 */ @GetMapping("/unread") public List getUnreadMessages(@RequestParam String userId) { return chatMessageRepository.findByToUserIdAndIsReadFalse(userId); } /** * 生成聊天ID */ private String generateChatId(String userId1, String userId2) { // 确保两个用户之间的聊天ID唯一,且与顺序无关 return userId1.compareTo(userId2) < 0 ? userId1 + "_" + userId2 : userId2 + "_" + userId1; } }