创建群组

这个提交包含在:
xuqm 2023-06-01 18:41:40 +08:00
父节点 3f18c6b7f6
当前提交 e037d174fc
共有 24 个文件被更改,包括 281 次插入44 次删除

查看文件

@ -0,0 +1,12 @@
package cn.org.bjca.trust.java.imserver.bean.group;
import lombok.Data;
import java.util.List;
@Data
public class GroupCreateData {
private String groupName;
private String faceUrl;
private List<String> userIdList;
}

查看文件

@ -1,16 +0,0 @@
package cn.org.bjca.trust.java.imserver.common;
public class RequestManager {
private static final class RequestManagerHolder {
static final RequestManager instance = new RequestManager();
}
public static RequestManager getInstance() {
return RequestManagerHolder.instance;
}
public void getHistoryForMsg(String appId, String userId, int pageSize, long timestamp){
}
}

查看文件

@ -0,0 +1,22 @@
package cn.org.bjca.trust.java.imserver.controller.group.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.common.json.GsonImplHelp;
import cn.org.bjca.trust.java.imserver.request.RequestManager;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.*;
import static cn.org.bjca.trust.java.imserver.request.RequestConstant.Group_create_v1;
@RestController
@RequestMapping("group/v1")
public class GroupV1Controller {
@PostMapping("/create")
public HttpResult<String> create(@RequestBody GroupCreateData groupCreateData, @RequestHeader HttpHeaders headers) throws Exception {
System.out.println(GsonImplHelp.get().toJson(groupCreateData));
return RequestManager.getInstance().request(Group_create_v1, groupCreateData, headers);
}
}

查看文件

@ -1,9 +1,9 @@
package cn.org.bjca.trust.java.imserver.entitys;
import cn.org.bjca.trust.java.imserver.entitys.converter.AbstractBaseTimeEntity;
import jakarta.persistence.Entity;
import lombok.Data;
import org.springframework.lang.NonNull;
@Entity
@Data

查看文件

@ -0,0 +1,33 @@
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.StringListConverter;
import jakarta.persistence.Convert;
import jakarta.persistence.Entity;
import lombok.Data;
import java.util.List;
@Entity
@Data
public class GroupEntity extends AbstractBaseTimeEntity {
private String appId;
private String adminId;
private String userId;
private String groupId;
private String groupName;
private String faceUrl;
public GroupEntity() {
}
public GroupEntity(String appId, String adminId, String userId, String groupId, String groupName, String faceUrl) {
this.appId = appId;
this.adminId = adminId;
this.userId = userId;
this.groupId = groupId;
this.groupName = groupName;
this.faceUrl = faceUrl;
}
}

查看文件

@ -1,6 +1,7 @@
package cn.org.bjca.trust.java.imserver.entitys;
import cn.org.bjca.trust.java.imserver.entitys.converter.AbstractBaseTimeEntityNoKey;
import jakarta.persistence.*;
import lombok.Data;

查看文件

@ -1,4 +1,4 @@
package cn.org.bjca.trust.java.imserver.entitys;
package cn.org.bjca.trust.java.imserver.entitys.converter;
import jakarta.persistence.*;
import lombok.Getter;

查看文件

@ -1,4 +1,4 @@
package cn.org.bjca.trust.java.imserver.entitys;
package cn.org.bjca.trust.java.imserver.entitys.converter;
import jakarta.persistence.*;
import lombok.Getter;

查看文件

@ -0,0 +1,25 @@
package cn.org.bjca.trust.java.imserver.entitys.converter;
import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;
import java.util.Arrays;
import java.util.List;
import static java.util.Collections.*;
@Converter
public class StringListConverter implements AttributeConverter<List<String>, String> {
private static final String SPLIT_CHAR = "-><-";
@Override
public String convertToDatabaseColumn(List<String> stringList) {
return stringList != null ? String.join(SPLIT_CHAR, stringList) : "";
}
@Override
public List<String> convertToEntityAttribute(String string) {
return string != null ? Arrays.asList(string.split(SPLIT_CHAR)) : emptyList();
}
}

查看文件

@ -1,6 +1,6 @@
package cn.org.bjca.trust.java.imserver.entitys.sys;
import cn.org.bjca.trust.java.imserver.entitys.AbstractBaseTimeEntity;
import cn.org.bjca.trust.java.imserver.entitys.converter.AbstractBaseTimeEntity;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.Data;

查看文件

@ -1,6 +1,6 @@
package cn.org.bjca.trust.java.imserver.entitys.sys;
import cn.org.bjca.trust.java.imserver.entitys.AbstractBaseTimeEntity;
import cn.org.bjca.trust.java.imserver.entitys.converter.AbstractBaseTimeEntity;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.Data;

查看文件

@ -7,11 +7,13 @@ 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;
import cn.org.bjca.trust.java.imserver.im.msg.ConnectedMessage;
import cn.org.bjca.trust.java.imserver.im.msg.RequestMessage;
import cn.org.bjca.trust.java.imserver.im.msg.msg.SZYXMessage;
import cn.org.bjca.trust.java.imserver.im.msg.msg.SendAckMessage;
import cn.org.bjca.trust.java.imserver.repository.ConnectRepository;
import cn.org.bjca.trust.java.imserver.repository.MessageRepository;
import cn.org.bjca.trust.java.imserver.repository.UserRepository;
import cn.org.bjca.trust.java.imserver.request.RequestManager;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
@ -69,28 +71,30 @@ public class ImManager {
@Override
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("server" + PacketType.CONNECT)) {
sendConnectedMsg(GsonImplHelp.get().toObject(msg, ConnectMessage.class));
} else if (topic.equals("server" + PacketType.SEND)) {
SZYXMessage szyxMessage = GsonImplHelp.get().toObject(msg, SZYXMessage.class);
szyxMessage.setStatus(0);
szyxMessage.setFromClientId(szyxMessage.getFromClient().getUserId());
try {
messageRepository.save(szyxMessage.copy());
} catch (Exception e) {
System.out.println("--------------" + e.getMessage());
}
SZYXMessage message1 = szyxMessage.copy();
message1.setArrive(true);
message1.setStatus(1);
if (szyxMessage.isGroup()) {
} else {
message1.setUserName(message1.getToClientId());
try {
messageRepository.save(message1);
} catch (Exception e) {
System.out.println("--------------" + e.getMessage());
}
if (!szyxMessage.isGroup()) {
// List<UserInfo> userInfoList = userRepository.findAllByUserIdAndAppId(szyxMessage.getToClientId(), szyxMessage.getAppId());
// for (UserInfo userInfo : userInfoList) {
message1.setUserName(szyxMessage.getToClientId());
message1.setArrive(true);
message1.setStatus(0);
// sendPacketMessage(szyxMessage.getPacketType(), message1);
// }
sendPacketMessage(szyxMessage.getPacketType(), message1);
}
// TODO: 这里应该有计时器判断转发消息是否送达如果没送达则ack返回失败状态
@ -98,9 +102,8 @@ public class ImManager {
}// 数据请求
else if (topic.equals("server" + PacketType.REQUEST)) {
} else
System.out.println("======>messageArrived:\n" + topic + "::" + msg);
sendPacketMessage(PacketType.RESULT, RequestManager.getInstance().request(msg));
}
}
@ -140,7 +143,6 @@ public class ImManager {
message.setAppId(connectMessage.getAppId());
message.setUserName(connectMessage.getUserName());
sendPacketMessage(PacketType.CONNECTED, message);
System.out.println("======>登录成功\n" + GsonImplHelp.get().toJson(message));
}
private void sendAckMsg(SZYXMessage szyxMessage) {

查看文件

@ -1,7 +1,7 @@
package cn.org.bjca.trust.java.imserver.im.bean;
import cn.org.bjca.trust.java.imserver.entitys.AbstractBaseTimeEntity;
import cn.org.bjca.trust.java.imserver.entitys.converter.AbstractBaseTimeEntity;
import cn.org.bjca.trust.java.imserver.enums.PacketType;
import jakarta.persistence.MappedSuperclass;
import lombok.Data;
@ -22,6 +22,7 @@ public abstract class PacketMessage extends AbstractBaseTimeEntity {
private long timestamp = System.currentTimeMillis();
private String appId;
private String userName;
private String osType;
private String token;
public PacketMessage(PacketType packetType) {

查看文件

@ -18,7 +18,7 @@ public class ConnectMessage extends PacketMessage {
}
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(referencedColumnName = "_id")
@JoinColumn
private DeviceEntity device;
public ConnectMessage(DeviceEntity device) {

查看文件

@ -7,12 +7,13 @@ import jakarta.persistence.Entity;
import lombok.Data;
@Data
@Entity
public class RequestMessage extends PacketMessage {
public RequestMessage() {
super(PacketType.REQUEST);
}
private String path;
private Object requestBody;
private String body;
}

查看文件

@ -0,0 +1,18 @@
package cn.org.bjca.trust.java.imserver.im.msg;
import cn.org.bjca.trust.java.imserver.enums.PacketType;
import cn.org.bjca.trust.java.imserver.im.bean.PacketMessage;
import lombok.Data;
@Data
public class ResultMessage extends PacketMessage {
public ResultMessage() {
super(PacketType.RESULT);
}
private String path;
private String body;
private String ackId;
}

查看文件

@ -26,8 +26,9 @@ public class SZYXMessage extends PacketMessage {
* 发送者信息
*/
@OneToOne
@JoinColumn(referencedColumnName = "token")
@JoinColumn
private UserInfo fromClient;
private String fromClientId;
/**
* 接收者信息
*/
@ -59,7 +60,7 @@ public class SZYXMessage extends PacketMessage {
private MsgType msgType;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "text_id", referencedColumnName = "_id")
@JoinColumn
private SZYXTextMessage textMessage;
public SZYXMessage copy() {
@ -71,6 +72,7 @@ public class SZYXMessage extends PacketMessage {
szyxMessage.setAppId(this.getAppId());
szyxMessage.setToken(this.getToken());
szyxMessage.setFromClientId(this.getFromClientId());
szyxMessage.setArrive(this.isArrive());
szyxMessage.setDescribe(this.getDescribe());
szyxMessage.setMsgType(this.getMsgType());

查看文件

@ -1,6 +1,6 @@
package cn.org.bjca.trust.java.imserver.im.msg.msg.message;
import cn.org.bjca.trust.java.imserver.entitys.AbstractBaseTimeEntity;
import cn.org.bjca.trust.java.imserver.entitys.converter.AbstractBaseTimeEntity;
import jakarta.persistence.Entity;
import lombok.Data;

查看文件

@ -0,0 +1,15 @@
package cn.org.bjca.trust.java.imserver.repository;
import cn.org.bjca.trust.java.imserver.entitys.GroupEntity;
import cn.org.bjca.trust.java.imserver.im.msg.msg.SZYXMessage;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface GroupRepository extends JpaRepository<GroupEntity, Long> {
GroupEntity getGroupEntityByGroupIdAndAppId(String groupId, String appId);
boolean existsByGroupIdAndAppId(String groupId, String appId);
}

查看文件

@ -4,7 +4,10 @@ import cn.org.bjca.trust.java.imserver.im.msg.msg.SZYXMessage;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface MessageRepository extends JpaRepository<SZYXMessage, Long> {
List<SZYXMessage> getAllByAppIdAndUserName(String appId, String userName);
}

查看文件

@ -12,4 +12,6 @@ public interface UserRepository extends JpaRepository<UserInfo, String> {
UserInfo findUserInfoByUserIdAndOsTypeAndAppId(String userId, String osType, String appId);
List<UserInfo> findAllByUserIdAndAppId(String userId, String appId);
boolean existsByAppIdAndUserId(String appId, String userId);
}

查看文件

@ -8,4 +8,5 @@ import org.springframework.stereotype.Repository;
public interface ApplicationRepository extends JpaRepository<ApplicationEntity, Long> {
ApplicationEntity findFirstByAppNameAndTenantNo(String appName, String tenantNo);
ApplicationEntity findFirstByAppId(String appId);
boolean existsByAppId(String appId);
}

查看文件

@ -0,0 +1,5 @@
package cn.org.bjca.trust.java.imserver.request;
public class RequestConstant {
public static final String Group_create_v1 = "/group/v1/create";
}

查看文件

@ -0,0 +1,110 @@
package cn.org.bjca.trust.java.imserver.request;
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.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.RequestMessage;
import cn.org.bjca.trust.java.imserver.im.msg.ResultMessage;
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;
import cn.org.bjca.trust.java.imserver.repository.tenant.ApplicationRepository;
import org.springframework.http.HttpHeaders;
import java.util.UUID;
import static cn.org.bjca.trust.java.imserver.request.RequestConstant.Group_create_v1;
public class RequestManager {
private static final class RequestManagerHolder {
static final RequestManager instance = new RequestManager();
}
public static RequestManager getInstance() {
return RequestManagerHolder.instance;
}
public ResultMessage request(String msg) {
try {
RequestMessage requestMessage = GsonImplHelp.get().toObject(msg, RequestMessage.class);
ResultMessage resultMessage = new ResultMessage();
resultMessage.setPath(requestMessage.getPath());
resultMessage.setAckId(requestMessage.getMsgId());
resultMessage.setAppId(requestMessage.getAppId());
resultMessage.setUserName(requestMessage.getUserName());
String body = GsonImplHelp.get().toJson(this.request(requestMessage.getAppId(),
requestMessage.getUserName(),
requestMessage.getOsType(),
requestMessage.getPath(),
requestMessage.getBody()));
resultMessage.setBody(body);
return resultMessage;
} catch (Exception e) {
return new ResultMessage();
}
}
public <T> HttpResult<T> request(String path, Object data, HttpHeaders headers) {
return this.request(headers.getFirst("appid"), headers.getFirst("userid"), headers.getFirst("ostype"), path, data);
}
@SuppressWarnings("unchecked")
private <T> HttpResult<T> request(String appId, String userId, String osType, String path, Object data) {
if (null != appId && null != userId && null != osType) {
if (!applicationRepository.existsByAppId(appId)) return new HttpResult<>(201, "appId不存在", null);
if (!userRepository.existsByAppIdAndUserId(appId, userId))
return new HttpResult<>(201, "当前用户不存在", null);
switch (path) {
case Group_create_v1:
return (HttpResult<T>) this.groupCreate(data instanceof String ?
GsonImplHelp.get().toObject((String) data, GroupCreateData.class)
: (GroupCreateData) data, appId, userId);
default:
return new HttpResult<>(201, "路径错误", null);
}
} else return new HttpResult<>(201, "参数错误", null);
}
private final UserRepository userRepository = SpringUtilsAuTo.getBean(UserRepository.class);
private final GroupRepository groupRepository = SpringUtilsAuTo.getBean(GroupRepository.class);
private final ApplicationRepository applicationRepository = SpringUtilsAuTo.getBean(ApplicationRepository.class);
private final MessageRepository messageRepository = SpringUtilsAuTo.getBean(MessageRepository.class);
public HttpResult<String> groupCreate(GroupCreateData data, String appid, String userid) {
if (null == data.getUserIdList() || data.getUserIdList().isEmpty() || data.getUserIdList().size() < 2) {
return new HttpResult<>(201, "群组成员需要大于一", "");
} else {
String groupId = UUID.randomUUID().toString();
String groupName = data.getGroupName();
if (null == groupName || groupName.equals("")) groupName = TimeHelper.getTimeString("yyyyMMddHHmm");
if (!data.getUserIdList().contains(userid)) {
addGroup(appid, groupId, groupName, data.getFaceUrl(), userid, userid);
}
for (String userId : data.getUserIdList()) {
if (userRepository.existsByAppIdAndUserId(appid, userId)) {
addGroup(appid, groupId, groupName, data.getFaceUrl(), userId, userid);
}
}
return new HttpResult<>(200, "成功", groupId);
}
}
private void addGroup(String appId, String groupId, String groupName, String faceUrl, String userId, String adminId) {
GroupEntity groupEntity = new GroupEntity(appId, adminId, userId, groupId, groupName, faceUrl);
groupRepository.save(groupEntity);
}
public void getHistoryForMsg(String appId, String userId, int pageSize, long timestamp) {
}
}