@@ -0,0 +1,8 @@ | |||
package cn.org.bjca.trust.java.imserver.bean.group; | |||
import lombok.Data; | |||
@Data | |||
public class ConversationData { | |||
private String userId; | |||
} |
@@ -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<List<ConversationMessage>> getConversation(@RequestHeader HttpHeaders headers) throws Exception { | |||
return RequestManager.getInstance().request(ConversationList, null, headers); | |||
} | |||
} |
@@ -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<String> getHistoryForCount(@RequestBody MsgHistoryForCountData groupCreateData, @RequestHeader HttpHeaders headers) throws Exception { | |||
public HttpResult<List<SZYXMessage>> getHistoryForCount(@RequestBody MsgHistoryForCountData groupCreateData, @RequestHeader HttpHeaders headers) throws Exception { | |||
return RequestManager.getInstance().request(MsgHistoryForCount, groupCreateData, headers); | |||
} | |||
@@ -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 { | |||
@@ -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<ConversationMessage> 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) { | |||
@@ -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; | |||
} |
@@ -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()); | |||
@@ -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<ConversationMessage, String> { | |||
@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<ConversationMessage> getConversation(String appId, String userName, String userId, String groupId); | |||
List<ConversationMessage> findAllByAppIdAndUserName(String appId, String userName); | |||
} |
@@ -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"; | |||
} |
@@ -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<T>) this.getHistoryForCount(data instanceof String ? | |||
GsonImplHelp.get().toObject((String) data, MsgHistoryForCountData.class) | |||
: (MsgHistoryForCountData) data, appId, userId); | |||
case ConversationList: | |||
return (HttpResult<T>) this.getConversation(appId, userId); | |||
default: | |||
return new HttpResult<>(201, "路径错误" + path, null); | |||
} | |||
@@ -91,6 +97,14 @@ public class RequestManager { | |||
} | |||
private HttpResult<List<ConversationMessage>> getConversation(String appid, String userid) { | |||
List<ConversationMessage> 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<List<SZYXMessage>> getHistoryForCount(MsgHistoryForCountData data, String appid, String userid) { | |||
Pageable pageable = PageRequest.of(0, 10, Sort.by("_id").descending()); | |||