From b8d8d2f8edb02ffa8bd6c345c68f7df68b1897cc Mon Sep 17 00:00:00 2001 From: heavyrian2012 Date: Fri, 28 Oct 2022 21:56:20 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BE=A4=E7=BB=84=E6=88=90=E5=91=98=E8=A1=A8?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=88=90=E5=91=98=E7=B4=A2=E5=BC=95=E5=92=8C?= =?UTF-8?q?=E8=8E=B7=E5=8F=962=E4=B8=AA=E4=BA=BA=E5=85=B1=E5=90=8C?= =?UTF-8?q?=E7=BE=A4=E7=BB=84=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../h2/V46__add_group_member_mid_index.sql | 1 + .../mysql/V53__add_group_member_mid_index.sql | 1 + .../action/admin/GetCommonGroupsAction.java | 55 +++++++++++++++++++ .../imhandler/GetCommonGroupsHandler.java | 33 +++++++++++ .../imhandler/GetMyGroupsHandler.java | 33 +++++++++++ .../moquette/persistence/DatabaseStore.java | 29 ++++++++++ .../persistence/MemoryMessagesStore.java | 5 ++ .../java/io/moquette/spi/IMessagesStore.java | 1 + .../src/main/java/win/liyufan/im/IMTopic.java | 2 + .../java/cn/wildfirechat/common/APIPath.java | 1 + .../java/cn/wildfirechat/sdk/GroupAdmin.java | 6 ++ .../main/java/cn/wildfirechat/sdk/Main.java | 7 +++ 12 files changed, 174 insertions(+) create mode 100755 broker/migrate/h2/V46__add_group_member_mid_index.sql create mode 100755 broker/migrate/mysql/V53__add_group_member_mid_index.sql create mode 100755 broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetCommonGroupsAction.java create mode 100644 broker/src/main/java/io/moquette/imhandler/GetCommonGroupsHandler.java create mode 100644 broker/src/main/java/io/moquette/imhandler/GetMyGroupsHandler.java diff --git a/broker/migrate/h2/V46__add_group_member_mid_index.sql b/broker/migrate/h2/V46__add_group_member_mid_index.sql new file mode 100755 index 00000000..57e78f4c --- /dev/null +++ b/broker/migrate/h2/V46__add_group_member_mid_index.sql @@ -0,0 +1 @@ +alter table `t_group_member` add INDEX `group_member_mid_index` (`_mid`); diff --git a/broker/migrate/mysql/V53__add_group_member_mid_index.sql b/broker/migrate/mysql/V53__add_group_member_mid_index.sql new file mode 100755 index 00000000..57e78f4c --- /dev/null +++ b/broker/migrate/mysql/V53__add_group_member_mid_index.sql @@ -0,0 +1 @@ +alter table `t_group_member` add INDEX `group_member_mid_index` (`_mid`); diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetCommonGroupsAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetCommonGroupsAction.java new file mode 100755 index 00000000..a514a593 --- /dev/null +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetCommonGroupsAction.java @@ -0,0 +1,55 @@ +/* + * This file is part of the Wildfire Chat package. + * (c) Heavyrain2012 + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +package com.xiaoleilu.loServer.action.admin; + +import cn.wildfirechat.common.APIPath; +import cn.wildfirechat.common.ErrorCode; +import cn.wildfirechat.pojos.InputUserId; +import cn.wildfirechat.pojos.OutputGroupIds; +import cn.wildfirechat.pojos.StringPairPojo; +import com.xiaoleilu.loServer.RestResult; +import com.xiaoleilu.loServer.annotation.HttpMethod; +import com.xiaoleilu.loServer.annotation.Route; +import com.xiaoleilu.loServer.handler.Request; +import com.xiaoleilu.loServer.handler.Response; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.util.internal.StringUtil; + +import java.util.ArrayList; +import java.util.Set; + +@Route(APIPath.Get_Common_Groups) +@HttpMethod("POST") +public class GetCommonGroupsAction extends AdminAction { + + @Override + public boolean isTransactionAction() { + return true; + } + + @Override + public boolean action(Request request, Response response) { + if (request.getNettyRequest() instanceof FullHttpRequest) { + StringPairPojo input = getRequestBody(request.getNettyRequest(), StringPairPojo.class); + if (input != null + && (!StringUtil.isNullOrEmpty(input.getFirst())) && (!StringUtil.isNullOrEmpty(input.getSecond()))) { + + Set groupIds = messagesStore.getCommonGroupIds(input.getFirst(), input.getSecond()); + OutputGroupIds outputGroupIds = new OutputGroupIds(); + outputGroupIds.setGroupIds(new ArrayList<>(groupIds)); + RestResult result = RestResult.ok(outputGroupIds); + setResponseContent(result, response); + } else { + setResponseContent(RestResult.resultOf(ErrorCode.INVALID_PARAMETER), response); + } + + } + return true; + } +} diff --git a/broker/src/main/java/io/moquette/imhandler/GetCommonGroupsHandler.java b/broker/src/main/java/io/moquette/imhandler/GetCommonGroupsHandler.java new file mode 100644 index 00000000..270c57de --- /dev/null +++ b/broker/src/main/java/io/moquette/imhandler/GetCommonGroupsHandler.java @@ -0,0 +1,33 @@ +/* + * This file is part of the Wildfire Chat package. + * (c) Heavyrain2012 + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +package io.moquette.imhandler; + +import cn.wildfirechat.common.ErrorCode; +import cn.wildfirechat.proto.ProtoConstants; +import cn.wildfirechat.proto.WFCMessage; +import io.moquette.spi.impl.Qos1PublishHandler; +import io.netty.buffer.ByteBuf; +import win.liyufan.im.IMTopic; + +import java.util.Set; + +import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS; + +@Handler(IMTopic.GetCommonGroupsTopic) +public class GetCommonGroupsHandler extends IMHandler { + @Override + public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, ProtoConstants.RequestSourceType requestSourceType, WFCMessage.IDBuf request, Qos1PublishHandler.IMCallback callback) { + WFCMessage.PullUserResult.Builder resultBuilder = WFCMessage.PullUserResult.newBuilder(); + Set strings = m_messagesStore.getCommonGroupIds(fromUser, request.getId()); + WFCMessage.IDListBuf idListBuf = WFCMessage.IDListBuf.newBuilder().addAllId(strings).build(); + byte[] data = idListBuf.toByteArray(); + ackPayload.ensureWritable(data.length).writeBytes(data); + return ERROR_CODE_SUCCESS; + } +} diff --git a/broker/src/main/java/io/moquette/imhandler/GetMyGroupsHandler.java b/broker/src/main/java/io/moquette/imhandler/GetMyGroupsHandler.java new file mode 100644 index 00000000..fb80a9b9 --- /dev/null +++ b/broker/src/main/java/io/moquette/imhandler/GetMyGroupsHandler.java @@ -0,0 +1,33 @@ +/* + * This file is part of the Wildfire Chat package. + * (c) Heavyrain2012 + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +package io.moquette.imhandler; + +import cn.wildfirechat.common.ErrorCode; +import cn.wildfirechat.proto.ProtoConstants; +import cn.wildfirechat.proto.WFCMessage; +import io.moquette.spi.impl.Qos1PublishHandler; +import io.netty.buffer.ByteBuf; +import win.liyufan.im.IMTopic; + +import java.util.Set; + +import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS; + +@Handler(IMTopic.GetMyGroupsTopic) +public class GetMyGroupsHandler extends IMHandler { + @Override + public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, ProtoConstants.RequestSourceType requestSourceType, Void request, Qos1PublishHandler.IMCallback callback) { + WFCMessage.PullUserResult.Builder resultBuilder = WFCMessage.PullUserResult.newBuilder(); + Set strings = m_messagesStore.getUserGroupIds(fromUser); + WFCMessage.IDListBuf idListBuf = WFCMessage.IDListBuf.newBuilder().addAllId(strings).build(); + byte[] data = idListBuf.toByteArray(); + ackPayload.ensureWritable(data.length).writeBytes(data); + return ERROR_CODE_SUCCESS; + } +} diff --git a/broker/src/main/java/io/moquette/persistence/DatabaseStore.java b/broker/src/main/java/io/moquette/persistence/DatabaseStore.java index 51cc271e..d150a8ec 100644 --- a/broker/src/main/java/io/moquette/persistence/DatabaseStore.java +++ b/broker/src/main/java/io/moquette/persistence/DatabaseStore.java @@ -1712,6 +1712,35 @@ public class DatabaseStore { return null; } + Set getCommonGroupIds(String userId1, String userId2) { + Connection connection = null; + PreparedStatement statement = null; + ResultSet rs = null; + try { + connection = DBUtil.getConnection(); + String sql = "select t1._gid from t_group_member t1, t_group_member t2 where t1._mid = ? and t2._mid = ? and t1._type <> 4 and t2._type <> 4 and t1._gid = t2._gid"; + statement = connection.prepareStatement(sql); + + statement.setString(1, userId1); + statement.setString(2, userId2); + + rs = statement.executeQuery(); + Set out = new HashSet<>(); + while (rs.next()) { + String uid = rs.getString(1); + out.add(uid); + } + return out; + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Utility.printExecption(LOG, e, RDBS_Exception); + } finally { + DBUtil.closeDB(connection, statement, rs); + } + return null; + } + void updateGroupMemberDt(final String groupId, final long dt) { Connection connection = null; PreparedStatement statement = null; diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 25fa83c7..d8b01e89 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -1831,6 +1831,11 @@ public class MemoryMessagesStore implements IMessagesStore { return databaseStore.getUserGroupIds(userId); } + @Override + public Set getCommonGroupIds(String userId1, String userId2) { + return databaseStore.getCommonGroupIds(userId1, userId2); + } + @Override public ErrorCode getGroupMembers(String fromUser, String groupId, long maxDt, List members) { HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index 7dffb0b1..4030ba79 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -119,6 +119,7 @@ public interface IMessagesStore { List getGroupInfos(List requests); WFCMessage.GroupInfo getGroupInfo(String groupId); Set getUserGroupIds(String userId); + Set getCommonGroupIds(String userId1, String userId2); ErrorCode getGroupMembers(String fromUser, String groupId, long maxDt, List members); WFCMessage.GroupMember getGroupMember(String groupId, String memberId); ErrorCode transferGroup(String operator, String groupId, String newOwner, boolean isAdmin); diff --git a/broker/src/main/java/win/liyufan/im/IMTopic.java b/broker/src/main/java/win/liyufan/im/IMTopic.java index cc320966..c4c854a3 100755 --- a/broker/src/main/java/win/liyufan/im/IMTopic.java +++ b/broker/src/main/java/win/liyufan/im/IMTopic.java @@ -37,6 +37,8 @@ public interface IMTopic { String GetGroupMemberTopic = "GPGM"; String TransferGroupTopic = "GTG"; String SetGroupManagerTopic = "GSM"; + String GetMyGroupsTopic = "GMGS"; + String GetCommonGroupsTopic = "GCGS"; String GetUserInfoTopic = "UPUI"; String ModifyMyInfoTopic = "MMI"; diff --git a/common/src/main/java/cn/wildfirechat/common/APIPath.java b/common/src/main/java/cn/wildfirechat/common/APIPath.java index a0eb8169..d98a536b 100644 --- a/common/src/main/java/cn/wildfirechat/common/APIPath.java +++ b/common/src/main/java/cn/wildfirechat/common/APIPath.java @@ -77,6 +77,7 @@ public interface APIPath { String Get_User_Groups = "/admin/group/of_user"; String Group_Set_Member_Alias = "/admin/group/member/set_alias"; String Group_Set_Member_Extra = "/admin/group/member/set_extra"; + String Get_Common_Groups = "/admin/group/common_group"; String Create_Channel = "/admin/channel/create"; String Destroy_Channel = "/admin/channel/destroy"; diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/GroupAdmin.java b/sdk/src/main/java/cn/wildfirechat/sdk/GroupAdmin.java index e93d22c9..5d4997a7 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/GroupAdmin.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/GroupAdmin.java @@ -170,4 +170,10 @@ public class GroupAdmin { return AdminHttpUtils.httpJsonPost(path, inputUserId, OutputGroupIds.class); } + public static IMResult getCommonGroups(String user1, String user2) throws Exception { + String path = APIPath.Get_Common_Groups; + StringPairPojo intput = new StringPairPojo(user1, user2); + return AdminHttpUtils.httpJsonPost(path, intput, OutputGroupIds.class); + } + } diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java index 26e58104..7983d23f 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java @@ -617,6 +617,13 @@ public class Main { System.exit(-1); } + groupIdsIMResult = GroupAdmin.getCommonGroups("user1", "user2"); + if (groupIdsIMResult != null && groupIdsIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("get user common groups success"); + } else { + System.out.println("get user common groups failure"); + System.exit(-1); + } //仅专业版支持 if (commercialServer) {