WindChat/windchat-business/src/main/java/com/windchat/im/business/impl/tai/ApiUserService.java

331 lines
12 KiB
Java
Executable File

/**
* Copyright 2018-2028 WindChat Group
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.windchat.im.business.impl.tai;
import com.akaxin.proto.core.UserProto;
import com.akaxin.proto.site.ApiUserMuteProto;
import com.akaxin.proto.site.ApiUserProfileProto;
import com.akaxin.proto.site.ApiUserSearchProto;
import com.akaxin.proto.site.ApiUserUpdateMuteProto;
import com.akaxin.proto.site.ApiUserUpdateProfileProto;
import com.windchat.common.command.Command;
import com.windchat.common.command.CommandResponse;
import com.windchat.common.constant.CommandConst;
import com.windchat.common.constant.ErrorCode2;
import com.windchat.common.constant.IErrorCode;
import com.windchat.common.exceptions.ZalyException2;
import com.windchat.common.logs.LogUtils;
import com.windchat.common.utils.StringHelper;
import com.windchat.common.utils.ValidatorPattern;
import com.windchat.im.business.bean.ApiActions;
import com.windchat.im.business.dao.UserFriendDao;
import com.windchat.im.business.dao.UserProfileDao;
import com.windchat.im.business.impl.AbstractRequest;
import com.windchat.im.storage.bean.UserFriendBean;
import com.windchat.im.storage.bean.UserProfileBean;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 用户个人自身资料相关功能
*
* @author Sam{@link an.guoyue254@gmail.com}
* @since 2017.11.25 15:10:36
*/
@ApiActions(action = "api.user")
public class ApiUserService extends AbstractRequest {
private static final Logger logger = LoggerFactory.getLogger(ApiUserService.class);
/**
* 用户输入siteLoginId | phoneId | userIdPubk 查找用户
*
* @param command
* @return
*/
@ApiActions(action = ".search")
public CommandResponse search(Command command) {
CommandResponse commandResponse = new CommandResponse().setAction(CommandConst.ACTION_RES);
IErrorCode errCode = ErrorCode2.ERROR;
try {
ApiUserSearchProto.ApiUserSearchRequest request = ApiUserSearchProto.ApiUserSearchRequest
.parseFrom(command.getParams());
String siteUserId = command.getSiteUserId();
String id = StringUtils.trimToNull(request.getId());
LogUtils.requestDebugLog(logger, command, request.toString());
if (StringUtils.isEmpty(id)) {
throw new ZalyException2(ErrorCode2.ERROR_PARAMETER);
}
String siteFriendId = null;
if (id.length() > 100) {
throw new ZalyException2(ErrorCode2.ERROR_PARAMETER);
// String globalUserId = UserIdUtils.getV1GlobalUserId(id);
// logger.info("api.user.search globalUserId={} pubk={}", globalUserId, id);
// siteFriendId =
// UserProfileDao.getInstance().getSiteUserIdByGlobalUserId(globalUserId);
} else if (ValidatorPattern.isPhoneId(id)) {
String phoneId = "+86_" + id;
siteFriendId = UserProfileDao.getInstance().getSiteUserIdByPhone(phoneId);
if (StringUtils.isEmpty(siteFriendId)) {
phoneId = "+86:" + id;
siteFriendId = UserProfileDao.getInstance().getSiteUserIdByPhone(phoneId);
}
} else {
// siteLoginId
String lowercaseLoginId = id.trim().toLowerCase();
siteFriendId = UserProfileDao.getInstance().getSiteUserIdByLoginId(lowercaseLoginId);
}
if (StringUtils.isEmpty(siteFriendId)) {
throw new ZalyException2(ErrorCode2.ERROR2_USER_NOUSER);
}
UserFriendBean userBean = UserProfileDao.getInstance().getFriendProfileById(siteUserId, siteFriendId);
if (userBean != null && StringUtils.isNotBlank(userBean.getSiteUserId())) {
UserProto.UserProfile.Builder friendProfileBuilder = UserProto.UserProfile.newBuilder();
friendProfileBuilder.setSiteUserId(userBean.getSiteUserId());
friendProfileBuilder.setUserIdPubk(userBean.getUserIdPubk());
if (StringUtils.isNotEmpty(userBean.getAliasName())) {
friendProfileBuilder.setUserName(userBean.getAliasName());
if (StringUtils.isNotEmpty(userBean.getUserName())) {
friendProfileBuilder.setNickName(userBean.getUserName());
}
} else {
if (StringUtils.isNotEmpty(userBean.getUserName())) {
friendProfileBuilder.setUserName(userBean.getUserName());
friendProfileBuilder.setNickName(userBean.getUserName());
}
}
if (StringUtils.isNotEmpty(userBean.getSiteLoginId())) {
friendProfileBuilder.setSiteLoginId(userBean.getSiteLoginId());
}
if (StringUtils.isNotEmpty(userBean.getUserPhoto())) {
friendProfileBuilder.setUserPhoto(userBean.getUserPhoto());
}
friendProfileBuilder.setUserStatusValue(userBean.getUserStatus());
UserProto.UserProfile friendProfile = friendProfileBuilder.build();
// 查关系
UserProto.UserRelation userRelation = UserFriendDao.getInstance().getUserRelation(siteUserId,
userBean.getSiteUserId());
ApiUserSearchProto.ApiUserSearchResponse response = ApiUserSearchProto.ApiUserSearchResponse
.newBuilder().setProfile(friendProfile).setRelation(userRelation).build();
commandResponse.setParams(response.toByteArray());
errCode = ErrorCode2.SUCCESS;
}
} catch (ZalyException2 e) {
errCode = e.getErrCode();
LogUtils.requestErrorLog(logger, command, e);
} catch (Exception e) {
errCode = ErrorCode2.ERROR_SYSTEMERROR;
LogUtils.requestErrorLog(logger, command, e);
}
return commandResponse.setErrCode(errCode);
}
/**
* 获取用户个人资料信息,支持使用globalUserid与siteUserId
*
* @param command
* @return
*/
@ApiActions(action = ".profile")
public CommandResponse profile(Command command) {
CommandResponse commandResponse = new CommandResponse().setAction(CommandConst.ACTION_RES);
ErrorCode2 errorCode = ErrorCode2.ERROR;
try {
ApiUserProfileProto.ApiUserProfileRequest request = ApiUserProfileProto.ApiUserProfileRequest
.parseFrom(command.getParams());
String currentUserId = command.getSiteUserId();
String siteUserId = request.getSiteUserId();
LogUtils.requestDebugLog(logger, command, request.toString());
if (StringUtils.isNotBlank(siteUserId) && siteUserId.equals(currentUserId)) {
UserProfileBean userBean = UserProfileDao.getInstance().getUserProfileById(siteUserId);
if (null == userBean) {
// 理论不会执行到这一步
userBean = UserProfileDao.getInstance().getUserProfileByGlobalUserId(siteUserId);
}
if (userBean != null && StringUtils.isNotBlank(userBean.getSiteUserId())) {
UserProto.UserProfile.Builder userProfileBuilder = UserProto.UserProfile.newBuilder();
userProfileBuilder.setSiteUserId(userBean.getSiteUserId());
if (StringUtils.isNotEmpty(userBean.getUserName())) {
userProfileBuilder.setUserName(userBean.getUserName());
}
if (StringUtils.isNotEmpty(userBean.getSiteLoginId())) {
userProfileBuilder.setSiteLoginId(userBean.getSiteLoginId());
}
if (StringUtils.isNotEmpty(userBean.getUserPhoto())) {
userProfileBuilder.setUserPhoto(userBean.getUserPhoto());
}
if (StringUtils.isNotEmpty(userBean.getSelfIntroduce())) {
userProfileBuilder.setSelfIntroduce(userBean.getSelfIntroduce());
}
userProfileBuilder.setUserStatusValue(userBean.getUserStatus());
ApiUserProfileProto.ApiUserProfileResponse response = ApiUserProfileProto.ApiUserProfileResponse
.newBuilder().setUserProfile(userProfileBuilder.build()).build();
commandResponse.setParams(response.toByteArray());
errorCode = ErrorCode2.SUCCESS;
}
} else {
errorCode = ErrorCode2.ERROR_PARAMETER;
}
} catch (Exception e) {
errorCode = ErrorCode2.ERROR_SYSTEMERROR;
LogUtils.requestErrorLog(logger, command, e);
}
return commandResponse.setErrCode2(errorCode);
}
/**
* 更新用户个人信息
*
* @param command
* @return
*/
@ApiActions(action = ".updateProfile")
public CommandResponse updateProfile(Command command) {
CommandResponse commandResponse = new CommandResponse().setAction(CommandConst.ACTION_RES);
IErrorCode errCode = ErrorCode2.ERROR;
try {
ApiUserUpdateProfileProto.ApiUserUpdateProfileRequest request = ApiUserUpdateProfileProto.ApiUserUpdateProfileRequest
.parseFrom(command.getParams());
String siteUserId = command.getSiteUserId();
String siteLoginId = request.getUserProfile().getSiteLoginId();
String userName = request.getUserProfile().getUserName();
String userPhoto = request.getUserProfile().getUserPhoto();
String introduce = request.getUserProfile().getSelfIntroduce();
LogUtils.requestDebugLog(logger, command, request.toString());
// 校验参数
if (StringUtils.isEmpty(siteUserId) || StringUtils.isAllEmpty(siteLoginId, userName, userPhoto)) {
throw new ZalyException2(ErrorCode2.ERROR_PARAMETER);
}
// 用户名长度 1-16
if (StringUtils.isNotEmpty(userName) && userName.length() > 16) {
throw new ZalyException2(ErrorCode2.ERROR_PARAMETER_NICKNAME);
}
// 站点账号 3-16
if (StringUtils.isNotEmpty(siteLoginId)) {
Matcher match = Pattern.compile("^[A-Za-z][A-Za-z0-9]{2,15}$").matcher(siteLoginId);
if (!match.matches()) {
throw new ZalyException2(ErrorCode2.ERROR_LOGINID_LENGTH);
}
String loginId = UserProfileDao.getInstance().getSiteLoginIdBySiteUserId(siteUserId);
if (loginId != null && !loginId.equalsIgnoreCase(siteLoginId)) {
throw new ZalyException2(ErrorCode2.ERROR_LOGINID_EXIST);
} else if (siteLoginId.equalsIgnoreCase(loginId)) {
// equal, ignore
siteLoginId = null;
}
}
UserProfileBean userBean = new UserProfileBean();
userBean.setSiteUserId(siteUserId);
userBean.setSiteLoginId(siteLoginId);
if (StringUtils.isNotEmpty(userName)) {
userBean.setUserName(userName);
userBean.setUserNameInLatin(StringHelper.toLatinPinYin(userName));
}
userBean.setUserPhoto(userPhoto);
userBean.setSelfIntroduce(introduce);
if (UserProfileDao.getInstance().updateUserProfile(userBean)) {
errCode = ErrorCode2.SUCCESS;
} else {
errCode = ErrorCode2.ERROR2_USER_UPDATE_PROFILE;
}
} catch (Exception e) {
errCode = ErrorCode2.ERROR_SYSTEMERROR;
LogUtils.requestErrorLog(logger, command, e);
} catch (ZalyException2 e) {
errCode = e.getErrCode();
LogUtils.requestErrorLog(logger, command, e);
}
return commandResponse.setErrCode(errCode);
}
/**
* 获取消息免打扰状态
*
* @param command
* @return
*/
@ApiActions(action = ".mute")
public CommandResponse mute(Command command) {
CommandResponse commandResponse = new CommandResponse().setAction(CommandConst.ACTION_RES);
ErrorCode2 errCode = ErrorCode2.ERROR;
try {
String siteUserId = command.getSiteUserId();
boolean mute = UserProfileDao.getInstance().getUserMute(siteUserId);
LogUtils.requestDebugLog(logger, command, "");
ApiUserMuteProto.ApiUserMuteResponse response = ApiUserMuteProto.ApiUserMuteResponse.newBuilder()
.setMute(mute).build();
commandResponse.setParams(response.toByteArray());
errCode = ErrorCode2.SUCCESS;
} catch (Exception e) {
errCode = ErrorCode2.ERROR_SYSTEMERROR;
LogUtils.requestErrorLog(logger, command, e);
}
return commandResponse.setErrCode2(errCode);
}
/**
* 设置消息免打扰状态
*
* @param command
* @return
*/
@ApiActions(action = ".updateMute")
public CommandResponse updateMute(Command command) {
CommandResponse commandResponse = new CommandResponse().setAction(CommandConst.ACTION_RES);
ErrorCode2 errCode = ErrorCode2.ERROR;
try {
ApiUserUpdateMuteProto.ApiUserUpdateMuteRequest request = ApiUserUpdateMuteProto.ApiUserUpdateMuteRequest
.parseFrom(command.getParams());
String siteUserId = command.getSiteUserId();
boolean mute = request.getMute();
LogUtils.requestDebugLog(logger, command, request.toString());
if (UserProfileDao.getInstance().updateUserMute(siteUserId, mute)) {
errCode = ErrorCode2.SUCCESS;
} else {
errCode = ErrorCode2.ERROR_DATABASE_EXECUTE;
}
} catch (Exception e) {
errCode = ErrorCode2.ERROR_SYSTEMERROR;
LogUtils.requestErrorLog(logger, command, e);
}
return commandResponse.setErrCode2(errCode);
}
}