diff --git a/broker/src/main/java/io/moquette/persistence/DatabaseStore.java b/broker/src/main/java/io/moquette/persistence/DatabaseStore.java index 11d05bb6..8b3a86ce 100644 --- a/broker/src/main/java/io/moquette/persistence/DatabaseStore.java +++ b/broker/src/main/java/io/moquette/persistence/DatabaseStore.java @@ -688,6 +688,43 @@ public class DatabaseStore { }); } + void removeFavGroup(final String groupId, final List memberIds) { + Connection connection = null; + PreparedStatement statement = null; + try { + connection = DBUtil.getConnection(); + + StringBuilder sb = new StringBuilder("update t_user_setting set _value = ?, _dt = ? where _uid in ("); + for (int i = 0; i < memberIds.size(); i++) { + sb.append("?"); + if (i != memberIds.size() - 1) { + sb.append(","); + } + } + sb.append(")"); + + sb.append(" and _scope = 6 and _key = ?"); + + statement = connection.prepareStatement(sb.toString()); + int index = 1; + statement.setString(index++, "0"); + statement.setLong(index++, System.currentTimeMillis()); + for (int i = 0; i < memberIds.size(); i++) { + statement.setString(index++, memberIds.get(i)); + } + statement.setString(index++, groupId); + + int count = statement.executeUpdate(); + LOG.info("Update rows {}", count); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Utility.printExecption(LOG, e); + } finally { + DBUtil.closeDB(connection, statement); + } + } + void persistUserSetting(final String userId, WFCMessage.UserSettingEntry entry) { mScheduler.execute(()->{ Connection connection = null; diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index ca3a9bc4..8a852a2d 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -717,6 +717,8 @@ public class MemoryMessagesStore implements IMessagesStore { long updateDt = System.currentTimeMillis(); ArrayList list = new ArrayList<>(); List allMembers = new ArrayList<>(groupMembers.get(groupId)); + + List removedIds = new ArrayList<>(); for (WFCMessage.GroupMember member : allMembers) { if (memberList.contains(member.getMemberId())) { boolean removed = groupMembers.remove(groupId, member); @@ -725,6 +727,7 @@ public class MemoryMessagesStore implements IMessagesStore { member = member.toBuilder().setType(GroupMemberType_Removed).setUpdateDt(updateDt).build(); groupMembers.put(groupId, member); list.add(member); + removedIds.add(member.getMemberId()); } } } @@ -735,9 +738,23 @@ public class MemoryMessagesStore implements IMessagesStore { mIMap.put(groupId, groupInfo.toBuilder().setMemberUpdateDt(updateDt).setUpdateDt(updateDt).setMemberCount(groupInfo.getMemberCount() - removeCount).build()); } + removeFavGroup(groupId, removedIds); + return ErrorCode.ERROR_CODE_SUCCESS; } + void removeFavGroup(String groupId, List memberIds) { + HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); + MultiMap userSettingMap = hzInstance.getMultiMap(USER_SETTING); + + databaseStore.removeFavGroup(groupId, memberIds); + + for (String member : memberIds) { + userSettingMap.remove(member); + } + + } + @Override public ErrorCode quitGroup(String operator, String groupId) { HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); @@ -783,6 +800,8 @@ public class MemoryMessagesStore implements IMessagesStore { if (removed) { mIMap.put(groupId, groupInfo.toBuilder().setMemberUpdateDt(updateDt).setUpdateDt(updateDt).setMemberCount(groupInfo.getMemberCount() - 1).build()); } + + removeFavGroup(groupId, Arrays.asList(operator)); return ErrorCode.ERROR_CODE_SUCCESS; } @@ -808,11 +827,20 @@ public class MemoryMessagesStore implements IMessagesStore { MultiMap groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS); + Collection members = groupMembers.get(groupId); groupMembers.remove(groupId); mIMap.remove(groupId); databaseStore.removeGroupMemberFromDB(groupId); + ArrayList ids = new ArrayList<>(); + if (members != null) { + for (WFCMessage.GroupMember member : members) { + ids.add(member.getMemberId()); + } + } + removeFavGroup(groupId, ids); + return ErrorCode.ERROR_CODE_SUCCESS; }