修改群组反复添加删除群成员的问题

This commit is contained in:
heavyrain.lee
2019-08-06 22:55:52 +08:00
parent bf70a1e80e
commit 1a72de0e85
4 changed files with 87 additions and 80 deletions
@@ -27,6 +27,12 @@ public class KickoffGroupMember extends GroupHandler<WFCMessage.RemoveGroupMembe
} else {
boolean isAllow = isAdmin;
if (!isAllow) {
if (groupInfo.getOwner() != null) {
if (request.getRemovedMemberList().contains(groupInfo.getOwner())) {
return ErrorCode.ERROR_CODE_NOT_RIGHT;
}
}
if (groupInfo.getOwner() != null && groupInfo.getOwner().equals(fromUser)) {
isAllow = true;
}
@@ -917,14 +917,16 @@ public class DatabaseStore {
try {
connection = DBUtil.getConnection();
StringBuilder sb = new StringBuilder("delete t_user_setting where _scope in (1,3,5,7) and _uid in (");
StringBuilder sb = new StringBuilder("delete from t_user_setting where _scope in (1,3,5,7) and _uid in (");
for (int i = 0; i < users.size(); i++) {
sb.append("?");
if (i != users.size() - 1) {
sb.append(",");
}
}
sb.append(") and _key like '1-_-?'");
sb.append(") and _key like '1-_-");
sb.append(groupId);
sb.append("'");
statement = connection.prepareStatement(sb.toString());
@@ -932,7 +934,6 @@ public class DatabaseStore {
for (String userId:users) {
statement.setString(index++, userId);
}
statement.setString(index++, groupId);
int count = statement.executeUpdate();
LOG.info("Update rows {}", count);
@@ -1323,6 +1324,70 @@ public class DatabaseStore {
});
}
int removeGroupMember(String groupId, List<String> groupMembers) {
Connection connection = null;
PreparedStatement statement = null;
PreparedStatement statement2 = null;
try {
connection = DBUtil.getConnection();
connection.setAutoCommit(false);
StringBuilder sqlBuilder = new StringBuilder("update t_group_member set `_type` = ?, `_dt` = ? where `_mid` in (");
for (int i = 0; i < groupMembers.size(); i++) {
sqlBuilder.append("?");
if (i != groupMembers.size()-1) {
sqlBuilder.append(",");
}
}
sqlBuilder.append(")");
sqlBuilder.append(" and _gid = ?");
statement = connection.prepareStatement(sqlBuilder.toString());
int index = 1;
long current = System.currentTimeMillis();
statement.setInt(index++, ProtoConstants.GroupMemberType.GroupMemberType_Removed);
statement.setLong(index++, current);
for (String memberId:groupMembers) {
statement.setString(index++, memberId);
}
statement.setString(index++, groupId);
int count = statement.executeUpdate();
LOG.info("Update rows {}", count);
String sql = "update t_group set `_member_count` = `_member_count` - ?, `_member_dt` = ? , `_dt` = ? where `_gid` = ?";
statement2 = connection.prepareStatement(sql);
index = 1;
statement2.setInt(index++, count);
statement2.setLong(index++, current);
statement2.setLong(index++, current);
statement2.setString(index++, groupId);
statement2.executeUpdate();
connection.commit();
connection.setAutoCommit(true);
} catch (SQLException e) {
// TODO Auto-generated catch block
if (connection != null) {
try {
connection.commit();
connection.setAutoCommit(true);
} catch (SQLException e1) {
e1.printStackTrace();
}
}
e.printStackTrace();
Utility.printExecption(LOG, e);
} finally {
DBUtil.closeDB(connection, statement);
DBUtil.closeDB(connection, statement2);
}
return 0;
}
WFCMessage.GroupInfo getPersistGroupInfo(String groupId) {
Connection connection = null;
PreparedStatement statement = null;
@@ -713,53 +713,21 @@ public class MemoryMessagesStore implements IMessagesStore {
@Override
public ErrorCode kickoffGroupMembers(String operator, boolean isAdmin, String groupId, List<String> memberList) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
IMap<String, WFCMessage.GroupInfo> mIMap = hzInstance.getMap(GROUPS_MAP);
removeGroupMember(groupId, memberList);
removeFavGroup(groupId, memberList);
removeGroupUserSettings(groupId, memberList);
return ErrorCode.ERROR_CODE_SUCCESS;
}
WFCMessage.GroupInfo groupInfo = mIMap.get(groupId);
if (groupInfo == null) {
return ErrorCode.ERROR_CODE_NOT_EXIST;
}
if (!isAdmin && ((groupInfo.getType() == ProtoConstants.GroupType.GroupType_Restricted || groupInfo.getType() == ProtoConstants.GroupType.GroupType_Normal)
&& (groupInfo.getOwner() == null || !groupInfo.getOwner().equals(operator)))) {
return ErrorCode.ERROR_CODE_NOT_RIGHT;
}
void removeGroupMember(String groupId, List<String> memberIds) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
databaseStore.removeGroupMember(groupId, memberIds);
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
groupMembers.remove(groupId);
IMap<String, WFCMessage.GroupInfo> mIMap = hzInstance.getMap(GROUPS_MAP);
mIMap.evict(groupId);
int removeCount = 0;
long updateDt = System.currentTimeMillis();
ArrayList<WFCMessage.GroupMember> list = new ArrayList<>();
Collection<WFCMessage.GroupMember> members = groupMembers.get(groupId);
if (members == null || members.size() == 0) {
members = loadGroupMemberFromDB(hzInstance, groupId);
}
List<WFCMessage.GroupMember> allMembers = new ArrayList<>(members);
List<String> removedIds = new ArrayList<>();
for (WFCMessage.GroupMember member : allMembers) {
if (memberList.contains(member.getMemberId())) {
boolean removed = groupMembers.remove(groupId, member);
if (removed) {
removeCount++;
member = member.toBuilder().setType(GroupMemberType_Removed).setUpdateDt(updateDt).build();
groupMembers.put(groupId, member);
list.add(member);
removedIds.add(member.getMemberId());
}
}
}
if (removeCount > 0) {
databaseStore.persistGroupMember(groupId, list);
databaseStore.updateGroupMemberCountDt(groupId, groupInfo.getMemberCount()-removeCount, updateDt);
mIMap.put(groupId, groupInfo.toBuilder().setMemberUpdateDt(updateDt).setUpdateDt(updateDt).setMemberCount(groupInfo.getMemberCount() - removeCount).build());
}
removeFavGroup(groupId, removedIds);
removeGroupUserSettings(groupId, removedIds);
return ErrorCode.ERROR_CODE_SUCCESS;
}
void removeFavGroup(String groupId, List<String> memberIds) {
@@ -798,34 +766,8 @@ public class MemoryMessagesStore implements IMessagesStore {
if (groupInfo.getType() != ProtoConstants.GroupType.GroupType_Free && groupInfo.getOwner() != null && groupInfo.getOwner().equals(operator)) {
return ErrorCode.ERROR_CODE_NOT_RIGHT;
}
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
long updateDt = System.currentTimeMillis();
boolean removed = false;
Collection<WFCMessage.GroupMember> members = groupMembers.get(groupId);
if (members == null || members.size() == 0) {
members = loadGroupMemberFromDB(hzInstance, groupId);
}
for (WFCMessage.GroupMember member : members) {
if (member.getMemberId().equals(operator)) {
removed = groupMembers.remove(groupId, member);
if (removed) {
ArrayList<WFCMessage.GroupMember> list = new ArrayList<>();
list.add(member);
databaseStore.persistGroupMember(groupId, list);
databaseStore.updateGroupMemberCountDt(groupId, groupInfo.getMemberCount()-1, updateDt);
member = member.toBuilder().setType(GroupMemberType_Removed).setUpdateDt(updateDt).build();
groupMembers.put(groupId, member);
}
break;
}
}
if (removed) {
mIMap.put(groupId, groupInfo.toBuilder().setMemberUpdateDt(updateDt).setUpdateDt(updateDt).setMemberCount(groupInfo.getMemberCount() - 1).build());
}
removeGroupMember(groupId, Arrays.asList(operator));
removeFavGroup(groupId, Arrays.asList(operator));
removeGroupUserSettings(groupId, Arrays.asList(operator));
return ErrorCode.ERROR_CODE_SUCCESS;
@@ -1018,12 +960,6 @@ public class MemoryMessagesStore implements IMessagesStore {
IMap<String, WFCMessage.GroupInfo> mIMap = hzInstance.getMap(GROUPS_MAP);
WFCMessage.GroupInfo groupInfo = mIMap.get(groupId);
if (groupInfo == null) {
groupInfo = databaseStore.getPersistGroupInfo(groupId);
if (groupInfo != null) {
mIMap.put(groupId, groupInfo);
}
}
return groupInfo;
}
@@ -33,7 +33,7 @@ public class IDUtils {
return ch - 'a' + 26;
} else if(ch >= '0' && ch <= '9') {
return ch - '0' + 52;
} else if(ch == '_') {
} else if(ch == '+') {
return 62;
}
return 63;