123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- 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<String, ChannelHandlerContext> 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<ChatMessage> getChatHistory(@RequestParam String userId1, @RequestParam String userId2) {
- String chatId = generateChatId(userId1, userId2);
- return chatMessageRepository.findByChatId(chatId);
- }
- /**
- * 获取用户的未读消息
- */
- @GetMapping("/unread")
- public List<ChatMessage> 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;
- }
- }
|