From fb4f76c9e4ab3d63329fd512f5703fb197e1136d Mon Sep 17 00:00:00 2001 From: xuqm Date: Fri, 16 Jun 2023 18:01:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=9A=E8=AF=9D=E5=88=97=E8=A1=A8=E4=B8=8E?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../imserver/bean/group/ConversationData.java | 8 ++++ .../v1/ConversationV1Controller.java | 25 +++++++++++ .../message/v1/MessageV1Controller.java | 6 ++- .../java/imserver/entitys/GroupEntity.java | 7 --- .../trust/java/imserver/im/ImManager.java | 45 ++++++++++--------- .../imserver/im/msg/ConversationMessage.java | 7 +-- .../java/imserver/im/msg/msg/SZYXMessage.java | 6 --- .../repository/ConversationRepository.java | 9 ++++ .../imserver/request/RequestConstant.java | 2 + .../java/imserver/request/RequestManager.java | 20 +++++++-- 10 files changed, 89 insertions(+), 46 deletions(-) create mode 100644 src/main/java/cn/org/bjca/trust/java/imserver/bean/group/ConversationData.java create mode 100644 src/main/java/cn/org/bjca/trust/java/imserver/controller/conversation/v1/ConversationV1Controller.java diff --git a/src/main/java/cn/org/bjca/trust/java/imserver/bean/group/ConversationData.java b/src/main/java/cn/org/bjca/trust/java/imserver/bean/group/ConversationData.java new file mode 100644 index 0000000..6935758 --- /dev/null +++ b/src/main/java/cn/org/bjca/trust/java/imserver/bean/group/ConversationData.java @@ -0,0 +1,8 @@ +package cn.org.bjca.trust.java.imserver.bean.group; + +import lombok.Data; + +@Data +public class ConversationData { + private String userId; +} diff --git a/src/main/java/cn/org/bjca/trust/java/imserver/controller/conversation/v1/ConversationV1Controller.java b/src/main/java/cn/org/bjca/trust/java/imserver/controller/conversation/v1/ConversationV1Controller.java new file mode 100644 index 0000000..cb3debc --- /dev/null +++ b/src/main/java/cn/org/bjca/trust/java/imserver/controller/conversation/v1/ConversationV1Controller.java @@ -0,0 +1,25 @@ +package cn.org.bjca.trust.java.imserver.controller.conversation.v1; + +import cn.org.bjca.trust.java.imserver.HttpResult; +import cn.org.bjca.trust.java.imserver.im.msg.ConversationMessage; +import cn.org.bjca.trust.java.imserver.request.RequestManager; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +import static cn.org.bjca.trust.java.imserver.request.RequestConstant.ConversationList; + +@RestController +@RequestMapping("conversation/v1") +public class ConversationV1Controller { + + @PostMapping("/getConversation") + public HttpResult> getConversation(@RequestHeader HttpHeaders headers) throws Exception { + return RequestManager.getInstance().request(ConversationList, null, headers); + } + +} diff --git a/src/main/java/cn/org/bjca/trust/java/imserver/controller/message/v1/MessageV1Controller.java b/src/main/java/cn/org/bjca/trust/java/imserver/controller/message/v1/MessageV1Controller.java index ec2f263..dd1c582 100644 --- a/src/main/java/cn/org/bjca/trust/java/imserver/controller/message/v1/MessageV1Controller.java +++ b/src/main/java/cn/org/bjca/trust/java/imserver/controller/message/v1/MessageV1Controller.java @@ -1,12 +1,14 @@ package cn.org.bjca.trust.java.imserver.controller.message.v1; import cn.org.bjca.trust.java.imserver.HttpResult; -import cn.org.bjca.trust.java.imserver.bean.group.GroupCreateData; import cn.org.bjca.trust.java.imserver.bean.group.MsgHistoryForCountData; +import cn.org.bjca.trust.java.imserver.im.msg.msg.SZYXMessage; import cn.org.bjca.trust.java.imserver.request.RequestManager; import org.springframework.http.HttpHeaders; import org.springframework.web.bind.annotation.*; +import java.util.List; + import static cn.org.bjca.trust.java.imserver.request.RequestConstant.MsgHistoryForCount; @RestController @@ -14,7 +16,7 @@ import static cn.org.bjca.trust.java.imserver.request.RequestConstant.MsgHistory public class MessageV1Controller { @PostMapping("/getHistoryForCount") - public HttpResult getHistoryForCount(@RequestBody MsgHistoryForCountData groupCreateData, @RequestHeader HttpHeaders headers) throws Exception { + public HttpResult> getHistoryForCount(@RequestBody MsgHistoryForCountData groupCreateData, @RequestHeader HttpHeaders headers) throws Exception { return RequestManager.getInstance().request(MsgHistoryForCount, groupCreateData, headers); } diff --git a/src/main/java/cn/org/bjca/trust/java/imserver/entitys/GroupEntity.java b/src/main/java/cn/org/bjca/trust/java/imserver/entitys/GroupEntity.java index 33f3e10..68f4fcf 100644 --- a/src/main/java/cn/org/bjca/trust/java/imserver/entitys/GroupEntity.java +++ b/src/main/java/cn/org/bjca/trust/java/imserver/entitys/GroupEntity.java @@ -2,16 +2,9 @@ package cn.org.bjca.trust.java.imserver.entitys; import cn.org.bjca.trust.java.imserver.entitys.converter.AbstractBaseTimeEntity; -import cn.org.bjca.trust.java.imserver.entitys.converter.AbstractBaseTimeEntityNoKey; -import cn.org.bjca.trust.java.imserver.entitys.converter.StringListConverter; -import jakarta.persistence.Column; -import jakarta.persistence.Convert; import jakarta.persistence.Entity; -import jakarta.persistence.Id; import lombok.Data; -import java.util.List; - @Entity @Data public class GroupEntity extends AbstractBaseTimeEntity { diff --git a/src/main/java/cn/org/bjca/trust/java/imserver/im/ImManager.java b/src/main/java/cn/org/bjca/trust/java/imserver/im/ImManager.java index 6a4d3a8..5749f4c 100644 --- a/src/main/java/cn/org/bjca/trust/java/imserver/im/ImManager.java +++ b/src/main/java/cn/org/bjca/trust/java/imserver/im/ImManager.java @@ -4,7 +4,6 @@ package cn.org.bjca.trust.java.imserver.im; import cn.org.bjca.trust.java.imserver.common.SpringUtilsAuTo; import cn.org.bjca.trust.java.imserver.common.json.GsonImplHelp; import cn.org.bjca.trust.java.imserver.entitys.GroupEntity; -import cn.org.bjca.trust.java.imserver.entitys.UserInfo; import cn.org.bjca.trust.java.imserver.enums.PacketType; import cn.org.bjca.trust.java.imserver.im.bean.PacketMessage; import cn.org.bjca.trust.java.imserver.im.msg.ConnectMessage; @@ -18,6 +17,7 @@ import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; import java.nio.charset.StandardCharsets; +import java.util.List; public class ImManager { @@ -50,17 +50,17 @@ public class ImManager { try { mqttClient = new MqttClient("tcp://114.115.203.60:18883", - "server1" + System.currentTimeMillis(), new MemoryPersistence()); + "server" + System.currentTimeMillis(), new MemoryPersistence()); mqttClient.setCallback(new MqttCallbackExtended() { @Override public void connectComplete(boolean reconnect, String serverURI) { System.out.println("======>connectComplete:reconnect?" + reconnect + "::" + serverURI); if (reconnect) return; try { - mqttClient.subscribe("server1" + PacketType.CONNECT, 2); - mqttClient.subscribe("server1" + PacketType.SEND, 2); - mqttClient.subscribe("server1" + PacketType.PING, 2); - mqttClient.subscribe("server1" + PacketType.REQUEST, 2); + mqttClient.subscribe("server" + PacketType.CONNECT, 2); + mqttClient.subscribe("server" + PacketType.SEND, 2); + mqttClient.subscribe("server" + PacketType.PING, 2); + mqttClient.subscribe("server" + PacketType.REQUEST, 2); } catch (MqttException ignored) { } } @@ -74,12 +74,11 @@ public class ImManager { public void messageArrived(String topic, MqttMessage message) throws Exception { String msg = new String(message.getPayload()); System.out.println("======>messageArrived:\n" + topic + "::" + msg); - if (topic.equals("server1" + PacketType.CONNECT)) { + if (topic.equals("server" + PacketType.CONNECT)) { sendConnectedMsg(GsonImplHelp.get().toObject(msg, ConnectMessage.class)); - } else if (topic.equals("server1" + PacketType.SEND)) { + } else if (topic.equals("server" + PacketType.SEND)) { SZYXMessage szyxMessage = GsonImplHelp.get().toObject(msg, SZYXMessage.class); szyxMessage.setStatus(0); - szyxMessage.setFromClientId(szyxMessage.getFromClient().getUserId()); saveConversation(szyxMessage); SZYXMessage message1 = szyxMessage.copy(); @@ -101,7 +100,7 @@ public class ImManager { sendAckMsg(szyxMessage); }// 数据请求 - else if (topic.equals("server1" + PacketType.REQUEST)) { + else if (topic.equals("server" + PacketType.REQUEST)) { sendPacketMessage(PacketType.RESULT, RequestManager.getInstance().request(msg)); } @@ -120,11 +119,18 @@ public class ImManager { private void saveConversation(SZYXMessage szyxMessage) { try { - ConversationMessage conversation = new ConversationMessage(); + List l = conversationRepository.getConversation(szyxMessage.getAppId(), szyxMessage.getUserName(), + szyxMessage.isArrive() ? szyxMessage.getFromClientId() : szyxMessage.getToClientId(), szyxMessage.getGroupID()); + ConversationMessage conversation; + if (l.size() == 0) { + conversation = new ConversationMessage(); + } else { + conversation = l.get(0); + } +// ConversationMessage conversation = new ConversationMessage(); conversation.setGroup(szyxMessage.isGroup()); conversation.setSender(!szyxMessage.isArrive()); conversation.setMessage(szyxMessage); - conversation.setSelf(userRepository.findFirstByUserIdAndOsTypeAndAppId(szyxMessage.getUserName(), szyxMessage.getOsType(), szyxMessage.getAppId())); conversation.setAppId(szyxMessage.getAppId()); conversation.setUserName(szyxMessage.getUserName()); @@ -134,18 +140,10 @@ public class ImManager { if (szyxMessage.isGroup()) { conversation.setGroupEntity(groupRepository.findFirstByAppIdAndGroupId(szyxMessage.getAppId(), szyxMessage.getGroupID())); } else { - UserInfo userInfo; - if (szyxMessage.isArrive()) { - userInfo = userRepository.findFirstByUserIdAndOsTypeAndAppId(szyxMessage.getFromClientId(), szyxMessage.getOsType(), szyxMessage.getAppId()); - } else { - userInfo = userRepository.findFirstByUserIdAndOsTypeAndAppId(szyxMessage.getToClientId(), szyxMessage.getOsType(), szyxMessage.getAppId()); - } - conversation.setUserInfo(userInfo); + conversation.setUserId(szyxMessage.isArrive() ? szyxMessage.getFromClientId() : szyxMessage.getToClientId()); } conversationRepository.save(conversation); - conversation.getSelf().setPassword(""); - conversation.getUserInfo().setPassword(""); sendPacketMessage(PacketType.CONVERSATION, conversation); } catch (Exception e) { System.out.println("--------------" + e.getMessage()); @@ -155,7 +153,10 @@ public class ImManager { public void connect() { new Thread(() -> { try { - if (!mqttClient.isConnected()) { + if (null != mqttClient) { + if (mqttClient.isConnected()) { + mqttClient.disconnect(); + } mqttClient.connect(connectOptions); } } catch (MqttException e) { diff --git a/src/main/java/cn/org/bjca/trust/java/imserver/im/msg/ConversationMessage.java b/src/main/java/cn/org/bjca/trust/java/imserver/im/msg/ConversationMessage.java index 3a01c18..6f567fd 100644 --- a/src/main/java/cn/org/bjca/trust/java/imserver/im/msg/ConversationMessage.java +++ b/src/main/java/cn/org/bjca/trust/java/imserver/im/msg/ConversationMessage.java @@ -29,10 +29,5 @@ public class ConversationMessage extends PacketMessage { @OneToOne @JoinColumn private GroupEntity groupEntity; - @OneToOne - @JoinColumn - private UserInfo userInfo; - @OneToOne - @JoinColumn - private UserInfo self; + private String userId; } diff --git a/src/main/java/cn/org/bjca/trust/java/imserver/im/msg/msg/SZYXMessage.java b/src/main/java/cn/org/bjca/trust/java/imserver/im/msg/msg/SZYXMessage.java index c10ee11..8d2fd05 100644 --- a/src/main/java/cn/org/bjca/trust/java/imserver/im/msg/msg/SZYXMessage.java +++ b/src/main/java/cn/org/bjca/trust/java/imserver/im/msg/msg/SZYXMessage.java @@ -1,7 +1,6 @@ package cn.org.bjca.trust.java.imserver.im.msg.msg; -import cn.org.bjca.trust.java.imserver.entitys.UserInfo; import cn.org.bjca.trust.java.imserver.enums.MsgType; import cn.org.bjca.trust.java.imserver.enums.PacketType; import cn.org.bjca.trust.java.imserver.im.bean.PacketMessage; @@ -25,9 +24,6 @@ public class SZYXMessage extends PacketMessage { /** * 发送者信息 */ - @OneToOne - @JoinColumn - private UserInfo fromClient; private String fromClientId; /** * 接收者信息 @@ -82,8 +78,6 @@ public class SZYXMessage extends PacketMessage { szyxMessage.setStatus(this.getStatus()); szyxMessage.setGroupID(this.getGroupID()); - szyxMessage.setFromClient(this.getFromClient().copy()); - SZYXTextMessage tm = new SZYXTextMessage(); tm.setText(this.getTextMessage().getText()); diff --git a/src/main/java/cn/org/bjca/trust/java/imserver/repository/ConversationRepository.java b/src/main/java/cn/org/bjca/trust/java/imserver/repository/ConversationRepository.java index 212d1d1..a39ef1f 100644 --- a/src/main/java/cn/org/bjca/trust/java/imserver/repository/ConversationRepository.java +++ b/src/main/java/cn/org/bjca/trust/java/imserver/repository/ConversationRepository.java @@ -2,9 +2,18 @@ package cn.org.bjca.trust.java.imserver.repository; import cn.org.bjca.trust.java.imserver.im.msg.ConversationMessage; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface ConversationRepository extends JpaRepository { + @Query(value = "select cs from ConversationMessage AS cs " + + "where cs.appId = ?1 and cs.userName = ?2 and (cs.userId = ?3 or cs.groupEntity._id = ?4)") + List getConversation(String appId, String userName, String userId, String groupId); + + List findAllByAppIdAndUserName(String appId, String userName); + } diff --git a/src/main/java/cn/org/bjca/trust/java/imserver/request/RequestConstant.java b/src/main/java/cn/org/bjca/trust/java/imserver/request/RequestConstant.java index 04597d3..8f1d52f 100644 --- a/src/main/java/cn/org/bjca/trust/java/imserver/request/RequestConstant.java +++ b/src/main/java/cn/org/bjca/trust/java/imserver/request/RequestConstant.java @@ -8,4 +8,6 @@ public class RequestConstant { public static final String MsgHistoryForCount = "/message/v1/getHistoryForCount"; public static final String MsgListForTime = "/message/v1/getListForTime"; public static final String MsgListForCount = "/message/v1/getListForCount"; + + public static final String ConversationList = "/conversation/v1/getConversation"; } diff --git a/src/main/java/cn/org/bjca/trust/java/imserver/request/RequestManager.java b/src/main/java/cn/org/bjca/trust/java/imserver/request/RequestManager.java index f039814..5028252 100644 --- a/src/main/java/cn/org/bjca/trust/java/imserver/request/RequestManager.java +++ b/src/main/java/cn/org/bjca/trust/java/imserver/request/RequestManager.java @@ -7,9 +7,11 @@ import cn.org.bjca.trust.java.imserver.common.SpringUtilsAuTo; import cn.org.bjca.trust.java.imserver.common.TimeHelper; import cn.org.bjca.trust.java.imserver.common.json.GsonImplHelp; import cn.org.bjca.trust.java.imserver.entitys.GroupEntity; +import cn.org.bjca.trust.java.imserver.im.msg.ConversationMessage; import cn.org.bjca.trust.java.imserver.im.msg.RequestMessage; import cn.org.bjca.trust.java.imserver.im.msg.ResultMessage; import cn.org.bjca.trust.java.imserver.im.msg.msg.SZYXMessage; +import cn.org.bjca.trust.java.imserver.repository.ConversationRepository; import cn.org.bjca.trust.java.imserver.repository.GroupRepository; import cn.org.bjca.trust.java.imserver.repository.MessageRepository; import cn.org.bjca.trust.java.imserver.repository.UserRepository; @@ -19,12 +21,11 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.http.HttpHeaders; -import java.util.Comparator; +import java.time.ZoneOffset; import java.util.List; import java.util.UUID; -import static cn.org.bjca.trust.java.imserver.request.RequestConstant.Group_create_v1; -import static cn.org.bjca.trust.java.imserver.request.RequestConstant.MsgHistoryForCount; +import static cn.org.bjca.trust.java.imserver.request.RequestConstant.*; public class RequestManager { @@ -33,6 +34,8 @@ public class RequestManager { private final ApplicationRepository applicationRepository = SpringUtilsAuTo.getBean(ApplicationRepository.class); private final MessageRepository messageRepository = SpringUtilsAuTo.getBean(MessageRepository.class); + private final ConversationRepository conversationRepository = SpringUtilsAuTo.getBean(ConversationRepository.class); + private static final class RequestManagerHolder { static final RequestManager instance = new RequestManager(); } @@ -79,9 +82,12 @@ public class RequestManager { GsonImplHelp.get().toObject((String) data, GroupCreateData.class) : (GroupCreateData) data, appId, userId); case MsgHistoryForCount: + if(null == data) return new HttpResult<>(201, "参数为空", null); return (HttpResult) this.getHistoryForCount(data instanceof String ? GsonImplHelp.get().toObject((String) data, MsgHistoryForCountData.class) : (MsgHistoryForCountData) data, appId, userId); + case ConversationList: + return (HttpResult) this.getConversation(appId, userId); default: return new HttpResult<>(201, "路径错误" + path, null); } @@ -91,6 +97,14 @@ public class RequestManager { } + private HttpResult> getConversation(String appid, String userid) { + + List l = conversationRepository.findAllByAppIdAndUserName(appid, userid); + l.sort((o1, o2) -> (int) (o1.getUpdateTime().toEpochSecond(ZoneOffset.UTC) - o2.getUpdateTime().toEpochSecond(ZoneOffset.UTC))); + + return new HttpResult<>(200, "查询成功", l); + } + private HttpResult> getHistoryForCount(MsgHistoryForCountData data, String appid, String userid) { Pageable pageable = PageRequest.of(0, 10, Sort.by("_id").descending());