Browse Source

创建群组

xuqm 2 năm trước cách đây
mục cha
commit
e037d174fc
24 tập tin đã thay đổi với 281 bổ sung44 xóa
  1. 12 0
      src/main/java/cn/org/bjca/trust/java/imserver/bean/group/GroupCreateData.java
  2. 0 16
      src/main/java/cn/org/bjca/trust/java/imserver/common/RequestManager.java
  3. 22 0
      src/main/java/cn/org/bjca/trust/java/imserver/controller/group/v1/GroupV1Controller.java
  4. 1 1
      src/main/java/cn/org/bjca/trust/java/imserver/entitys/DeviceEntity.java
  5. 33 0
      src/main/java/cn/org/bjca/trust/java/imserver/entitys/GroupEntity.java
  6. 1 0
      src/main/java/cn/org/bjca/trust/java/imserver/entitys/UserInfo.java
  7. 1 1
      src/main/java/cn/org/bjca/trust/java/imserver/entitys/converter/AbstractBaseTimeEntity.java
  8. 1 1
      src/main/java/cn/org/bjca/trust/java/imserver/entitys/converter/AbstractBaseTimeEntityNoKey.java
  9. 25 0
      src/main/java/cn/org/bjca/trust/java/imserver/entitys/converter/StringListConverter.java
  10. 1 1
      src/main/java/cn/org/bjca/trust/java/imserver/entitys/sys/ApplicationEntity.java
  11. 1 1
      src/main/java/cn/org/bjca/trust/java/imserver/entitys/sys/TenantEntity.java
  12. 19 17
      src/main/java/cn/org/bjca/trust/java/imserver/im/ImManager.java
  13. 2 1
      src/main/java/cn/org/bjca/trust/java/imserver/im/bean/PacketMessage.java
  14. 1 1
      src/main/java/cn/org/bjca/trust/java/imserver/im/msg/ConnectMessage.java
  15. 2 1
      src/main/java/cn/org/bjca/trust/java/imserver/im/msg/RequestMessage.java
  16. 18 0
      src/main/java/cn/org/bjca/trust/java/imserver/im/msg/ResultMessage.java
  17. 4 2
      src/main/java/cn/org/bjca/trust/java/imserver/im/msg/msg/SZYXMessage.java
  18. 1 1
      src/main/java/cn/org/bjca/trust/java/imserver/im/msg/msg/message/SZYXTextMessage.java
  19. 15 0
      src/main/java/cn/org/bjca/trust/java/imserver/repository/GroupRepository.java
  20. 3 0
      src/main/java/cn/org/bjca/trust/java/imserver/repository/MessageRepository.java
  21. 2 0
      src/main/java/cn/org/bjca/trust/java/imserver/repository/UserRepository.java
  22. 1 0
      src/main/java/cn/org/bjca/trust/java/imserver/repository/tenant/ApplicationRepository.java
  23. 5 0
      src/main/java/cn/org/bjca/trust/java/imserver/request/RequestConstant.java
  24. 110 0
      src/main/java/cn/org/bjca/trust/java/imserver/request/RequestManager.java

+ 12 - 0
src/main/java/cn/org/bjca/trust/java/imserver/bean/group/GroupCreateData.java

@@ -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;
+}

+ 0 - 16
src/main/java/cn/org/bjca/trust/java/imserver/common/RequestManager.java

@@ -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){
-
-    }
-
-}

+ 22 - 0
src/main/java/cn/org/bjca/trust/java/imserver/controller/group/v1/GroupV1Controller.java

@@ -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 - 1
src/main/java/cn/org/bjca/trust/java/imserver/entitys/DeviceEntity.java

@@ -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

+ 33 - 0
src/main/java/cn/org/bjca/trust/java/imserver/entitys/GroupEntity.java

@@ -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 - 0
src/main/java/cn/org/bjca/trust/java/imserver/entitys/UserInfo.java

@@ -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 - 1
src/main/java/cn/org/bjca/trust/java/imserver/entitys/AbstractBaseTimeEntity.java → src/main/java/cn/org/bjca/trust/java/imserver/entitys/converter/AbstractBaseTimeEntity.java

@@ -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 - 1
src/main/java/cn/org/bjca/trust/java/imserver/entitys/AbstractBaseTimeEntityNoKey.java → src/main/java/cn/org/bjca/trust/java/imserver/entitys/converter/AbstractBaseTimeEntityNoKey.java

@@ -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;

+ 25 - 0
src/main/java/cn/org/bjca/trust/java/imserver/entitys/converter/StringListConverter.java

@@ -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 - 1
src/main/java/cn/org/bjca/trust/java/imserver/entitys/sys/ApplicationEntity.java

@@ -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 - 1
src/main/java/cn/org/bjca/trust/java/imserver/entitys/sys/TenantEntity.java

@@ -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;

+ 19 - 17
src/main/java/cn/org/bjca/trust/java/imserver/im/ImManager.java

@@ -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 message1 = szyxMessage.copy();
+                        szyxMessage.setStatus(0);
+                        szyxMessage.setFromClientId(szyxMessage.getFromClient().getUserId());
                         try {
-                            messageRepository.save(message1);
+                            messageRepository.save(szyxMessage.copy());
                         } 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);
-//                            }
+                        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());
+                            }
                             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) {

+ 2 - 1
src/main/java/cn/org/bjca/trust/java/imserver/im/bean/PacketMessage.java

@@ -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) {

+ 1 - 1
src/main/java/cn/org/bjca/trust/java/imserver/im/msg/ConnectMessage.java

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

+ 2 - 1
src/main/java/cn/org/bjca/trust/java/imserver/im/msg/RequestMessage.java

@@ -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;
 
 }

+ 18 - 0
src/main/java/cn/org/bjca/trust/java/imserver/im/msg/ResultMessage.java

@@ -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;
+
+}

+ 4 - 2
src/main/java/cn/org/bjca/trust/java/imserver/im/msg/msg/SZYXMessage.java

@@ -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 - 1
src/main/java/cn/org/bjca/trust/java/imserver/im/msg/msg/message/SZYXTextMessage.java

@@ -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;
 

+ 15 - 0
src/main/java/cn/org/bjca/trust/java/imserver/repository/GroupRepository.java

@@ -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);
+}

+ 3 - 0
src/main/java/cn/org/bjca/trust/java/imserver/repository/MessageRepository.java

@@ -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);
 }

+ 2 - 0
src/main/java/cn/org/bjca/trust/java/imserver/repository/UserRepository.java

@@ -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);
 }

+ 1 - 0
src/main/java/cn/org/bjca/trust/java/imserver/repository/tenant/ApplicationRepository.java

@@ -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);
 }

+ 5 - 0
src/main/java/cn/org/bjca/trust/java/imserver/request/RequestConstant.java

@@ -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";
+}

+ 110 - 0
src/main/java/cn/org/bjca/trust/java/imserver/request/RequestManager.java

@@ -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) {
+
+    }
+
+}