From da74b9fa9451a2f6784bb86272a1daec610ad3b6 Mon Sep 17 00:00:00 2001 From: heavyrain2012 Date: Wed, 24 Feb 2021 15:46:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9B=B4=E6=96=B0=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../action/admin/UpdateUserAction.java | 65 +++++++++++++++++++ .../persistence/MemoryMessagesStore.java | 51 +++++++++++++++ .../java/io/moquette/spi/IMessagesStore.java | 2 + .../java/cn/wildfirechat/common/APIPath.java | 1 + .../pojos/InputUpdateUserInfo.java | 18 +++++ .../cn/wildfirechat/proto/ProtoConstants.java | 13 ++++ .../main/java/cn/wildfirechat/sdk/Main.java | 37 +++++++++++ .../java/cn/wildfirechat/sdk/UserAdmin.java | 8 +++ 8 files changed, 195 insertions(+) create mode 100755 broker/src/main/java/com/xiaoleilu/loServer/action/admin/UpdateUserAction.java create mode 100755 common/src/main/java/cn/wildfirechat/pojos/InputUpdateUserInfo.java diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/UpdateUserAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/UpdateUserAction.java new file mode 100755 index 00000000..f214adb7 --- /dev/null +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/UpdateUserAction.java @@ -0,0 +1,65 @@ +/* + * 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.common.IMExceptionEvent; +import cn.wildfirechat.pojos.InputOutputUserInfo; +import cn.wildfirechat.pojos.InputUpdateUserInfo; +import cn.wildfirechat.pojos.OutputCreateUser; +import cn.wildfirechat.proto.ProtoConstants; +import cn.wildfirechat.proto.WFCMessage; +import com.google.gson.Gson; +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.handler.codec.http.HttpResponseStatus; +import io.netty.util.internal.StringUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import win.liyufan.im.UUIDGenerator; +import win.liyufan.im.Utility; + +@Route(APIPath.Update_User) +@HttpMethod("POST") +public class UpdateUserAction extends AdminAction { + private static final Logger LOG = LoggerFactory.getLogger(UpdateUserAction.class); + + @Override + public boolean isTransactionAction() { + return true; + } + + @Override + public boolean action(Request request, Response response) { + if (request.getNettyRequest() instanceof FullHttpRequest) { + InputUpdateUserInfo inputCreateUser = getRequestBody(request.getNettyRequest(), InputUpdateUserInfo.class); + if (inputCreateUser != null + && inputCreateUser.userInfo != null + && !StringUtil.isNullOrEmpty(inputCreateUser.userInfo.getUserId()) + && inputCreateUser.flag > 0) { + + ErrorCode errorCode = messagesStore.updateUserInfo(inputCreateUser.userInfo, inputCreateUser.flag); + response.setStatus(HttpResponseStatus.OK); + RestResult result = RestResult.resultOf(errorCode); + response.setContent(new Gson().toJson(result)); + } else { + response.setStatus(HttpResponseStatus.OK); + RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER); + response.setContent(new Gson().toJson(result)); + } + + } + return true; + } +} diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index ff1614a4..52a1de64 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -59,6 +59,7 @@ import static cn.wildfirechat.proto.ProtoConstants.ModifyChannelInfoType.*; import static cn.wildfirechat.proto.ProtoConstants.ModifyGroupInfoType.*; import static cn.wildfirechat.proto.ProtoConstants.PersistFlag.Transparent; import static cn.wildfirechat.proto.ProtoConstants.Platform.*; +import static cn.wildfirechat.proto.ProtoConstants.UpdateUserInfoMask.*; import static io.moquette.BrokerConstants.*; import static io.moquette.server.Constants.MAX_CHATROOM_MESSAGE_QUEUE; import static io.moquette.server.Constants.MAX_MESSAGE_QUEUE; @@ -2127,6 +2128,56 @@ public class MemoryMessagesStore implements IMessagesStore { return out; } + @Override + public ErrorCode updateUserInfo(InputOutputUserInfo userInfo, int flag) { + HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); + IMap mUserMap = hzInstance.getMap(USERS); + WFCMessage.User user = mUserMap.get(userInfo.getUserId()); + if(user == null) { + return ErrorCode.ERROR_CODE_NOT_EXIST; + } + WFCMessage.User.Builder builder = user.toBuilder(); + if((flag & Update_User_DisplayName) > 0) { + builder.setDisplayName(userInfo.getDisplayName()); + } + if((flag & Update_User_Portrait) > 0) { + builder.setPortrait(userInfo.getPortrait()); + } + if((flag & Update_User_Gender) > 0) { + builder.setGender(userInfo.getGender()); + } + if((flag & Update_User_Mobile) > 0) { + builder.setMobile(userInfo.getMobile()); + } + if((flag & Update_User_Email) > 0) { + builder.setEmail(userInfo.getEmail()); + } + if((flag & Update_User_Address) > 0) { + builder.setAddress(userInfo.getAddress()); + } + if((flag & Update_User_Company) > 0) { + builder.setCompany(userInfo.getCompany()); + } + if((flag & Update_User_Social) > 0) { + builder.setSocial(userInfo.getSocial()); + } + if((flag & Update_User_Extra) > 0) { + builder.setExtra(userInfo.getExtra()); + } + builder.setUpdateDt(System.currentTimeMillis()); + user = builder.build(); + try { + databaseStore.updateUser(user); + } catch (Exception e) { + e.printStackTrace(); + return ErrorCode.ERROR_CODE_SERVER_ERROR; + } + + mUserMap.put(user.getUid(), user); + callbackUserInfoEvent(user); + return ErrorCode.ERROR_CODE_SUCCESS; + } + @Override public void addUserInfo(WFCMessage.User user, String password) throws Exception { 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 ed42cd1d..643b0aa5 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -16,6 +16,7 @@ package io.moquette.spi; +import cn.wildfirechat.pojos.InputOutputUserInfo; import cn.wildfirechat.pojos.SystemSettingPojo; import cn.wildfirechat.proto.WFCMessage; import com.xiaoleilu.loServer.model.FriendData; @@ -142,6 +143,7 @@ public interface IMessagesStore { int getUserStatus(String userId); List getUserStatusList(); + ErrorCode updateUserInfo(InputOutputUserInfo userInfo, int flag); void addUserInfo(WFCMessage.User user, String password) throws Exception; void destoryUser(String userId); void updateUserInfo(WFCMessage.User user) throws Exception; diff --git a/common/src/main/java/cn/wildfirechat/common/APIPath.java b/common/src/main/java/cn/wildfirechat/common/APIPath.java index a2f8ae68..b6032f47 100644 --- a/common/src/main/java/cn/wildfirechat/common/APIPath.java +++ b/common/src/main/java/cn/wildfirechat/common/APIPath.java @@ -17,6 +17,7 @@ public interface APIPath { String Sensitive_Query = "/admin/sensitive/query"; String Create_User = "/admin/user/create"; + String Update_User = "/admin/user/update"; String Destroy_User = "/admin/user/destroy"; String Create_Robot = "/admin/robot/create"; String CreateOrUpdate_Device = "/admin/device/create"; diff --git a/common/src/main/java/cn/wildfirechat/pojos/InputUpdateUserInfo.java b/common/src/main/java/cn/wildfirechat/pojos/InputUpdateUserInfo.java new file mode 100755 index 00000000..2b4a7c2a --- /dev/null +++ b/common/src/main/java/cn/wildfirechat/pojos/InputUpdateUserInfo.java @@ -0,0 +1,18 @@ +/* + * 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 cn.wildfirechat.pojos; + + +import cn.wildfirechat.proto.WFCMessage; + +public class InputUpdateUserInfo { + //UpdateUserInfoMask + public int flag; + public InputOutputUserInfo userInfo; +} diff --git a/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java b/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java index 832af0a5..9cce0922 100644 --- a/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java +++ b/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java @@ -201,6 +201,19 @@ public class ProtoConstants { int Chatroom_Member_Event_Unmute = 4; } + public interface UpdateUserInfoMask { + int Update_User_DisplayName = 0x01; + int Update_User_Portrait = 0x02; + int Update_User_Gender = 0x04; + int Update_User_Mobile = 0x08; + int Update_User_Email = 0x10; + int Update_User_Address = 0x20; + int Update_User_Company = 0x40; + int Update_User_Social = 0x80; + int Update_User_Extra = 0x100; + } + + public static final int MESSAGE_CONTENT_TYPE_CREATE_GROUP = 104; public static final int MESSAGE_CONTENT_TYPE_ADD_GROUP_MEMBER = 105; public static final int MESSAGE_CONTENT_TYPE_KICKOF_GROUP_MEMBER = 106; diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java index 4068ec92..8ee00154 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java @@ -134,6 +134,43 @@ public class Main { System.exit(-1); } + InputOutputUserInfo updateUserInfo = new InputOutputUserInfo(); + updateUserInfo.setUserId(System.currentTimeMillis()+""); + updateUserInfo.setDisplayName("updatedUserName"); + updateUserInfo.setPortrait("updatedUserPortrait"); + int updateUserFlag = ProtoConstants.UpdateUserInfoMask.Update_User_DisplayName | ProtoConstants.UpdateUserInfoMask.Update_User_Portrait; + IMResult result = UserAdmin.updateUserInfo(updateUserInfo, updateUserFlag); + if(result != null && result.getErrorCode() == ErrorCode.ERROR_CODE_NOT_EXIST) { + System.out.println("updateUserInfo success"); + } else { + System.out.println("updateUserInfo failure"); + System.exit(-1); + } + + updateUserInfo.setUserId(userInfo.getUserId()); + result = UserAdmin.updateUserInfo(updateUserInfo, updateUserFlag); + if(result != null && result.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("updateUserInfo success"); + } else { + System.out.println("updateUserInfo failure"); + System.exit(-1); + } + + IMResult resultGetUserInfo4 = UserAdmin.getUserByUserId(userInfo.getUserId()); + if (resultGetUserInfo4 != null && resultGetUserInfo4.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + if (userInfo.getUserId().equals(resultGetUserInfo4.getResult().getUserId()) + && updateUserInfo.getDisplayName().equals(resultGetUserInfo4.getResult().getDisplayName()) + && updateUserInfo.getPortrait().equals(resultGetUserInfo4.getResult().getPortrait())) { + System.out.println("get user info success"); + } else { + System.out.println("get user info by userId failure"); + System.exit(-1); + } + } else { + System.out.println("get user info by userId failure"); + System.exit(-1); + } + IMResult resultGetToken = UserAdmin.getUserToken(userInfo.getUserId(), "client111", ProtoConstants.Platform.Platform_Android); if (resultGetToken != null && resultGetToken.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { System.out.println("get token success: " + resultGetToken.getResult().getToken()); diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java b/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java index 9a5c520e..e041b81e 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java @@ -29,6 +29,14 @@ public class UserAdmin { return AdminHttpUtils.httpJsonPost(path, user, OutputCreateUser.class); } + public static IMResult updateUserInfo(InputOutputUserInfo user, int/*UpdateUserInfoMask*/ flag) throws Exception { + String path = APIPath.Update_User; + InputUpdateUserInfo updateUserInfo = new InputUpdateUserInfo(); + updateUserInfo.flag = flag; + updateUserInfo.userInfo = user; + return AdminHttpUtils.httpJsonPost(path, updateUserInfo, Void.class); + } + public static IMResult createRobot(InputCreateRobot robot) throws Exception { String path = APIPath.Create_Robot; return AdminHttpUtils.httpJsonPost(path, robot, OutputCreateRobot.class);