Commit 673029d4 by hweeeeeei

Merge remote-tracking branch 'origin/feature-cluster' into feature-cluster

parents 0c3334dd aed89500
......@@ -5,7 +5,7 @@ import cn.hutool.crypto.digest.MD5;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.enums.PlatformEnum;
import com.wecloud.im.enums.DeviceTypeEnum;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.ws.utils.RedisUtils;
......@@ -85,7 +85,7 @@ public class LoginTest {
}
// 生成token
String generateToken = JwtUtil.generateToken(clientId, appKey, imApplication.getAppSecret(), Duration.ofDays(99999), PlatformEnum.WEB.getCode());
String generateToken = JwtUtil.generateToken(clientId, appKey, imApplication.getAppSecret(), Duration.ofDays(99999), DeviceTypeEnum.WEB.getCode());
// 保存redis
redisTemplate.opsForValue().set("client:" + imApplication.getAppKey() + ":" + clientId, generateToken);
......
......@@ -15,26 +15,34 @@ spring-boot-plus:
spring:
datasource:
url: jdbc:mysql://192.168.1.51:3306/wecloud-im?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
username: mysql
password: mysql
# url: jdbc:mysql://127.0.0.1:3306/wecloud-im?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
# username: root
# password: 123456
# 测试外网
url: jdbc:mysql://121.37.22.224:3306/wecloud_im_feature_cluster?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: temple123456
#//测试外网
# url: jdbc:mysql://18.136.207.16:3306/wecloud_im?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
# username: web
# password: axT8knPN5hAP
# Redis配置
redis:
# database: 0
# host: 127.0.0.1
# password:
# port: 6379
database: 0
host: 192.168.1.51
password:
host: 121.37.22.224
password: temple123456
port: 6379
cloud:
nacos:
discovery:
server-addr: 192.168.1.51:8848
server-addr: 127.0.0.1:8848
dubbo:
......@@ -42,9 +50,11 @@ dubbo:
port: 20881
name: dubbo
registry:
address: nacos://192.168.1.51:8848?username=nacos&password=nacos
address: nacos://127.0.0.1:8848?username=nacos&password=nacos
provider:
cluster: channelRouterCluster
consumer:
check: false
# 打印SQL语句和结果集,本地开发环境可开启,线上注释掉
mybatis-plus:
......
......@@ -15,7 +15,7 @@ spring-boot-plus:
spring:
datasource:
url: jdbc:mysql://121.37.234.35:3306/wecloudim_feature_cluster?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
url: jdbc:mysql://121.37.22.224:3306/wecloud_im_feature_cluster?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: temple123456
......@@ -27,8 +27,8 @@ spring:
# Redis配置
redis:
database: 0
host: 127.0.0.1
password:
host: 121.37.22.224
password: temple123456
port: 6379
cloud:
......
......@@ -152,7 +152,9 @@ public class NormalChatAction {
// 异步推送系统通知消息
PushDTO pushDTO = mqSender.buildPushDto(data.getPush(), imClientReceiver, imApplication);
mqSender.orderSend(MqConstant.Topic.IM_MSG_TOPIC, MqConstant.Tag.IM_MSG_TAG, pushDTO);
if (pushDTO != null) {
mqSender.orderSend(MqConstant.Topic.IM_ORDER_MSG_TOPIC, MqConstant.Tag.IM_ORDER_MSG_TAG, pushDTO);
}
}
// 响应发送方消息id等信息
......
package com.wecloud.im.constant;
/**
* @Author wenzhida
* @Date 2022/3/1 18:17
* @Description 数字常量
*/
public class NumberConstant {
/**
* 数字常量
*/
public static final int NUM_30 = 30;
public static final int NUM_32 = 32;
}
package com.wecloud.im.controller;
import com.alibaba.fastjson.JSON;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.friend.param.ImFriendApplyDto;
import com.wecloud.im.param.ClientInfoParam;
import com.wecloud.im.param.GetClientInfoParam;
import com.wecloud.im.param.GetOnlineStatusParam;
import com.wecloud.im.param.add.ImClientDeviceInfoAdd;
import com.wecloud.im.param.LogoutParam;
import com.wecloud.im.param.add.ClientDeviceUpdateParam;
import com.wecloud.im.param.add.ImClientHeadPortraitAdd;
import com.wecloud.im.param.add.ImClientHeadPortraitAndNicknameUpdate;
import com.wecloud.im.param.add.ImClientNicknameAdd;
......@@ -93,8 +94,9 @@ public class ImClientController extends BaseController {
*/
@PostMapping("/addDeviceInfo")
@ApiOperation(value = "添加或修改推送设备信息(每次请求都会覆盖之前的数据)")
public ApiResult<Boolean> addDeviceInfo(@Validated(Add.class) @RequestBody ImClientDeviceInfoAdd imClientDevice) throws Exception {
boolean flag = imClientService.updateDeviceInfo(imClientDevice);
public ApiResult<Boolean> addDeviceInfo(@Validated(Add.class) @RequestBody ClientDeviceUpdateParam param) throws Exception {
log.info("添加或修改推送设备信息入参 {}", JSON.toJSONString(param));
boolean flag = imClientService.updateDeviceInfo(param);
return ApiResult.result(flag);
}
......@@ -102,6 +104,7 @@ public class ImClientController extends BaseController {
@PostMapping("/updateHeadAndNickname")
@ApiOperation(value = "添加或修改头像和昵称")
public ApiResult<Boolean> updateHeadAndNickname(@Validated(Add.class) @RequestBody ImClientHeadPortraitAndNicknameUpdate imClientHeadPortraitAndNicknameUpdate) throws Exception {
log.info("添加或修改头像和昵称入参 {}", JSON.toJSONString(imClientHeadPortraitAndNicknameUpdate));
boolean flag = imClientService.updateHeadAndNickname(imClientHeadPortraitAndNicknameUpdate);
return ApiResult.result(flag);
}
......@@ -110,6 +113,7 @@ public class ImClientController extends BaseController {
@PostMapping("/updateHeadPortrait")
@ApiOperation(value = "添加或修改头像")
public ApiResult<Boolean> updateHeadPortrait(@Validated(Add.class) @RequestBody ImClientHeadPortraitAdd imClientHeadPortraitAdd) throws Exception {
log.info("添加或修改头像入参 {}", JSON.toJSONString(imClientHeadPortraitAdd));
boolean flag = imClientService.updateHeadPortrait(imClientHeadPortraitAdd);
return ApiResult.result(flag);
}
......@@ -117,6 +121,7 @@ public class ImClientController extends BaseController {
@PostMapping("/updateNickname")
@ApiOperation(value = "添加或修改主昵称")
public ApiResult<Boolean> updateNickname(@Validated(Add.class) @RequestBody ImClientNicknameAdd imClientNicknameAdd) throws Exception {
log.info("添加或修改主昵称入参 {}", JSON.toJSONString(imClientNicknameAdd));
boolean flag = imClientService.updateNickname(imClientNicknameAdd);
return ApiResult.result(flag);
}
......@@ -130,8 +135,9 @@ public class ImClientController extends BaseController {
*/
@PostMapping("/logout")
@ApiOperation(value = "退出登陆 清除推送token等")
public ApiResult<Boolean> logout() throws Exception {
boolean flag = imClientService.logout();
public ApiResult<Boolean> logout(@RequestBody @Validated LogoutParam param) {
log.info("退出登陆入参 {}", JSON.toJSONString(param));
boolean flag = imClientService.logout(param);
return ApiResult.result(flag);
}
......@@ -144,7 +150,7 @@ public class ImClientController extends BaseController {
@ApiOperation(value = "获取用户在线状态(批量)")
ApiResult<List<ImOnlineStatusVo>> getOnlineStatus(@RequestBody GetOnlineStatusParam getOnlineStatusParam) {
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken();
JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken();
// 根据appKey查询appid
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey());
......
package com.wecloud.im.controller;
import com.alibaba.fastjson.JSON;
import com.wecloud.im.param.ImConversationQueryParam;
import com.wecloud.im.param.MutedGroupParam;
import com.wecloud.im.param.SetAdminsParam;
......@@ -71,6 +72,7 @@ public class ImConversationController extends BaseController {
@PostMapping("/leave")
@ApiOperation(value = "client退出会话", notes = "若是创建者退出,[创建者]权限将会转移给按加入会话时间排序的下一个client")
public ApiResult<Boolean> leaveConversation(@RequestBody ImClientLeaveConversation imClientToConversation) throws Exception {
log.info("client退出会话入参 {}", JSON.toJSONString(imClientToConversation));
return imConversationService.leaveConversation(imClientToConversation);
}
......@@ -81,6 +83,7 @@ public class ImConversationController extends BaseController {
@PostMapping("/delClient")
@ApiOperation(value = "将client从会话移除", notes = "权限:目前只有创建者有权限操作")
public ApiResult<Boolean> delClientToConversation(@RequestBody ImClientToConversation imClientToConversation) throws Exception {
log.info("将client从会话移除入参 {}", JSON.toJSONString(imClientToConversation));
return imConversationService.delClientToConversation(imClientToConversation);
}
......@@ -91,6 +94,7 @@ public class ImConversationController extends BaseController {
@PostMapping("/addClient")
@ApiOperation(value = "将用户添加进会话", notes = "权限:会话中所有client都有权限操作")
public ApiResult<Boolean> addClientToConversation(@RequestBody ImClientToConversation imClientToConversation) throws Exception {
log.info("将用户添加进会话入参 {}", JSON.toJSONString(imClientToConversation));
return imConversationService.addClientToConversation(imClientToConversation);
}
......@@ -100,6 +104,7 @@ public class ImConversationController extends BaseController {
@PostMapping("/create")
@ApiOperation(value = "创建会话", notes = "后台可配置:两个客户端如果已经创建过会话,是否重复创建会话")
public ApiResult<ImConversationCreateVo> createImConversation(@RequestBody ImConversationCreate imConversationCreate) throws Exception {
log.info("创建会话入参 {}", JSON.toJSONString(imConversationCreate));
return imConversationService.createImConversation(imConversationCreate);
}
......@@ -109,6 +114,7 @@ public class ImConversationController extends BaseController {
@PostMapping("/transferOwner")
@ApiOperation(value = "群主转让", notes = "权限:目前只有群主有权限操作")
public ApiResult<Boolean> transferOwner(@RequestBody TransferOwnerParam param) {
log.info("群主转让入参 {}", JSON.toJSONString(param));
Boolean result = imConversationService.transferOwner(param);
return ApiResult.ok(result);
}
......@@ -119,6 +125,7 @@ public class ImConversationController extends BaseController {
@PostMapping("/setAdmins")
@ApiOperation(value = "设置群管理员", notes = "权限:目前只有群主有权限操作")
public ApiResult<Boolean> setAdmins(@RequestBody @Validated SetAdminsParam param) {
log.info("设置群管理员入参 {}", JSON.toJSONString(param));
if (CollectionUtils.isEmpty(param.getClientIds())) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
......@@ -132,6 +139,7 @@ public class ImConversationController extends BaseController {
@PostMapping("/mutedGroup")
@ApiOperation(value = "群禁言、取消群禁言", notes = "权限:群主和管理员有权限操作")
public ApiResult<Boolean> mutedGroup(@RequestBody @Validated MutedGroupParam param) {
log.info("群禁言、取消群禁言入参 {}", JSON.toJSONString(param));
Boolean result = imConversationService.mutedGroup(param);
return ApiResult.ok(result);
}
......@@ -142,6 +150,7 @@ public class ImConversationController extends BaseController {
@PostMapping("/mutedGroupMember")
@ApiOperation(value = "选择禁言", notes = "权限:群主和管理员有权限操作")
public ApiResult<Boolean> mutedGroupMember(@RequestBody @Validated MutedGroupParam param) {
log.info("选择禁言入参 {}", JSON.toJSONString(param));
if (CollectionUtils.isEmpty(param.getClientIds())) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
......
......@@ -36,7 +36,6 @@ public class TokenController extends BaseController {
@PostMapping("/verify")
@ApiOperation(value = "根据sign申请token", notes = "校验客户方生成的签名字符串,验证通过则下发token")
public ApiResult<TokenVo> verify(@RequestBody ImTokenVerify imTokenVerify) throws NacosException {
return imClientLoginService.verifySign(imTokenVerify);
}
......
......@@ -48,25 +48,10 @@ public class ImClient extends BaseEntity {
@ApiModelProperty("客户方提供的唯一id")
private String clientId;
@ApiModelProperty("设备不想收到推送提醒, 1想, 0不想")
private Integer valid;
@ApiModelProperty("设备类型1:ios; 2:android")
private Integer deviceType;
@ApiModelProperty("设备推送token")
private String deviceToken;
@ApiModelProperty("头像")
private String headPortrait;
@ApiModelProperty("主昵称")
private String nickname;
/**
* 客户端平台
* @see com.wecloud.im.enums.PlatformEnum
*/
@NotNull(message = "平台不可为空")
@ApiModelProperty("客户端平台: 1 web, 2 安卓, 3 ios, 4 pc-win, 5 pc-macOs")
private Integer platform;
}
package com.wecloud.im.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.geekidea.springbootplus.framework.common.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
* @Author wenzhida
* @Date 2022/3/2 14:52
* @Description 客户端设备
*/
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "客户端设备")
public class ImClientDevice extends BaseEntity {
private static final long serialVersionUID = 6988763580951760226L;
@NotNull(message = "主键id不能为空")
@ApiModelProperty("主键id")
@TableId(value = "id", type = IdType.INPUT)
private Long id;
@ApiModelProperty("应用appid")
private Long fkAppid;
@ApiModelProperty("client主键id")
private Long fkClientId;
@ApiModelProperty("设备不想收到推送提醒, 1想, 0不想")
private Integer valid;
@ApiModelProperty("设备类型 1:ios; 2:android; 3:web; 4:win; 5:mac")
private Integer deviceType;
@ApiModelProperty("设备推送token")
private String deviceToken;
@ApiModelProperty("唯一id")
private String uniqueDeviceId;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("修改时间")
private Date updateTime;
}
......@@ -2,18 +2,23 @@ package com.wecloud.im.enums;
import io.geekidea.springbootplus.framework.common.enums.BaseEnum;
public enum PlatformEnum implements BaseEnum {
WEB(1, "web端"),
/**
* @Author wenzhida
* @Date 2022/3/2 17:15
* @Description 设备类型枚举
*/
public enum DeviceTypeEnum implements BaseEnum {
IOS(1, "IOS端"),
ANDROID(2, "安卓端"),
IOS(3, "IOS端"),
WEB(3, "web端"),
WIN(4, "PC-windows端"),
MAC(5, "PC-macOs端");
private final Integer code;
private final String desc;
PlatformEnum(Integer code, String desc) {
DeviceTypeEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
......
package com.wecloud.im.user.controller;
package com.wecloud.im.externalaccess.controller;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.friend.param.ImFriendApplyDto;
import com.wecloud.im.friend.param.ImFriendBaseParam;
import com.wecloud.im.friend.service.ImFriendService;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.user.param.FriendDto;
import com.wecloud.im.user.service.FriendService;
import com.wecloud.im.externalaccess.param.FriendDto;
import com.wecloud.im.externalaccess.service.FriendService;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
......
package com.wecloud.im.externalaccess.controller;
import cn.hutool.crypto.digest.MD5;
import com.wecloud.im.externalaccess.param.MultiMeetSignGetParam;
import com.wecloud.im.externalaccess.param.SendVerifyCodeParam;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author wenzhida
* @Date 2022/3/3 17:39
* @Description 多人音视频控制器
*/
@Slf4j
@RestController
@RequestMapping("/multiMeet")
@Api(value = "多人音视频API", tags = {"多人音视频"})
public class MultiMeetController extends BaseController {
/**
* 获取sign
*/
@PostMapping("/getSign")
@ApiOperation(value = "获取多人音视频专用sign")
public ApiResult<String> sendVerifyCode(@RequestBody @Validated MultiMeetSignGetParam param) {
String sign = new MD5().digestHex(param.getTimestamp() + param.getClientId()
+ param.getAppKey() + param.getAppSecret() + param.getPlatform());
return ApiResult.ok(sign);
}
}
package com.wecloud.im.user.controller;
import com.wecloud.im.user.param.ChangePhoneParam;
import com.wecloud.im.user.param.CheckPhoneParam;
import com.wecloud.im.user.param.FindUserParam;
import com.wecloud.im.user.param.GetUserParam;
import com.wecloud.im.user.param.LoginSuccessDto;
import com.wecloud.im.user.param.ModifyHeadPortraitParam;
import com.wecloud.im.user.param.ModifyLandouParam;
import com.wecloud.im.user.param.ModifyNicknameParam;
import com.wecloud.im.user.param.ModifySexParam;
import com.wecloud.im.user.param.RegisterSuccessDto;
import com.wecloud.im.user.param.ResetPasswordParam;
import com.wecloud.im.user.param.UserBaseDto;
import com.wecloud.im.user.param.UserLoginParam;
import com.wecloud.im.user.param.UserRegisterParam;
import com.wecloud.im.user.service.UserService;
package com.wecloud.im.externalaccess.controller;
import com.alibaba.fastjson.JSON;
import com.wecloud.im.externalaccess.param.ChangePhoneParam;
import com.wecloud.im.externalaccess.param.CheckPhoneParam;
import com.wecloud.im.externalaccess.param.FindUserParam;
import com.wecloud.im.externalaccess.param.GetUserParam;
import com.wecloud.im.externalaccess.param.LoginSuccessDto;
import com.wecloud.im.externalaccess.param.ModifyHeadPortraitParam;
import com.wecloud.im.externalaccess.param.ModifyLandouParam;
import com.wecloud.im.externalaccess.param.ModifyNicknameParam;
import com.wecloud.im.externalaccess.param.ModifySexParam;
import com.wecloud.im.externalaccess.param.RegisterSuccessDto;
import com.wecloud.im.externalaccess.param.ResetPasswordParam;
import com.wecloud.im.externalaccess.param.UserBaseDto;
import com.wecloud.im.externalaccess.param.UserLoginParam;
import com.wecloud.im.externalaccess.param.UserRegisterParam;
import com.wecloud.im.externalaccess.service.UserService;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
......@@ -43,8 +44,9 @@ public class UserController extends BaseController {
private UserService userService;
@PostMapping("/checkPhone")
@ApiOperation(value = "校验手机号码是否可使用 true-可使用 false-不可使用")
@ApiOperation(value = "校验手机号码是否未注册用户 true-可使用 false-不可使用")
public ApiResult<Boolean> checkPhone(@RequestBody @Validated CheckPhoneParam param) {
log.info("校验手机号码是否未注册用户 {}", JSON.toJSONString(param));
if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
......@@ -54,6 +56,7 @@ public class UserController extends BaseController {
@PostMapping("/register")
@ApiOperation(value = "用户注册接口")
public ApiResult<RegisterSuccessDto> register(@RequestBody @Validated UserRegisterParam param) {
log.info("用户注册接口入参 {}", JSON.toJSONString(param));
if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
......@@ -64,6 +67,7 @@ public class UserController extends BaseController {
@PostMapping("/login")
@ApiOperation(value = "用户登录接口")
public ApiResult<LoginSuccessDto> login(@RequestBody @Validated UserLoginParam param) {
log.info("用户登录接口入参 {}", JSON.toJSONString(param));
if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
......@@ -74,6 +78,7 @@ public class UserController extends BaseController {
@PostMapping("/resetPassword")
@ApiOperation(value = "重置密码接口")
public ApiResult<Boolean> resetPassword(@RequestBody @Validated ResetPasswordParam param) {
log.info("重置密码接口入参 {}", JSON.toJSONString(param));
if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
......@@ -84,6 +89,7 @@ public class UserController extends BaseController {
@PostMapping("/changePhone")
@ApiOperation(value = "更换手机号接口")
public ApiResult<Boolean> changePhone(@RequestBody @Validated ChangePhoneParam param) {
log.info("更换手机号接口入参 {}", JSON.toJSONString(param));
if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
......@@ -101,6 +107,7 @@ public class UserController extends BaseController {
@PostMapping("/findUser")
@ApiOperation(value = "查找用户")
public ApiResult<UserBaseDto> findUser(@RequestBody @Validated FindUserParam param) {
log.info("查找用户入参 {}", JSON.toJSONString(param));
if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
......@@ -111,6 +118,7 @@ public class UserController extends BaseController {
@PostMapping("/getUserByUserId")
@ApiOperation(value = "根据用户id查找用户信息")
public ApiResult<UserBaseDto> getUserByUserId(@RequestBody @Validated GetUserParam param) {
log.info("根据用户id查找用户信息入参 {}", JSON.toJSONString(param));
if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
......@@ -121,6 +129,7 @@ public class UserController extends BaseController {
@PostMapping("/modifyHeadPortrait")
@ApiOperation(value = "修改头像")
public ApiResult<Boolean> modifyHeadPortrait(@RequestBody @Validated ModifyHeadPortraitParam param) {
log.info("修改头像入参 {}", JSON.toJSONString(param));
if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
......@@ -131,6 +140,7 @@ public class UserController extends BaseController {
@PostMapping("/modifyNickname")
@ApiOperation(value = "修改昵称")
public ApiResult<Boolean> modifyNickname(@RequestBody @Validated ModifyNicknameParam param) {
log.info("修改昵称入参 {}", JSON.toJSONString(param));
if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
......@@ -141,6 +151,7 @@ public class UserController extends BaseController {
@PostMapping("/modifyLandouNo")
@ApiOperation(value = "修改蓝豆号")
public ApiResult<Boolean> modifyLandouNo(@RequestBody @Validated ModifyLandouParam param) {
log.info("修改蓝豆号入参 {}", JSON.toJSONString(param));
if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
......@@ -151,6 +162,7 @@ public class UserController extends BaseController {
@PostMapping("/modifySex")
@ApiOperation(value = "修改性别")
public ApiResult<Boolean> modifySex(@RequestBody @Validated ModifySexParam param) {
log.info("修改性别入参 {}", JSON.toJSONString(param));
if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
......
package com.wecloud.im.user.controller;
package com.wecloud.im.externalaccess.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wecloud.im.enums.VerifySceneEnum;
import com.wecloud.im.user.constant.RedisKeyPrefixConstant;
import com.wecloud.im.user.param.SendVerifyCodeParam;
import com.wecloud.im.constant.RedisKeyPrefixConstant;
import com.wecloud.im.externalaccess.entity.User;
import com.wecloud.im.externalaccess.param.SendVerifyCodeParam;
import com.wecloud.im.externalaccess.service.UserService;
import com.wecloud.im.ws.utils.RedisUtils;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.geekidea.springbootplus.framework.common.enums.BaseEnum;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
......@@ -34,6 +38,9 @@ public class VerifyCodeController extends BaseController {
@Autowired
private RedisUtils redisUtils;
@Autowired
private UserService userService;
/**
* 发送验证码接口
*/
......@@ -46,6 +53,14 @@ public class VerifyCodeController extends BaseController {
if (BaseEnum.valueOf(VerifySceneEnum.class, param.getVerifyScene()) == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
if (VerifySceneEnum.RESET_PWD.getCode().equals(param.getVerifyScene())) {
// 重置密码、找回密码校验手机号码已注册
User user = userService.getOne(new QueryWrapper<User>().lambda()
.eq(User::getPhone, param.getPhone()));
if (user == null) {
throw new BusinessException("账号不存在");
}
}
// String verifyCode = RandomUtil.generateVerifyCode();
String verifyCode = "666666";
String key = new StringBuilder(RedisKeyPrefixConstant.VERIFY_CODE_PREFIX).append(param.getVerifyScene()).append(param.getPhone()).toString();
......
package com.wecloud.im.user.entity;
package com.wecloud.im.externalaccess.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
......
package com.wecloud.im.user.mapper;
package com.wecloud.im.externalaccess.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wecloud.im.user.entity.User;
import com.wecloud.im.externalaccess.entity.User;
import org.springframework.stereotype.Repository;
/**
......
package com.wecloud.im.user.param;
package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......
package com.wecloud.im.user.param;
package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......
package com.wecloud.im.user.param;
package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......
package com.wecloud.im.user.param;
package com.wecloud.im.externalaccess.param;
import com.wecloud.im.friend.param.ImFriendBaseDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serializable;
/**
* @Author wenzhida
* @Date 2022/2/22 23:20
......@@ -23,6 +20,12 @@ public class FriendDto extends ImFriendBaseDto {
@ApiModelProperty("昵称")
private String nickname;
@ApiModelProperty("好友拒绝原因")
private String rejectRemark;
@ApiModelProperty("好友请求说明")
private String requestRemark;
/**
* 头像路径url
*/
......
package com.wecloud.im.user.param;
package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......
package com.wecloud.im.user.param;
package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......
package com.wecloud.im.user.param;
package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......
package com.wecloud.im.user.param;
package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......
package com.wecloud.im.user.param;
package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......
package com.wecloud.im.user.param;
package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......
package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* @Author wenzhida
* @Date 2022/3/3 17:42
* @Description 多人音视频sign获取入参
*/
@Data
public class MultiMeetSignGetParam implements Serializable {
private static final long serialVersionUID = 1538118936608500035L;
@ApiModelProperty("时间戳")
@NotNull(message = "时间戳不能为空")
private String timestamp;
@ApiModelProperty("client客户端id")
@NotNull(message = "client客户端id不能为空")
private String clientId;
@ApiModelProperty("appKey")
@NotNull(message = "appKey不能为空")
private String appKey;
@ApiModelProperty("客户端平台: 1 web, 2 安卓, 3 ios, 4 pc-win, 5 pc-macOs")
@NotNull(message = "客户端平台不能为空")
private Integer platform;
@ApiModelProperty("密钥")
@NotNull(message = "密钥不能为空")
private String appSecret;
}
package com.wecloud.im.user.param;
package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
......
package com.wecloud.im.user.param;
package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......
package com.wecloud.im.user.param;
package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......
package com.wecloud.im.user.param;
package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......
package com.wecloud.im.user.param;
package com.wecloud.im.externalaccess.param;
import com.wecloud.im.enums.DeviceTypeEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......@@ -35,13 +36,11 @@ public class UserLoginParam implements Serializable {
private String appKey;
/**
* 客户端平台
* @see com.wecloud.im.enums.PlatformEnum
* 设备类型
* @see DeviceTypeEnum
*/
@NotNull(message = "平台不可为空")
@ApiModelProperty("客户端平台: 1 web, 2 安卓, 3 ios, 4 pc-win, 5 pc-macOs")
private Integer platform;
@NotNull(message = "设备类型不可为空")
@ApiModelProperty("设备类型 1:ios; 2:android; 3:web; 4:win; 5:mac")
private Integer deviceType;
@ApiModelProperty("设备推送token")
private String deviceToken;
}
package com.wecloud.im.user.param;
package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......
package com.wecloud.im.user.service;
package com.wecloud.im.externalaccess.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.collect.Lists;
......@@ -10,9 +10,9 @@ import com.wecloud.im.friend.param.ImFriendBaseParam;
import com.wecloud.im.friend.param.ImFriendPageParam;
import com.wecloud.im.friend.service.ImFriendService;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.user.entity.User;
import com.wecloud.im.user.mapper.UserMapper;
import com.wecloud.im.user.param.FriendDto;
import com.wecloud.im.externalaccess.entity.User;
import com.wecloud.im.externalaccess.mapper.UserMapper;
import com.wecloud.im.externalaccess.param.FriendDto;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
......@@ -44,7 +44,7 @@ public class FriendService extends BaseServiceImpl<UserMapper, User> {
public FriendDto getFriendInfo(ImFriendBaseParam param) {
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
if (currentClient == null) {
throw new BusinessException("当前登录用户未找到");
}
......@@ -74,7 +74,7 @@ public class FriendService extends BaseServiceImpl<UserMapper, User> {
* 全量获取好友列表
*/
public List<FriendDto> getFriends() {
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
if (currentClient == null) {
throw new BusinessException("当前登录用户未找到");
}
......@@ -116,7 +116,7 @@ public class FriendService extends BaseServiceImpl<UserMapper, User> {
* 获取好友列表申请
*/
public List<FriendDto> getApplyFriends() {
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
if (currentClient == null) {
throw new BusinessException("当前登录用户未找到");
}
......
package com.wecloud.im.user.service;
package com.wecloud.im.externalaccess.service;
import cn.hutool.core.lang.Snowflake;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wecloud.im.constant.NumberConstant;
import com.wecloud.im.constant.RedisKeyPrefixConstant;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImClientDevice;
import com.wecloud.im.enums.FriendStateEnum;
import com.wecloud.im.enums.RelationEnum;
import com.wecloud.im.enums.VerifySceneEnum;
import com.wecloud.im.externalaccess.entity.User;
import com.wecloud.im.externalaccess.mapper.UserMapper;
import com.wecloud.im.externalaccess.param.ChangePhoneParam;
import com.wecloud.im.externalaccess.param.CheckPhoneParam;
import com.wecloud.im.externalaccess.param.FindUserParam;
import com.wecloud.im.externalaccess.param.GetUserParam;
import com.wecloud.im.externalaccess.param.LoginSuccessDto;
import com.wecloud.im.externalaccess.param.ModifyHeadPortraitParam;
import com.wecloud.im.externalaccess.param.ModifyLandouParam;
import com.wecloud.im.externalaccess.param.ModifyNicknameParam;
import com.wecloud.im.externalaccess.param.ModifySexParam;
import com.wecloud.im.externalaccess.param.ResetPasswordParam;
import com.wecloud.im.externalaccess.param.UserBaseDto;
import com.wecloud.im.externalaccess.param.UserLoginParam;
import com.wecloud.im.externalaccess.param.UserRegisterParam;
import com.wecloud.im.friend.entity.ImFriend;
import com.wecloud.im.friend.service.ImFriendService;
import com.wecloud.im.param.add.ImClientHeadPortraitAdd;
import com.wecloud.im.param.add.ImClientNicknameUpdate;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientBlacklistService;
import com.wecloud.im.service.ImClientDeviceService;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.user.constant.RedisKeyPrefixConstant;
import com.wecloud.im.user.entity.User;
import com.wecloud.im.user.mapper.UserMapper;
import com.wecloud.im.user.param.ChangePhoneParam;
import com.wecloud.im.user.param.CheckPhoneParam;
import com.wecloud.im.user.param.FindUserParam;
import com.wecloud.im.user.param.GetUserParam;
import com.wecloud.im.user.param.LoginSuccessDto;
import com.wecloud.im.user.param.ModifyHeadPortraitParam;
import com.wecloud.im.user.param.ModifyLandouParam;
import com.wecloud.im.user.param.ModifyNicknameParam;
import com.wecloud.im.user.param.ModifySexParam;
import com.wecloud.im.user.param.ResetPasswordParam;
import com.wecloud.im.user.param.UserBaseDto;
import com.wecloud.im.user.param.UserLoginParam;
import com.wecloud.im.user.param.UserRegisterParam;
import com.wecloud.im.ws.utils.RedisUtils;
import com.wecloud.utils.AesUtil;
import com.wecloud.utils.RandomUtil;
......@@ -62,6 +65,9 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
private ImClientService imClientService;
@Autowired
private ImClientDeviceService imClientDeviceService;
@Autowired
private ImFriendService imFriendService;
@Autowired
......@@ -70,19 +76,21 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/**
* 校验手机号码是否可使用
*
* @param param
*/
public Boolean checkPhone(CheckPhoneParam param) {
User userExist = this.getOne(new QueryWrapper<User>().lambda()
.eq(User::getPhone, param.getPhone()));
if (userExist != null) {
return Boolean.FALSE;
throw new BusinessException("该手机号已被注册");
}
return Boolean.TRUE;
}
/**
* 注册用户
*
* @param param
*/
public String registerUser(UserRegisterParam param) {
......@@ -95,6 +103,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
}
User user = new User();
user.setId(SnowflakeUtil.getId());
user.setNickname("蓝豆-" + RandomUtil.generateRandomStr(6));
user.setIdNumber(this.getLandouNo());
user.setPhone(param.getPhone());
user.setPassword(AesUtil.encrypt(param.getPassword()));
......@@ -106,6 +115,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/**
* 用户登录
*
* @param param
*/
public LoginSuccessDto loginUser(UserLoginParam param) {
......@@ -129,16 +139,21 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
.eq(ImClient::getClientId, user.getId()));
if (imClient == null) {
imClient = new ImClient();
imClient.setId(new Snowflake(1L, 1L).nextId());
imClient.setId(SnowflakeUtil.getId());
imClient.setFkAppid(imApplication.getId());
imClient.setClientId(user.getId().toString());
imClient.setHeadPortrait(user.getHeadPortrait());
imClient.setNickname(user.getNickname());
imClient.setPlatform(param.getPlatform());
imClientService.save(imClient);
} else {
imClient.setPlatform(param.getPlatform());
imClientService.updateById(imClient);
ImClientDevice imClientDevice = new ImClientDevice();
imClientDevice.setId(SnowflakeUtil.getId());
imClientDevice.setFkAppid(imApplication.getId());
imClientDevice.setFkClientId(imClient.getId());
imClientDevice.setValid(1);
imClientDevice.setDeviceType(param.getDeviceType());
imClientDevice.setCreateTime(new Date());
imClientDevice.setUpdateTime(new Date());
imClientDeviceService.save(imClientDevice);
}
LoginSuccessDto loginSuccessDto = new LoginSuccessDto();
......@@ -149,6 +164,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/**
* 重置密码
*
* @param param
*/
public void resetPassword(ResetPasswordParam param) {
......@@ -165,6 +181,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/**
* 更换手机号码
*
* @param param
*/
public void changePhone(ChangePhoneParam param) {
......@@ -192,7 +209,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
* 查找本人信息
*/
public UserBaseDto myInfo() {
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
User user = this.getOne(new QueryWrapper<User>().lambda()
.eq(User::getId, currentClient.getClientId()));
if (user == null) {
......@@ -206,6 +223,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/**
* 查找用户
*
* @param param
*/
public UserBaseDto findUser(FindUserParam param) {
......@@ -222,7 +240,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
userBaseDto.setRelation(RelationEnum.STRANGER.getCode());
// 查询该好友与自己关系: 陌生人、好友、被拉黑名单
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
ImFriend imFriend = imFriendService.getByKey(currentClient.getClientId(), user.getId().toString());
if (imFriend != null && FriendStateEnum.CONFORM.getCode().equals(imFriend.getState())) {
userBaseDto.setRelation(RelationEnum.FRIEND.getCode());
......@@ -237,6 +255,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/**
* 查找用户
*
* @param param
*/
public UserBaseDto getUserByUserId(GetUserParam param) {
......@@ -250,7 +269,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
userBaseDto.setUserId(user.getId().toString());
userBaseDto.setRelation(RelationEnum.STRANGER.getCode());
// 查询该好友与自己关系: 陌生人、好友、被拉黑名单
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
ImFriend imFriend = imFriendService.getByKey(currentClient.getClientId(), user.getId().toString());
if (imFriend != null && FriendStateEnum.CONFORM.getCode().equals(imFriend.getState())) {
userBaseDto.setRelation(RelationEnum.FRIEND.getCode());
......@@ -264,6 +283,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/**
* 修改头像
*
* @param param
*/
@Transactional(rollbackFor = Exception.class)
......@@ -281,6 +301,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/**
* 修改昵称
*
* @param param
*/
@Transactional(rollbackFor = Exception.class)
......@@ -289,6 +310,9 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
if (user == null) {
throw new BusinessException("查无用户");
}
if (param.getNickname().length() > NumberConstant.NUM_30) {
throw new BusinessException("昵称长度需小于30位");
}
user.setNickname(param.getNickname());
this.updateById(user);
ImClientNicknameUpdate imClientNicknameUpdate = new ImClientNicknameUpdate();
......@@ -298,6 +322,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/**
* 修改昵称
*
* @param param
*/
public void modifyLandouNo(ModifyLandouParam param) {
......@@ -309,12 +334,16 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
if (userByLando != null) {
throw new BusinessException("该蓝豆号已被使用,请更换");
}
if (param.getLandouNo().length() > NumberConstant.NUM_32) {
throw new BusinessException("蓝豆号输入长度需小于32位");
}
user.setIdNumber(param.getLandouNo());
this.updateById(user);
}
/**
* 修改性别
*
* @param param
*/
public void modifySex(ModifySexParam param) {
......@@ -328,16 +357,18 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/**
* 根据蓝豆号获取用户
*
* @param landouNo
* @return
*/
public User getByLandouNo (String landouNo) {
public User getByLandouNo(String landouNo) {
return this.getOne(new QueryWrapper<User>().lambda()
.eq(User::getIdNumber, landouNo));
}
/**
* 校验短信验证码
*
* @param verifyCode
* @param redisKey
*/
......@@ -351,9 +382,10 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/**
* 获取可使用蓝豆号
*
* @return
*/
private String getLandouNo () {
private String getLandouNo() {
String landouNo;
do {
landouNo = RandomUtil.generateRandomStr(8);
......
......@@ -58,7 +58,7 @@ public class ImFriendController extends BaseController {
if(param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
if(currentClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
}
......@@ -79,7 +79,7 @@ public class ImFriendController extends BaseController {
if(param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
if(currentClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
}
......@@ -100,7 +100,7 @@ public class ImFriendController extends BaseController {
@PostMapping("/unsureFriends")
@ApiOperation(value = "待接受的好友请求列表,最多只返回1000个")
public ApiResult<List<ImFriendApplyDto>> getUnsureFriends() {
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
if(currentClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
}
......@@ -117,7 +117,7 @@ public class ImFriendController extends BaseController {
if(param == null || param.getAgree() == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
if(currentClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
}
......@@ -137,7 +137,7 @@ public class ImFriendController extends BaseController {
@PostMapping("/batchDelete")
@ApiOperation(value = "删除好友")
public ApiResult<Boolean> batchDeleteFriend(@RequestBody ImDeleteFriendParam param) {
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
if(currentClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
}
......@@ -153,7 +153,7 @@ public class ImFriendController extends BaseController {
@OperationLog(name = "好友分页列表", type = OperationLogType.PAGE)
@ApiOperation(value = "好友分页列表")
public ApiResult<Paging<ImFriendBaseDto>> getImFriendPageList(@RequestBody ImFriendPageParam pageParam) {
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
if(currentClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
}
......@@ -169,7 +169,7 @@ public class ImFriendController extends BaseController {
@OperationLog(name = "批量创建好友推荐", type = OperationLogType.PAGE)
@ApiOperation(value = "批量创建好友推荐")
public ApiResult<Boolean> batchCreateRecommend(@RequestBody ImCreateRecommendParam param) {
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
if(currentClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
}
......@@ -192,7 +192,7 @@ public class ImFriendController extends BaseController {
@OperationLog(name = "好友推荐分页列表", type = OperationLogType.PAGE)
@ApiOperation(value = "好友推荐分页列表")
public ApiResult<Paging<ImFriendRecommendDto>> getImFriendRecommendPageList(@RequestBody ImFriendPageParam pageParam) {
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
if(currentClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
}
......@@ -207,7 +207,7 @@ public class ImFriendController extends BaseController {
@PostMapping("/recommend/batchDelete")
@ApiOperation(value = "删除好友推荐")
public ApiResult<Boolean> batchDeleteRecommend(@RequestBody ImDeleteRecommendParam param) {
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
if(currentClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
}
......
......@@ -38,8 +38,8 @@ public class FriendEventSender {
private final static String FRIEND_APPLY_TITLE = "好友申请";
private final static String FRIEND_APPLY_TITLE_SUB = "您有好友申请待验证";
private final static String FRIEND_APPROVE_TITLE = "好友验证结果";
private final static String FRIEND_APPROVE_TITLE_AGREE = "您的好友拒绝了您的好友申请";
private final static String FRIEND_APPROVE_TITLE_REJECT = "您的好友同意了您的好友申请";
private final static String FRIEND_APPROVE_TITLE_AGREE = "您的好友同意了您的好友申请";
private final static String FRIEND_APPROVE_TITLE_REJECT = "您的好友拒绝了您的好友申请";
public void sendFriendApplyEventMsg(ImClient claimerClient, ImClient receiveClient, String requestRemark) {
......@@ -66,7 +66,9 @@ public class FriendEventSender {
pushVO.setTitle(FRIEND_APPLY_TITLE);
pushVO.setSubTitle(FRIEND_APPLY_TITLE_SUB);
PushDTO pushDTO = mqSender.buildPushDto(pushVO, receiveClient, app);
mqSender.orderSend(MqConstant.Topic.IM_MSG_TOPIC, MqConstant.Tag.IM_MSG_TAG, pushDTO);
if (pushDTO != null) {
mqSender.orderSend(MqConstant.Topic.IM_ORDER_MSG_TOPIC, MqConstant.Tag.IM_ORDER_MSG_TAG, pushDTO);
}
}
public void sendFriendApproveEventMsg(ImClient claimerClient, ImClient receiveClient, boolean isAgree, String rejectRemark) {
......@@ -94,6 +96,8 @@ public class FriendEventSender {
pushVO.setTitle(FRIEND_APPROVE_TITLE);
pushVO.setSubTitle(isAgree ? FRIEND_APPROVE_TITLE_AGREE : FRIEND_APPROVE_TITLE_REJECT);
PushDTO pushDTO = mqSender.buildPushDto(pushVO, receiveClient, app);
mqSender.orderSend(MqConstant.Topic.IM_MSG_TOPIC, MqConstant.Tag.IM_MSG_TAG, pushDTO);
if (pushDTO != null) {
mqSender.orderSend(MqConstant.Topic.IM_ORDER_MSG_TOPIC, MqConstant.Tag.IM_ORDER_MSG_TAG, pushDTO);
}
}
}
......@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.enums.FriendStateEnum;
import com.wecloud.im.friend.entity.ImFriend;
......@@ -101,7 +102,7 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> {
if(StringUtils.isNotEmpty(friendName)) {
my.setFriendName(friendName);
}
this.updateByKeyAndClaimer(my);
this.updateByKey(my);
} else {
my.setId(SnowflakeUtil.getId());
my.setCreateTime(new Date());
......@@ -118,10 +119,7 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> {
if(StringUtils.isNotEmpty(requestRemark)) {
friend.setRequestRemark(requestRemark);
}
if(StringUtils.isNotEmpty(friendName)) {
friend.setFriendName(friendName);
}
this.updateByKeyAndClaimer(friend);
this.updateByKey(friend);
} else {
friend.setId(SnowflakeUtil.getId());
friend.setCreateTime(new Date());
......@@ -137,7 +135,7 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> {
/**
* 根据 自己id和好友id查询好友信息
* 根据 自己id和好友id查询好友信息 - 待确认、已确认
* @param clientId
* @param friendClientId
* @return
......@@ -163,6 +161,19 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> {
}
/**
* 根据 自己id和好友id,更新好友信息
* @param imFriend
*/
public boolean updateByKey(ImFriend imFriend) {
// 不更新id
imFriend.setId(null);
imFriend.setCreateTime(null);
return this.update(imFriend, new QueryWrapper<ImFriend>().lambda()
.eq(ImFriend::getClientId, imFriend.getClientId())
.eq(ImFriend::getClientIdFriend, imFriend.getClientIdFriend()));
}
/**
* 好友通过/拒绝
* @param currentClient
* @param friendClient
......@@ -184,7 +195,7 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> {
if(StringUtils.isNotEmpty(rejectRemark)) {
friend.setRejectRemark(rejectRemark);
}
boolean ok1 = this.updateByKeyAndClaimer(friend);
boolean ok1 = this.updateByKey(friend);
// 同时更新我的
ImFriend my = new ImFriend();
my.setClientId(currentClient.getClientId());
......@@ -194,7 +205,7 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> {
if(StringUtils.isNotEmpty(rejectRemark)) {
my.setRejectRemark(rejectRemark);
}
boolean ok2 = this.updateByKeyAndClaimer(my);
boolean ok2 = this.updateByKey(my);
friendEventSender.sendFriendApproveEventMsg(currentClient, friendClient, agree, rejectRemark);
......
......@@ -25,7 +25,7 @@ public interface ImClientBlacklistMapper extends BaseMapper<ImClientBlacklist> {
* @param clientId
* @return
*/
IPage<ImClientBlacklistQueryVo> getImClientBlacklistPageList(@Param("page") Page page, @Param("clientId") Long clientId);
IPage<ImClientBlacklistQueryVo> getImClientBlacklistPageList(@Param("page") Page page, @Param("clientId") String clientId);
/**
* 根据ID获取查询对象
......
package com.wecloud.im.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wecloud.im.entity.ImClientDevice;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
/**
* @Author wenzhida
* @Date 2022/3/2 14:57
* @Description 客户端设备mapper
*/
@Repository
public interface ImClientDeviceMapper extends BaseMapper<ImClientDevice> {
/**
* 清除旧token
* @param appId
* @param deviceToken
* @return
*/
int removeOldToken(@Param("appId") Long appId, @Param("deviceToken") String deviceToken);
}
......@@ -32,10 +32,6 @@ public interface ImClientMapper extends BaseMapper<ImClient> {
*/
IPage<ImClientQueryVo> getImClientPageList(@Param("page") Page page, @Param("param") ImClientPageParam imClientPageParam);
int removeOldToken(@Param("appId") Long appId, @Param("deviceToken") String deviceToken);
List<GetInfoListVo> getInfoList(@Param("appId") Long appId, @Param("conversationId") Long conversationId, @Param("clientIds") List<String> clientIds);
List<ImClientSimpleDto> getSimpleClients(@Param("appId")Long appId, @Param("clientIds")List<String> clientIds);
......
package com.wecloud.im.mq;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.collect.Lists;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImClientDevice;
import com.wecloud.im.service.ImClientDeviceService;
import com.wecloud.im.service.ImInboxService;
import com.wecloud.im.ws.model.request.PushVO;
import com.wecloud.pushserver.client.model.constant.MqConstant;
import com.wecloud.pushserver.client.model.dto.ImApplicationDTO;
import com.wecloud.pushserver.client.model.dto.ImClientDTO;
import com.wecloud.pushserver.client.model.dto.ApplicationDTO;
import com.wecloud.pushserver.client.model.dto.ClientDTO;
import com.wecloud.pushserver.client.model.dto.ClientDeviceDTO;
import com.wecloud.pushserver.client.model.dto.MessageDTO;
import com.wecloud.pushserver.client.model.dto.PushDTO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.rocketmq.client.producer.SendResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import static com.wecloud.im.ws.ImConstant.PUSH_BODY;
import static com.wecloud.im.ws.ImConstant.PUSH_TITLE;
......@@ -34,8 +40,12 @@ public class MqSender {
@Autowired
private RocketMqProducerService rocketMqProducerService;
@Autowired
private ImClientDeviceService imClientDeviceService;
/**
* mq同步推送方法
*
* @param topic
* @param tag
* @param pushDTO
......@@ -50,6 +60,7 @@ public class MqSender {
/**
* mq异步推送方法
*
* @param topic
* @param tag
* @param pushDTO
......@@ -62,6 +73,7 @@ public class MqSender {
/**
* mq按顺序发送
*
* @param topic
* @param tag
* @param pushDTO
......@@ -89,23 +101,36 @@ public class MqSender {
// 统计未读消息数量
int badge = imInboxService.countMyNotReadCount(imClientReceiver.getId());
messageDTO.setBadge(badge);
ImClientDTO imClientDTO = new ImClientDTO();
imClientDTO.setClientId(imClientReceiver.getClientId());
imClientDTO.setValid(imClientReceiver.getValid());
imClientDTO.setDeviceType(imClientReceiver.getDeviceType());
imClientDTO.setDeviceToken(imClientReceiver.getDeviceToken());
messageDTO.setImClientDTO(imClientDTO);
ImApplicationDTO imApplicationDTO = new ImApplicationDTO();
imApplicationDTO.setId(imApplication.getId());
imApplicationDTO.setAppKey(imApplication.getAppKey());
imApplicationDTO.setAppSecret(imApplication.getAppSecret());
imApplicationDTO.setAppName(imApplication.getAppName());
imApplicationDTO.setIosPushChannel(imApplication.getIosPushChannel());
imApplicationDTO.setAndroidPushChannel(imApplication.getAndroidPushChannel());
imApplicationDTO.setUmengKey(imApplication.getUmengKey());
imApplicationDTO.setUmengSecret(imApplication.getUmengSecret());
imApplicationDTO.setFirebaseSecret(imApplication.getFirebaseSecret());
messageDTO.setImApplicationDTO(imApplicationDTO);
ClientDTO clientDTO = new ClientDTO();
clientDTO.setClientId(imClientReceiver.getClientId());
List<ImClientDevice> clientDeviceList = imClientDeviceService.list(
new QueryWrapper<ImClientDevice>().lambda()
.eq(ImClientDevice::getFkClientId, imClientReceiver.getId()));
if (CollectionUtils.isEmpty(clientDeviceList)) {
log.info("接收人信息 {} 查无推送设备", imClientReceiver.getId());
return null;
}
List<ClientDeviceDTO> deviceDTOList = Lists.newArrayList();
for (ImClientDevice imClientDevice : clientDeviceList) {
ClientDeviceDTO clientDeviceDTO = new ClientDeviceDTO();
clientDeviceDTO.setValid(imClientDevice.getValid());
clientDeviceDTO.setDeviceType(imClientDevice.getDeviceType());
clientDeviceDTO.setDeviceToken(imClientDevice.getDeviceToken());
deviceDTOList.add(clientDeviceDTO);
}
clientDTO.setDeviceDTOList(deviceDTOList);
messageDTO.setClientDTO(clientDTO);
ApplicationDTO applicationDTO = new ApplicationDTO();
applicationDTO.setId(imApplication.getId());
applicationDTO.setAppKey(imApplication.getAppKey());
applicationDTO.setAppSecret(imApplication.getAppSecret());
applicationDTO.setAppName(imApplication.getAppName());
applicationDTO.setIosPushChannel(imApplication.getIosPushChannel());
applicationDTO.setAndroidPushChannel(imApplication.getAndroidPushChannel());
applicationDTO.setUmengKey(imApplication.getUmengKey());
applicationDTO.setUmengSecret(imApplication.getUmengSecret());
applicationDTO.setFirebaseSecret(imApplication.getFirebaseSecret());
messageDTO.setApplicationDTO(applicationDTO);
pushDTO.setMessageDTOList(Lists.newArrayList(messageDTO));
return pushDTO;
}
......
......@@ -28,10 +28,17 @@ public class ImHistoryMessagePageParam extends BasePageOrderParam {
/**
* 消息id最小值
*/
@ApiModelProperty("消息id最小值")
private Long msgIdStart;
/**
* 消息id最大值
*/
@ApiModelProperty("消息id最大值")
private Long msgIdEnd;
/**
* 当前操作人client主键id
*/
private Long currentFkClientId;
}
package com.wecloud.im.param;
import io.geekidea.springbootplus.framework.common.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
/**
* @Author wenzhida
* @Date 2022/3/2 18:11
* @Description 登出操作入参
*/
@Data
@ApiModel(value = "登出操作入参")
public class LogoutParam extends BaseEntity {
private static final long serialVersionUID = -2718673661281424767L;
/**
* 设备类型
* @see com.wecloud.im.enums.DeviceTypeEnum
*/
@ApiModelProperty("设备类型 1:ios; 2:android; 3:web; 4:win; 5:mac")
@NotNull(message = "设备类型不能为空")
private Integer deviceType;
@ApiModelProperty("唯一设备id")
private String uniqueDeviceId;
}
......@@ -17,15 +17,22 @@ import lombok.experimental.Accessors;
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "添加或修改推送设备信息")
public class ImClientDeviceInfoAdd extends BaseEntity {
public class ClientDeviceUpdateParam extends BaseEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty("设备不想收到推送提醒, 1想, 0不想")
private Integer valid;
@ApiModelProperty("设备类型1:ios; 2:android; 3:web")
/**
* 设备类型
* @see com.wecloud.im.enums.DeviceTypeEnum
*/
@ApiModelProperty("设备类型 1:ios; 2:android; 3:web; 4:win; 5:mac")
private Integer deviceType;
@ApiModelProperty("设备推送token")
private String deviceToken;
@ApiModelProperty("唯一设备id")
private String uniqueDeviceId;
}
package com.wecloud.im.service;
import com.wecloud.im.entity.ImClientDevice;
import io.geekidea.springbootplus.framework.common.service.BaseService;
/**
* @Author wenzhida
* @Date 2022/3/2 14:58
* @Description 客户端设备服务接口
*/
public interface ImClientDeviceService extends BaseService<ImClientDevice> {
/**
* 清除旧token
* @param appId
* @param deviceToken
* @return
*/
int removeOldToken(Long appId, String deviceToken);
}
......@@ -6,7 +6,8 @@ import com.wecloud.im.param.GetClientInfoParam;
import com.wecloud.im.param.ImClientPageParam;
import com.wecloud.im.param.ImClientQueryVo;
import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.param.add.ImClientDeviceInfoAdd;
import com.wecloud.im.param.LogoutParam;
import com.wecloud.im.param.add.ClientDeviceUpdateParam;
import com.wecloud.im.param.add.ImClientHeadPortraitAdd;
import com.wecloud.im.param.add.ImClientHeadPortraitAndNicknameUpdate;
import com.wecloud.im.param.add.ImClientNicknameAdd;
......@@ -17,7 +18,6 @@ import com.wecloud.im.vo.MyInfoVo;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.service.BaseService;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
......@@ -86,9 +86,14 @@ public interface ImClientService extends BaseService<ImClient> {
* @param imClientDevice
* @return
*/
boolean updateDeviceInfo(ImClientDeviceInfoAdd imClientDevice);
boolean updateDeviceInfo(ClientDeviceUpdateParam imClientDevice);
boolean logout();
/**
* 登出操作
* @param param
* @return
*/
boolean logout(LogoutParam param);
/**
......@@ -110,15 +115,6 @@ public interface ImClientService extends BaseService<ImClient> {
boolean deleteImClient(Long id) throws Exception;
/**
* 移除旧的设备token
*
* @param appId
* @param deviceToken
* @return
*/
int removeOldToken(Long appId, String deviceToken);
/**
* 获取分页对象
*
* @param imClientPageParam
......@@ -133,7 +129,7 @@ public interface ImClientService extends BaseService<ImClient> {
*
* @return
*/
ImClient getCurentClient();
ImClient getCurrentClient();
ImClient getCacheImClient(Long applicationId, String clientId);
......
......@@ -74,11 +74,11 @@ public interface ImMessageService extends BaseService<ImMessage> {
/**
* 查询某个会话历史消息分页列表
*
* @param imHistoryMessagePageParam
* @param param
* @return
* @throws Exception
*/
Paging<OfflineMsgDto> getHistoryMsgConversationId(ImHistoryMessagePageParam imHistoryMessagePageParam);
Paging<OfflineMsgDto> getHistoryMsgConversationId(ImHistoryMessagePageParam param);
/**
* 查询用户所有离线消息
......
......@@ -52,7 +52,7 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> addImClientBlacklist(ImClientBlacklistUpdate imClientBlacklistUpdate) throws Exception {
ImClient client = imClientService.getCurentClient();
ImClient client = imClientService.getCurrentClient();
if (client == null) {
throw new BusinessException("当前用户登录信息失效");
}
......@@ -77,7 +77,7 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl
@Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> removeImClientBlacklist(ImClientBlacklistUpdate imClientBlacklistUpdate) throws Exception {
// 操作者
ImClient client = imClientService.getCurentClient();
ImClient client = imClientService.getCurrentClient();
if (client == null) {
throw new BusinessException("当前用户登录信息失效");
}
......@@ -100,9 +100,9 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl
Page<ImClientBlacklistQueryVo> page = new PageInfo<>(imClientBlacklistPageParam);
ImClient client = imClientService.getCurentClient();
ImClient client = imClientService.getCurrentClient();
IPage<ImClientBlacklistQueryVo> imClientBlacklistPageList = imClientBlacklistMapper.getImClientBlacklistPageList(page, client.getId());
IPage<ImClientBlacklistQueryVo> imClientBlacklistPageList = imClientBlacklistMapper.getImClientBlacklistPageList(page, client.getClientId());
Paging<ImClientBlacklistQueryVo> imClientBlacklistQueryVoPaging = new Paging<>(imClientBlacklistPageList);
......
package com.wecloud.im.service.impl;
import com.wecloud.im.entity.ImClientDevice;
import com.wecloud.im.mapper.ImClientDeviceMapper;
import com.wecloud.im.service.ImClientDeviceService;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Author wenzhida
* @Date 2022/3/2 15:00
* @Description 客户端设备服务接口实现
*/
@Slf4j
@Service
public class ImClientDeviceServiceImpl extends BaseServiceImpl<ImClientDeviceMapper, ImClientDevice> implements ImClientDeviceService {
@Autowired
private ImClientDeviceMapper imClientDeviceMapper;
@Override
public int removeOldToken(Long appId, String deviceToken) {
return imClientDeviceMapper.removeOldToken(appId, deviceToken);
}
}
package com.wecloud.im.service.impl;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.crypto.digest.MD5;
import com.alibaba.nacos.api.exception.NacosException;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
......@@ -12,6 +11,7 @@ import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientLoginService;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.vo.TokenVo;
import com.wecloud.utils.SnowflakeUtil;
import io.geekidea.springbootplus.config.properties.JwtProperties;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
......@@ -91,7 +91,7 @@ public class ImClientLoginServiceImpl implements ImClientLoginService {
if (imClient == null) {
log.info("client不存在,先走注册流程");
imClient = new ImClient();
imClient.setId(new Snowflake(1L, 1L).nextId());
imClient.setId(SnowflakeUtil.getId());
imClient.setFkAppid(imApplication.getId());
imClient.setClientId(imTokenVerify.getClientId());
imClientService.save(imClient);
......
......@@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImClientBlacklist;
import com.wecloud.im.entity.ImClientDevice;
import com.wecloud.im.enums.FriendStateEnum;
import com.wecloud.im.enums.RelationEnum;
import com.wecloud.im.friend.entity.ImFriend;
......@@ -19,17 +19,20 @@ import com.wecloud.im.param.GetClientInfoParam;
import com.wecloud.im.param.ImClientPageParam;
import com.wecloud.im.param.ImClientQueryVo;
import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.param.add.ImClientDeviceInfoAdd;
import com.wecloud.im.param.LogoutParam;
import com.wecloud.im.param.add.ClientDeviceUpdateParam;
import com.wecloud.im.param.add.ImClientHeadPortraitAdd;
import com.wecloud.im.param.add.ImClientHeadPortraitAndNicknameUpdate;
import com.wecloud.im.param.add.ImClientNicknameAdd;
import com.wecloud.im.param.add.ImClientNicknameUpdate;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientBlacklistService;
import com.wecloud.im.service.ImClientDeviceService;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.vo.ClientInfoVo;
import com.wecloud.im.vo.GetInfoListVo;
import com.wecloud.im.vo.MyInfoVo;
import com.wecloud.utils.SnowflakeUtil;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
......@@ -47,7 +50,7 @@ import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
/**
......@@ -73,10 +76,13 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Autowired
private ImClientBlacklistService imClientBlacklistService;
@Autowired
private ImClientDeviceService imClientDeviceService;
@Override
public MyInfoVo getMyInfo() {
ImClient currentClient = this.getCurentClient();
ImClient currentClient = this.getCurrentClient();
if (currentClient == null) {
throw new BusinessException("当前用户登录信息失效");
}
......@@ -88,7 +94,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updateHeadPortrait(ImClientHeadPortraitAdd imClientHeadPortraitAdd) {
ImClient curentClient = getCurentClient();
ImClient curentClient = getCurrentClient();
curentClient.setHeadPortrait(imClientHeadPortraitAdd.getHeadPortrait());
imClientMapper.updateById(curentClient);
......@@ -100,7 +106,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Override
public boolean updateNickname(ImClientNicknameUpdate imClientNicknameUpdate) {
ImClient curentClient = getCurentClient();
ImClient curentClient = getCurrentClient();
curentClient.setNickname(imClientNicknameUpdate.getNickname());
imClientMapper.updateById(curentClient);
......@@ -112,7 +118,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Override
public boolean updateHeadAndNickname(ImClientHeadPortraitAndNicknameUpdate imClientHeadPortraitAndNicknameUpdate) {
ImClient curentClient = getCurentClient();
ImClient curentClient = getCurrentClient();
curentClient.setHeadPortrait(imClientHeadPortraitAndNicknameUpdate.getHeadPortrait());
curentClient.setNickname(imClientHeadPortraitAndNicknameUpdate.getNickname());
imClientMapper.updateById(curentClient);
......@@ -125,7 +131,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Override
public ApiResult<List<GetInfoListVo>> getInfoList(GetClientInfoParam getClientInfoParam) throws Exception {
ImClient curentClient = getCurentClient();
ImClient curentClient = getCurrentClient();
if (getClientInfoParam.getClientIds() == null || getClientInfoParam.getClientIds().isEmpty()) {
throw new BusinessException("getClientInfoParam.getClientIds() == null");
......@@ -154,7 +160,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Override
public ClientInfoVo getClientInfo(ClientInfoParam param) {
ImClient currentClient = this.getCurentClient();
ImClient currentClient = this.getCurrentClient();
if (currentClient == null) {
throw new BusinessException("当前用户登录信息失效");
}
......@@ -186,13 +192,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updateNickname(ImClientNicknameAdd imClientNicknameAdd) throws Exception {
ImClient curentClient = getCurentClient();
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken();
// 根据appKey查询appid
// ImApplication imApplication = imApplicationService.getOneByAppKey(curentJwtToken.getAppKey());
ImClient curentClient = getCurrentClient();
curentClient.setNickname(imClientNicknameAdd.getNickname());
imClientMapper.updateById(curentClient);
......@@ -211,52 +211,48 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updateDeviceInfo(ImClientDeviceInfoAdd imClientDevice) {
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken();
// 根据appKey查询appid
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey());
public boolean updateDeviceInfo(ClientDeviceUpdateParam param) {
ImClient currentClient = getCurrentClient();
// 清除旧client的redis缓存
ImClient imClient = this.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getDeviceToken, imClientDevice.getDeviceToken()));
if (imClient != null) {
deleteCacheImClient(imClient.getFkAppid(), imClient.getClientId());
ImClientDevice clientDevice = imClientDeviceService.getOne(new QueryWrapper<ImClientDevice>().lambda()
.eq(ImClientDevice::getFkAppid, currentClient.getFkAppid())
.eq(ImClientDevice::getDeviceToken, param.getDeviceToken()));
if (clientDevice != null) {
// client登陆的时候 判断数据库内是否已经存在这个设备token,如果存在就清空旧的
this.removeOldToken(imApplication.getId(), curentJwtToken.getToken());
JwtToken currentJwtToken = JwtUtil.getCurrentJwtToken();
imClientDeviceService.removeOldToken(currentClient.getId(), currentJwtToken.getToken());
}
ImClient client = getCurentClient();
ImClient clientNew = new ImClient();
BeanUtils.copyProperties(imClientDevice, clientNew);
clientNew.setId(client.getId());
// 清除新client的redis缓存
deleteCacheImClient(client.getFkAppid(), client.getClientId());
// 修改
return this.updateImClient(clientNew);
ImClientDevice clientDeviceToUpdate = imClientDeviceService.getOne(new QueryWrapper<ImClientDevice>().lambda()
.eq(ImClientDevice::getFkAppid, currentClient.getFkAppid())
.eq(ImClientDevice::getFkClientId, currentClient.getId())
.eq(ImClientDevice::getDeviceType, param.getDeviceType())
);
if (clientDeviceToUpdate == null) {
ImClientDevice imClientDevice = new ImClientDevice();
imClientDevice.setId(SnowflakeUtil.getId());
imClientDevice.setFkAppid(currentClient.getFkAppid());
imClientDevice.setFkClientId(currentClient.getId());
imClientDevice.setValid(1);
imClientDevice.setDeviceType(param.getDeviceType());
imClientDevice.setCreateTime(new Date());
imClientDevice.setUpdateTime(new Date());
imClientDeviceService.save(imClientDevice);
} else {
clientDeviceToUpdate.setDeviceToken(param.getDeviceToken());
imClientDeviceService.updateById(clientDeviceToUpdate);
}
return true;
}
@Override
public boolean logout() {
ImClient curentClient = getCurentClient();
public boolean logout(LogoutParam param) {
ImClient currentClient = getCurrentClient();
// 清除设备token
boolean update = this.update(new UpdateWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, curentClient.getFkAppid())
.eq(ImClient::getId, curentClient.getId())
.set(ImClient::getDeviceToken, null)
);
if (update) {
// 清除新client的redis缓存
deleteCacheImClient(curentClient.getFkAppid(), curentClient.getClientId());
}
return update;
return imClientDeviceService.update(new UpdateWrapper<ImClientDevice>().lambda()
.eq(ImClientDevice::getFkAppid, currentClient.getFkAppid())
.eq(ImClientDevice::getFkClientId, currentClient.getId())
.eq(ImClientDevice::getDeviceType, param.getDeviceType())
.set(ImClientDevice::getDeviceToken, null));
}
@Transactional(rollbackFor = Exception.class)
......@@ -270,13 +266,6 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
return super.removeById(id);
}
@Transactional(rollbackFor = Exception.class)
@Override
public int removeOldToken(Long appId, String deviceToken) {
return imClientMapper.removeOldToken(appId, deviceToken);
}
@Override
public Paging<ImClientQueryVo> getImClientPageList(ImClientPageParam imClientPageParam) throws Exception {
Page<ImClientQueryVo> page = new PageInfo<>(imClientPageParam, OrderItem.desc(getLambdaColumn(ImClient::getCreateTime)));
......@@ -285,10 +274,10 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
}
@Override
public ImClient getCurentClient() {
public ImClient getCurrentClient() {
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken();
JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken();
// 根据appKey查询appid
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey());
return getCacheImClient(imApplication.getId(), curentJwtToken.getClientId());
......
......@@ -84,11 +84,11 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa
public ApiResult<Boolean> saveOrUpdateClientRemarkName(ImConvMemeClientRemarkNameParam imConvMemeClientRemarkNameParam) {
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken();
JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken();
// 根据appKey查询application
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey());
ImClient imClientSender = imClientService.getCurentClient();
ImClient imClientSender = imClientService.getCurrentClient();
// 查询该成员
ImConversationMembers imConversationMember = imConversationMembersService.getOne(
......@@ -138,11 +138,11 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa
public ApiResult<Boolean> saveOrUpdateAttr(ImConversationMemAttrUpdate imConversationMemAttrUpdate) {
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken();
JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken();
// 根据appKey查询application
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey());
ImClient imClientSender = imClientService.getCurentClient();
ImClient imClientSender = imClientService.getCurrentClient();
// 查询该成员
ImConversationMembers imConversationMember = imConversationMembersService.getOne(
......
......@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversation;
......@@ -14,7 +15,6 @@ import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.entity.ImMessageOnlineSend;
import com.wecloud.im.enums.ChatTypeEnum;
import com.wecloud.im.enums.GroupRoleEnum;
import com.wecloud.im.enums.MutedEnum;
import com.wecloud.im.mapper.ImConversationMapper;
import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.param.ListConversationMembersParam;
......@@ -59,7 +59,6 @@ import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
......@@ -111,7 +110,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResult<ImConversationCreateVo> createImConversation(ImConversationCreate imConversationCreate) {
ImClient createClient = imClientService.getCurentClient();
ImClient createClient = imClientService.getCurrentClient();
if (CollectionUtils.isEmpty(imConversationCreate.getClientIds())) {
log.info("未找到群成员信息");
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
......@@ -133,7 +132,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
}
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken();
JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken();
// 根据appKey查询application
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey());
......@@ -179,7 +178,6 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
return ApiResult.ok(imConversationCreateVo);
}
}
}
// 会话id
......@@ -221,17 +219,37 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
ImClient client2 = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, createClient.getFkAppid())
.eq(ImClient::getClientId, id));
Long imConversationMembersId2 = SnowflakeUtil.getId();
ImConversationMembers imConversationMembers2 = new ImConversationMembers();
imConversationMembers2.setId(imConversationMembersId2);
imConversationMembers2.setId(SnowflakeUtil.getId());
imConversationMembers2.setCreateTime(new Date());
imConversationMembers2.setFkAppid(createClient.getFkAppid());
imConversationMembers2.setFkConversationId(imConversationId);
imConversationMembers2.setFkClientId(client2.getId());
imConversationMembers2.setRole(GroupRoleEnum.NORMAL.getCode());
imConversationMembersService.save(imConversationMembers2);
if (imConversationCreate.getClientIds().size() > 1) {
// 给被拉入群的成员下发事件消息 -- 单聊则不下发
ImMessage imMessage = new ImMessage();
Map<String, Object> content = Maps.newHashMap();
content.put("operator", createClient.getClientId()); //操作的client ID
content.put("passivityOperator", client2.getClientId()); //被操作的client ID
imMessage.setContent(JsonUtils.encodeJson(content));
// 保存消息至消息表
imMessage.setId(SnowflakeUtil.getId());
imMessage.setMsgType(MsgTypeEnum.CLIENT_JOIN_NEW_CONVERSATION.getUriCode());
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(imApplication.getId());
imMessage.setSender(createClient.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystemFlag(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(imConversation.getId());
imMessageService.save(imMessage);
sendEventMsgToMember(imApplication, client2.getId(), imMessage, createClient);
}
}
ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo();
imConversationCreateVo.setId(imConversationId);
......@@ -243,11 +261,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
public ApiResult<Boolean> addClientToConversation(ImClientToConversation imClientToConversation) {
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken();
JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken();
// 根据appKey查询application
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey());
ImClient imClientSender = imClientService.getCurentClient();
ImClient imClientSender = imClientService.getCurrentClient();
// 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list(
......@@ -323,10 +341,10 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 遍历发送给已在群内的成员
for (ImConversationMembers conversationMember : membersList) {
sendEventMsgToMember(imApplication, conversationMember.getFkClientId(), imMessage, imClientSender, clientToConversation);
sendEventMsgToMember(imApplication, conversationMember.getFkClientId(), imMessage, imClientSender);
}
// 发送给刚被拉入群的成员
sendEventMsgToMember(imApplication, clientToConversation.getId(), imMessage, imClientSender, clientToConversation);
sendEventMsgToMember(imApplication, clientToConversation.getId(), imMessage, imClientSender);
}
// 将群成员数量减
......@@ -342,7 +360,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
}
private void sendEventMsgToMember(ImApplication imApplication, Long conversationMemberClientId, ImMessage imMessage,
ImClient clientSender, ImClient clientToConversation) {
ImClient clientSender) {
// 查询接收方
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId())
......@@ -354,6 +372,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(imMessage.getId());
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(imMessage.getMsgType());
imMessageOnlineSend.setSender(clientSender.getClientId());
imMessageOnlineSend.setContent(JsonUtils.decodeJson2Map(imMessage.getContent()));
......@@ -377,11 +396,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
public ApiResult<Boolean> delClientToConversation(ImClientToConversation imClientToConversation) throws Exception {
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken();
JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken();
// 根据appKey查询application
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey());
ImClient imClientSender = imClientService.getCurentClient();
ImClient imClientSender = imClientService.getCurrentClient();
// 判断是否为群主
ImConversationMembers conversationMember = imConversationMembersService.getOne(
......@@ -464,6 +483,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(messageId);
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(imMessage.getMsgType());
imMessageOnlineSend.setSender(imClientSender.getClientId());
imMessageOnlineSend.setContent(content);
......@@ -493,17 +513,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> leaveConversation(ImClientLeaveConversation imClientToConversation) throws Exception {
ImClient currentClient = imClientService.getCurrentClient();
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken();
// 根据appKey查询application
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey());
ImClient imClientSender = imClientService.getCurentClient();
ImConversation imConversationById = imConversationService.getById(imClientToConversation.getConversationId());
if (imConversationById == null) {
throw new BusinessException("查无应用消息");
ImConversation imConversation = imConversationService.getById(imClientToConversation.getConversationId());
if (imConversation == null) {
throw new BusinessException("查无会话消息");
}
// 查询该会话所有成员
......@@ -511,7 +525,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId())
.orderByAsc(ImConversationMembers::getCreateTime)
.notIn(ImConversationMembers::getFkClientId, imClientSender.getId())
.notIn(ImConversationMembers::getFkClientId, currentClient.getId())
);
if (membersList.isEmpty()) {
......@@ -521,9 +535,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 判断用户是否在该会话
ImConversationMembers members = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkAppid, imApplication.getId())
.eq(ImConversationMembers::getFkAppid, currentClient.getFkAppid())
.eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId())
.eq(ImConversationMembers::getFkClientId, imClientSender.getId())
.eq(ImConversationMembers::getFkClientId, currentClient.getId())
);
// 将client从会话移除
......@@ -533,7 +547,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
}
// 将群成员数量减1
imConversationMapper.addMemberCount(imApplication.getId(), imClientToConversation.getConversationId(), -1);
imConversationMapper.addMemberCount(currentClient.getFkAppid(), imClientToConversation.getConversationId(), -1);
// ws 退出事件通知给群内其他人 ----------
......@@ -546,8 +560,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imMessage.setId(messageId);
imMessage.setMsgType(MsgTypeEnum.LEAVE_CONVERSATION.getUriCode());
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(imApplication.getId());
imMessage.setSender(imClientSender.getId());
imMessage.setFkAppid(currentClient.getFkAppid());
imMessage.setSender(currentClient.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystemFlag(false);
......@@ -563,7 +577,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 查询接收方
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getFkAppid, currentClient.getFkAppid())
.eq(ImClient::getId, conversationMembers.getFkClientId()));
if (imClientReceiver == null) {
continue;
......@@ -573,8 +587,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(messageId);
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(MsgTypeEnum.LEAVE_CONVERSATION.getUriCode());
imMessageOnlineSend.setSender(imClientSender.getClientId());
imMessageOnlineSend.setSender(currentClient.getClientId());
imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId());
imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
......@@ -611,10 +626,10 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Transactional(rollbackFor = Exception.class)
public Boolean transferOwner(TransferOwnerParam param) {
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken();
JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken();
// 根据appKey查询application
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey());
ImClient imClientSender = imClientService.getCurentClient();
ImClient imClientSender = imClientService.getCurrentClient();
// 判断操作人是否为群主
ImConversationMembers currentMember = imConversationMembersService.getOne(
......@@ -647,7 +662,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
*/
@Override
public Boolean setAdmins(SetAdminsParam param) {
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
// 判断操作人是否为群主
ImConversationMembers currentMember = imConversationMembersService.getOne(
new QueryWrapper<ImConversationMembers>().lambda()
......@@ -675,7 +690,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
*/
@Override
public Boolean mutedGroup(MutedGroupParam param) {
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
if (!imConversationService.isBelongToRole(currentClient.getClientId(), param.getConversationId(),
Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) {
// 当前操作人不属于群主或管理人员
......@@ -692,7 +707,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override
public Boolean mutedGroupMember(MutedGroupParam param) {
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
if (!imConversationService.isBelongToRole(currentClient.getClientId(), param.getConversationId(),
Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) {
// 当前操作人不属于群主或管理人员
......@@ -744,11 +759,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
public ApiResult<Boolean> saveOrUpdateName(ImConversationNameUpdate imConversationNameUpdate) throws Exception {
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken();
JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken();
// 根据appKey查询application
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey());
ImClient imClientSender = imClientService.getCurentClient();
ImClient imClientSender = imClientService.getCurrentClient();
ImConversation imConversationById = imConversationService.getById(imConversationNameUpdate.getConversationId());
......@@ -777,10 +792,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 内容
HashMap<String, String> content = new HashMap<>();
content.put("type", "-1015");
content.put("name", imConversationById.getName());
// 遍历发送
for (ImConversationMembers conversationMembers : membersList) {
......@@ -797,6 +810,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// imMessageOnlineSend.setMsgId(null);
// imMessageOnlineSend.setSender(imClientSender.getClientId());
imMessageOnlineSend.setType(MsgTypeEnum.CONVERSATION_NAME_CHANGE.getUriCode());
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId());
// imMessageOnlineSend.setWithdraw(Boolean.FALSE);
......@@ -827,11 +842,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
public ApiResult<Boolean> saveOrUpdateAttr(ImConversationAttrUpdate imConversationAttrUpdate) throws Exception {
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken();
JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken();
// 根据appKey查询application
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey());
ImClient imClientSender = imClientService.getCurentClient();
ImClient imClientSender = imClientService.getCurrentClient();
ImConversation imConversationById = imConversationService.getById(imConversationAttrUpdate.getConversationId());
// 判断是否为群主
......@@ -862,7 +877,6 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 内容
HashMap<String, String> content = new HashMap<>();
content.put("type", "-1014");
content.put("attributes", imConversationById.getAttributes());
......@@ -882,7 +896,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// imMessageOnlineSend.setMsgId(null);
// imMessageOnlineSend.setSender(imClientSender.getClientId());
imMessageOnlineSend.setType(MsgTypeEnum.CONVERSATION_EXPAND_FIELD_CHANGE.getUriCode());
imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId());
// imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
......@@ -923,7 +939,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Transactional(rollbackFor = Exception.class)
@Override
public boolean updateDisplayConversation(ImConversationDisplayUpdate imConversationDisplayUpdate) {
ImClient curentClient = imClientService.getCurentClient();
ImClient curentClient = imClientService.getCurrentClient();
for (Long id : imConversationDisplayUpdate.getConversationIds()) {
// 修改为删除隐藏状态
boolean update = imConversationMembersService.update(new UpdateWrapper<ImConversationMembers>()
......@@ -957,7 +973,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override
public List<ConversationVo> getMyImConversationListAndMsgCount() throws Exception {
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
// 查询用户加入的所有会话 与每个会话的未读条数 成员
List<ConversationVo> myImConversationListAndMsgCount = imConversationMapper.getMyImConversationListAndMsgCount(currentClient.getId(), null);
......@@ -983,7 +999,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override
public ConversationVo infoImConversationAndMsgCount(ImConversationQueryParam param) throws Exception {
ImClient client = imClientService.getCurentClient();
ImClient client = imClientService.getCurrentClient();
// 查询用户加入的所有会话 与每个会话的未读条数 成员
List<ConversationVo> conversationList = imConversationMapper.getMyImConversationListAndMsgCount(client.getId(), param.getId());
if (CollectionUtils.isEmpty(conversationList)) {
......@@ -1001,7 +1017,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override
public List<ImConversation> getMyImConversationList() throws Exception {
ImClient client = imClientService.getCurentClient();
ImClient client = imClientService.getCurrentClient();
return imConversationMapper.getMyImConversationList(client.getId());
}
......
......@@ -95,7 +95,7 @@ public class ImInboxServiceImpl extends BaseServiceImpl<ImInboxMapper, ImInbox>
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> updateImMsgReceived(ImMsgReceivedStatusUpdate imMsgReceivedUpdate) {
ImClient curentClient = imClientService.getCurentClient();
ImClient curentClient = imClientService.getCurrentClient();
// 修改已接收状态
Long aLong = imInboxMapper.updateImMsgReceivedByIds(curentClient.getId(), imMsgReceivedUpdate.getMsgIds());
......@@ -136,7 +136,7 @@ public class ImInboxServiceImpl extends BaseServiceImpl<ImInboxMapper, ImInbox>
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> updateImMsgRead(MsgReadStatusUpdateParam msgReadStatusUpdateParam) {
ImClient curentClient = imClientService.getCurentClient();
ImClient curentClient = imClientService.getCurrentClient();
// 修改已读状态
Long aLong = imInboxMapper.updateImMsgReadByIds(curentClient.getId(), msgReadStatusUpdateParam.getMsgIds());
......@@ -155,7 +155,7 @@ public class ImInboxServiceImpl extends BaseServiceImpl<ImInboxMapper, ImInbox>
@Override
public Boolean updateMsgReadStatusByConversation(MsgReadStatusUpdateParam msgReadStatusUpdateParam) {
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
// 获取该用户该会话所有未读消息 msgId 列表
List<ImInbox> imInboxList = this.list(new QueryWrapper<ImInbox>().lambda()
.eq(ImInbox::getFkConversationId, msgReadStatusUpdateParam.getConversationId())
......@@ -219,6 +219,7 @@ public class ImInboxServiceImpl extends BaseServiceImpl<ImInboxMapper, ImInbox>
BeanUtils.copyProperties(imMessage, imMessageOnlineSend);
imMessageOnlineSend.setType(msgTypeEnum.getUriCode());
imMessageOnlineSend.setMsgId(imMessage.getId());
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setSender(curentClient.getClientId());
imMessageOnlineSend.setContent(contentMap);
imMessageOnlineSend.setConversationId(conversationMember.getFkConversationId());
......
......@@ -16,6 +16,7 @@ import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.entity.ImMessageOnlineSend;
import com.wecloud.im.enums.ChatTypeEnum;
import com.wecloud.im.mapper.ImMessageMapper;
import com.wecloud.im.mq.MqSender;
import com.wecloud.im.param.ChatContentVo;
import com.wecloud.im.param.GetReadersParam;
import com.wecloud.im.param.ImClientSimpleDto;
......@@ -40,8 +41,9 @@ import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.model.request.PushVO;
import com.wecloud.im.ws.model.request.ReceiveDataVO;
import com.wecloud.im.ws.model.request.ReceiveVO;
import com.wecloud.im.ws.sender.AsyncPush;
import com.wecloud.im.ws.sender.ChannelSender;
import com.wecloud.pushserver.client.model.constant.MqConstant;
import com.wecloud.pushserver.client.model.dto.PushDTO;
import com.wecloud.utils.JsonUtils;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
......@@ -58,7 +60,6 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -82,9 +83,6 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
private ImConversationService imConversationService;
@Autowired
private AsyncPush asyncPush;
@Autowired
private ImApplicationService imApplicationService;
......@@ -97,6 +95,9 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
@Autowired
private ThousandChatService thousandChatService;
@Autowired
private MqSender mqSender;
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> restApiImMessageSend(ImMsgSendToOnlineClient imMsgSendToOnlineClient, ImApplication imApplication) {
......@@ -208,7 +209,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
imClientSender = imClientService.getCacheImClient(request.getSenderClientId());
imApplication = imApplicationService.getCacheById(imClientSender.getFkAppid());
} else {
imClientSender = imClientService.getCurentClient();
imClientSender = imClientService.getCurrentClient();
// 查询imApplication
imApplication = imApplicationService.getCacheById(imClientSender.getFkAppid());
}
......@@ -278,6 +279,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
BeanUtils.copyProperties(messageById, imMessageOnlineSend);
imMessageOnlineSend.setType(MsgTypeEnum.MSG_WITHDRAW.getUriCode());
imMessageOnlineSend.setMsgId(messageById.getId());
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setSender(imClientSender.getClientId());
Map<String, Object> contentMap = Maps.newHashMap();
contentMap.put("msgOwner", msgOwner.getClientId());
......@@ -296,11 +298,11 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
responseModel.setReqId(null);
channelSender.sendMsg(responseModel, imClientReceiver.getId());
// 获取自定义推送字段
PushVO pushVO = imMsgRecall.getPush();
// 异步推送系统通知消息
asyncPush.push(pushVO, imClientReceiver, imApplication);
PushDTO pushDTO = mqSender.buildPushDto(imMsgRecall.getPush(), imClientReceiver, imApplication);
if (pushDTO != null) {
mqSender.orderSend(MqConstant.Topic.IM_ORDER_MSG_TOPIC, MqConstant.Tag.IM_ORDER_MSG_TAG, pushDTO);
}
}
return Boolean.TRUE;
......@@ -318,7 +320,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
imClientSender = imClientService.getCacheImClient(request.getSenderClientId());
imApplication = imApplicationService.getCacheById(imClientSender.getFkAppid());
} else {
imClientSender = imClientService.getCurentClient();
imClientSender = imClientService.getCurrentClient();
// 查询imApplication
imApplication = imApplicationService.getCacheById(imClientSender.getFkAppid());
}
......@@ -389,6 +391,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
BeanUtils.copyProperties(message, imMessageOnlineSend);
imMessageOnlineSend.setType(MsgTypeEnum.MSG_DELETE.getUriCode());
imMessageOnlineSend.setMsgId(message.getId());
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setSender(imClientSender.getClientId());
Map<String, Object> contentMap = Maps.newHashMap();
contentMap.put("msgOwner", msgOwner.getClientId());
......@@ -459,7 +462,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
if (request != null) {
imClientSender = imClientService.getCacheImClient(request.getSenderClientId());
} else {
imClientSender = imClientService.getCurentClient();
imClientSender = imClientService.getCurrentClient();
}
if (imClientSender == null) {
throw new BusinessException("查无发送用户信息");
......@@ -484,10 +487,11 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
}
@Override
public Paging<OfflineMsgDto> getHistoryMsgConversationId(ImHistoryMessagePageParam imHistoryMessagePageParam) {
Page<ImMessage> page = new PageInfo<>(imHistoryMessagePageParam, OrderItem.desc(getLambdaColumn(ImMessage::getCreateTime)));
IPage<OfflineMsgDto> iPage = imMessageMapper.getHistoryMsgConversationId(page, imHistoryMessagePageParam);
public Paging<OfflineMsgDto> getHistoryMsgConversationId(ImHistoryMessagePageParam param) {
Page<ImMessage> page = new PageInfo<>(param, OrderItem.desc(getLambdaColumn(ImMessage::getCreateTime)));
ImClient currentClient = imClientService.getCurrentClient();
param.setCurrentFkClientId(currentClient.getId());
IPage<OfflineMsgDto> iPage = imMessageMapper.getHistoryMsgConversationId(page, param);
return new Paging<>(iPage);
}
......@@ -505,7 +509,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
// 返回数据
List<ImMessageOfflineListVo> imMessageOfflineListVoList = new ArrayList<>();
ImClient client = imClientService.getCurentClient();
ImClient client = imClientService.getCurrentClient();
// 获取加入的所有会话
List<ImConversation> myImConversationList = imConversationService.getMyImConversationList();
......
......@@ -9,6 +9,7 @@ import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.entity.ImMessageOnlineSend;
import com.wecloud.im.mq.MqSender;
import com.wecloud.im.param.ChatContentVo;
import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.param.ImConversationQueryVo;
......@@ -21,8 +22,9 @@ import com.wecloud.im.service.ImMessageService;
import com.wecloud.im.thousandchat.cache.ThousandChatCacheManager;
import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.sender.AsyncPush;
import com.wecloud.im.ws.sender.ChannelSender;
import com.wecloud.pushserver.client.model.constant.MqConstant;
import com.wecloud.pushserver.client.model.dto.PushDTO;
import com.wecloud.utils.JsonUtils;
import com.wecloud.utils.SnowflakeUtil;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
......@@ -54,8 +56,6 @@ public class ThousandChatAction {
@Autowired
private ImConversationService imConversationService;
@Autowired
private AsyncPush systemPush;
@Autowired
private ImConversationMembersService imConversationMembersService;
@Autowired
private ImMessageService imMessageService;
......@@ -64,6 +64,9 @@ public class ThousandChatAction {
@Autowired
private ThousandChatCacheManager thousandChatCacheManager;
@Autowired
private MqSender mqSender;
@ActionMapping("/thousand/send")
public void sendMsg(ActionRequest request, ChatContentVo data, String reqId) {
if (log.isDebugEnabled()) {
......@@ -117,7 +120,10 @@ public class ThousandChatAction {
continue;
}
// 异步推送系统通知消息
systemPush.push(data.getPush(), imClientReceiver, imApplication);
PushDTO pushDTO = mqSender.buildPushDto(data.getPush(), imClientReceiver, imApplication);
if (pushDTO != null) {
mqSender.orderSend(MqConstant.Topic.IM_ORDER_MSG_TOPIC, MqConstant.Tag.IM_ORDER_MSG_TAG, pushDTO);
}
}
// 响应发送方消息id等信息
......
......@@ -11,8 +11,4 @@ import lombok.Data;
@Data
public class ThousandOffineMsgDto extends OfflineMsgDto {
/**
* 会话id
*/
private Long conversationId;
}
......@@ -65,7 +65,7 @@ public class ThousandChatService extends BaseServiceImpl<ImMsgReadLastestMapper,
* @return
*/
public ApiResult<Boolean> updateImMsgReceived(LastestReceivedMsg lastestReceivedMsg) {
ImClient curentClient = imClientService.getCurentClient();
ImClient curentClient = imClientService.getCurrentClient();
ImMessage lastestMsg = imMessageService.getById(lastestReceivedMsg.getLastestMsgId());
......@@ -105,7 +105,7 @@ public class ThousandChatService extends BaseServiceImpl<ImMsgReadLastestMapper,
* @return
*/
public ApiResult<Boolean> updateImMsgRead(Long lastestMsgId) {
ImClient curentClient = imClientService.getCurentClient();
ImClient curentClient = imClientService.getCurrentClient();
ImMessage lastestMsg = imMessageService.getById(lastestMsgId);
......@@ -139,7 +139,7 @@ public class ThousandChatService extends BaseServiceImpl<ImMsgReadLastestMapper,
return new ArrayList<>();
}
ImClient curentClient = imClientService.getCurentClient();
ImClient curentClient = imClientService.getCurrentClient();
List<ConversationLastestReadMsg> lastestReadMsgs = imMsgReadLastestMapper.findLastestReadMsgs(curentClient.getId());
Map<Long, ConversationLastestReadMsg> conversationMsgMap = lastestReadMsgs.stream().collect(Collectors.toMap(ConversationLastestReadMsg::getConversationId, v->v,(a,b)->a));
......
......@@ -19,14 +19,19 @@ public class ConversationMemberVo implements Serializable {
@ApiModelProperty("会话中client的备注名")
private String clientRemarkName;
@ApiModelProperty("头像")
private String headPortrait;
@ApiModelProperty("主昵称")
private String nickname;
@ApiModelProperty("clientId")
private String clientId;
@ApiModelProperty("client自己的自定义扩展属性")
private String clientAttributes;
@ApiModelProperty("会话成员列表的自定义扩展属性")
private String memberAttributes;
......
......@@ -9,13 +9,20 @@ import java.io.Serializable;
import java.util.Date;
/**
* 离线消息内容实体
* @Author wenzhida
* @Date 2022/3/3 11:19
* @Description 离线消息内容实体
*/
@Data
@Accessors(chain = true)
@ApiModel(value = "OfflineMsgDto")
public class OfflineMsgDto implements Serializable {
private static final long serialVersionUID = -7073389493201687249L;
@ApiModelProperty("会话id")
private Long conversationId;
@ApiModelProperty("消息类型")
private Integer type;
......
......@@ -46,12 +46,12 @@ public class ImConstant implements Serializable {
/**
* 您收到一条新消息
*/
public static final String PUSH_TITLE = "You have received a new message";
public static final String PUSH_TITLE = "您收到一条新消息";
/**
* 点击查看
*/
public static final String PUSH_BODY = "Click to view";
public static final String PUSH_BODY = "点击查看";
/**
* 会话id的key名
......
......@@ -60,10 +60,10 @@ public class UserStateCacheManager extends UserStateListener {
public List<ClientChannelInfo> findOnlineInfosByClientId(Long clientId) {
// 获取所有 CLIENTS的 <platform>:<ip>
Set<String> platformAndIs = redisUtils.getForSetMembers(getUserStateCacheKey(clientId));
Set<String> platformAndIps = redisUtils.getForSetMembers(getUserStateCacheKey(clientId));
ArrayList<ClientChannelInfo> clientChannelInfos = new ArrayList<>();
for(String platformAndIp : platformAndIs) {
for(String platformAndIp : platformAndIps) {
String[] split = platformAndIp.split(RedisUtils.SPLIT);
ClientChannelInfo clientChannelInfo = new ClientChannelInfo();
clientChannelInfo.setPlatform(Integer.valueOf(split[0]));
......
......@@ -29,6 +29,13 @@ public enum MsgTypeEnum {
// 成为新群主 -1013
CONVERSATION_NEW_CREATOR(-1013),
// 群拓展字段变动事件 -1014
CONVERSATION_EXPAND_FIELD_CHANGE(-1014),
// 会话名称字段变动事件 -1015
CONVERSATION_NAME_CHANGE(-1015),
// 消息撤回 -1016
MSG_WITHDRAW(-1016),
......
package com.wecloud.im.ws.sender;
import cn.hutool.core.codec.Base64;
import com.turo.pushy.apns.DeliveryPriority;
import com.turo.pushy.apns.PushType;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImIosApns;
import com.wecloud.im.push.PushUtils;
import com.wecloud.im.service.ImInboxService;
import com.wecloud.im.service.ImIosApnsService;
import com.wecloud.im.ws.model.request.PushVO;
import lombok.extern.slf4j.Slf4j;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import static com.wecloud.im.ws.ImConstant.PUSH_BODY;
import static com.wecloud.im.ws.ImConstant.PUSH_TITLE;
import static com.wecloud.im.ws.ImConstant.SUB_TITLE;
import static com.wecloud.im.ws.ImConstant.TITLE;
/**
* 异步系统推送
*/
@Component
@Slf4j
public class AsyncPush {
/**
* 谷歌推送地址
*/
private static final String API_URL_FCM = "https://fcm.googleapis.com/fcm/send";
// /**
// * 您收到一条新消息
// */
// private static final String PUSH_TITLE = "You have received a new message";
// /**
// * 点击查看
// */
// private static final String PUSH_BODY = "Click to view";
// private static final String TITLE = "title";
// private static final String SUB_TITLE = "subTitle";
@Autowired
private ImIosApnsService imIosApnsService;
@Autowired
private ImInboxService imInboxService;
/**
* 异步系统推送
*
* @param imClientReceiver
*/
@Async
public void push(PushVO pushVO, ImClient imClientReceiver, ImApplication imApplication) {
log.info("push: {}", imClientReceiver.getClientId());
if (pushVO == null) {
pushVO = new PushVO();
pushVO.setTitle(PUSH_TITLE);
pushVO.setSubTitle(PUSH_BODY);
}
// 校验参数
if (imClientReceiver.getValid() == null || imClientReceiver.getDeviceToken() == null || imClientReceiver.getDeviceType() == null) {
log.info("{} 应用未配置push,或client无DeviceToken {}", imApplication.getId(), imClientReceiver.getClientId());
return;
}
// 设备不想收到推送提醒, 1想, 0不想
if (imClientReceiver.getValid() == 0) {
return;
}
// 设备类型1:ios; 2:android
if (imClientReceiver.getDeviceType() == 1) {
ios(pushVO, imClientReceiver, imApplication);
} else {
android(pushVO, imClientReceiver, imApplication);
}
}
/**
* 异步系统推送
*
* @param imClientReceiver
*/
@Async
public void push(HashMap<String, String> pushMap, ImClient imClientReceiver, ImApplication imApplication) {
log.info("push:" + imClientReceiver.getClientId());
PushVO pushVO = new PushVO();
if (pushMap == null || pushMap.isEmpty()) {
pushVO.setTitle(PUSH_TITLE);
pushVO.setSubTitle(PUSH_BODY);
} else {
pushVO.setTitle(pushMap.get(TITLE));
pushVO.setSubTitle(pushMap.get(SUB_TITLE));
}
this.push(pushVO, imClientReceiver, imApplication);
}
private void android(PushVO pushVO, ImClient imClientReceiver, ImApplication imApplication) {
if (imApplication.getAndroidPushChannel() == null) {
return;
}
// 安卓推送通道,友盟:1;firebase:2; 信鸽3
if (imApplication.getAndroidPushChannel() == 1) {
log.info("友盟");
// 友盟推送
PushUtils pushUtils = new PushUtils(imApplication.getUmengKey(), imApplication.getUmengSecret());
// 安卓 单推
String deviceToken = imClientReceiver.getDeviceToken();
try {
pushUtils.sendIOSUnicast(deviceToken, pushVO.getTitle(), pushVO.getSubTitle(), PUSH_BODY);
} catch (Exception e) {
e.printStackTrace();
}
} else if (imApplication.getAndroidPushChannel() == 2) {
//firebase:2
log.info("android_firebase");
firebase(pushVO, imClientReceiver, imApplication);
} else if (imApplication.getAndroidPushChannel() == 3) {
// 信鸽3
log.info("信鸽3");
} else {
log.info("没有找到推送类型");
}
}
private void ios(PushVO pushVO, ImClient imClientReceiver, ImApplication imApplication) {
if (imApplication.getIosPushChannel() == null) {
return;
}
// ios推送通道,友盟:1;firebase:2; apns原生:3
if (imApplication.getIosPushChannel() == 1) {
log.info("友盟");
// 友盟推送
PushUtils pushUtils = new PushUtils(imApplication.getUmengKey(), imApplication.getUmengSecret());
// 安卓单推
String deviceToken = imClientReceiver.getDeviceToken();
String unicastText = "Android unicast text";
String unicastTicker = pushVO.getSubTitle();
try {
pushUtils.sendAndroidUnicast(deviceToken, unicastText, unicastTicker, pushVO.getTitle());
} catch (Exception e) {
e.printStackTrace();
}
} else if (imApplication.getIosPushChannel() == 2) {
//firebase:2
log.info("firebase");
firebase(pushVO, imClientReceiver, imApplication);
} else if (imApplication.getIosPushChannel() == 3) {
// apns原生:3
log.info("apns原生");
apnsPush(pushVO, imClientReceiver, imApplication);
} else {
log.info("没有找到推送类型");
}
}
public void firebase(PushVO pushVO, ImClient imClientReceiver, ImApplication imApplication) {
String jsonStr = null;
try {
URL url = new URL(API_URL_FCM);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setConnectTimeout(10000);
conn.setRequestMethod("POST");
//不设置默认发送文本格式。设置就是json
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("Authorization", "key=" + imApplication.getFirebaseSecret());
JSONObject json = new JSONObject();
//推送到哪台客户端机器
json.put("to", imClientReceiver.getDeviceToken());
JSONObject info = new JSONObject();
info.put("title", pushVO.getTitle());
info.put("body", pushVO.getSubTitle());
//数据消息data 通知消息 notification
json.put("notification", info);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
jsonStr = json.toString();
wr.write(jsonStr);
wr.flush();
InputStream inputStream = conn.getInputStream();
InputStreamReader in = new InputStreamReader(inputStream);
BufferedReader reader = new BufferedReader(in);
String line = reader.readLine();
log.info(line);
wr.close();
reader.close();
} catch (Exception e) {
log.error("FCM push failure: " + jsonStr, e);
}
}
private void apnsPush(PushVO pushVO, ImClient imClientReceiver, ImApplication imApplication) {
// 查询apns证书
ImIosApns apns = imIosApnsService.getImIosApnsByAppId(imApplication.getId());
Map<String, Object> customProperty = new HashMap<String, Object>(1);
String deviceToken = imClientReceiver.getDeviceToken();
String alertTitle = pushVO.getTitle();
String alertBody = pushVO.getSubTitle();
// 统计未读消息数量
int badge = imInboxService.countMyNotReadCount(imClientReceiver.getId());
String topicBundleId = apns.getBundleId();
String certificatePassword = apns.getPwd();
boolean contentAvailable = false;
String sound = "default";
// 解码
byte[] decode = Base64.decode(apns.getApnsFileValue());
InputStream inputStream2 = new ByteArrayInputStream(decode);
// productFlag 环境,测试=Boolean.FALSE,正式=Boolean.TRUE
Boolean productFlag = Boolean.FALSE;
// 正式1,测试0
if (apns.getEnv() == 1) {
productFlag = Boolean.TRUE;
}
IosPush.push(certificatePassword, inputStream2, productFlag, deviceToken, alertTitle, alertBody,
contentAvailable, customProperty, badge
, DeliveryPriority.IMMEDIATE, PushType.ALERT, topicBundleId,
sound);
}
}
......@@ -78,7 +78,7 @@ public class RtcServiceImpl extends UserStateListener implements RtcService {
@Override
public ApiResult<CreateRtcChannelResult> createAndCall(CreateRtcChannelParam createRtcChannelParam) throws JsonProcessingException {
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
Long rtcChannelId = SnowflakeUtil.getId();
// 判断发起方必须在线
boolean onlineStatus = userStateCacheManager.isOnline(currentClient.getId());
......@@ -116,7 +116,7 @@ public class RtcServiceImpl extends UserStateListener implements RtcService {
@Override
public ApiResult<Boolean> join(JoinRtcChannelParam joinRtcChannelParam) {
ImClient client = imClientService.getCurentClient();
ImClient client = imClientService.getCurrentClient();
// 修改缓存
mangerRtcCacheService.join(client.getId(), joinRtcChannelParam.getChannelId());
......@@ -142,7 +142,7 @@ public class RtcServiceImpl extends UserStateListener implements RtcService {
@Override
public ApiResult<Boolean> reject(RejectRtcChannelParam rejectRtcChannelParam) {
ImClient client = imClientService.getCurentClient();
ImClient client = imClientService.getCurrentClient();
// 修改缓存
mangerRtcCacheService.leave(client.getId(), rejectRtcChannelParam.getChannelId());
//获取频道内所有client
......@@ -172,7 +172,7 @@ public class RtcServiceImpl extends UserStateListener implements RtcService {
@Override
public ApiResult<Boolean> leave(LeaveRtcChannelParam leaveRtcChannelParam) {
ImClient currentClient = imClientService.getCurentClient();
ImClient currentClient = imClientService.getCurrentClient();
this.leave(leaveRtcChannelParam, currentClient);
return ApiResult.ok(true);
......@@ -209,7 +209,7 @@ public class RtcServiceImpl extends UserStateListener implements RtcService {
@Override
public ApiResult<Boolean> sdpForward(SdpForwardParam sdpForwardParam) {
ImClient client = imClientService.getCurentClient();
ImClient client = imClientService.getCurrentClient();
Long rtcChannelId = SnowflakeUtil.getId();
// 根据appKey查询appid
......@@ -250,7 +250,7 @@ public class RtcServiceImpl extends UserStateListener implements RtcService {
@Override
public ApiResult<Boolean> candidateForward(CandidateForwardParam candidateForwardParam) {
ImClient client = imClientService.getCurentClient();
ImClient client = imClientService.getCurrentClient();
Long rtcChannelId = SnowflakeUtil.getId();
// 根据appKey查询appid
......
package com.wecloud.utils;
import cn.hutool.core.lang.Snowflake;
import com.wecloud.im.ws.utils.RedisUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.SystemUtils;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.net.Inet4Address;
import java.net.UnknownHostException;
/**
* 雪花算法 获取id工具类
......@@ -15,14 +17,11 @@ import javax.annotation.PostConstruct;
@Component
public class SnowflakeUtil {
private static SnowflakeUtil snowflakeUtil;
/**
* workerId, dataCenterId动态获取
* 12位序列号部分,支持同一毫秒内同一个节点可以生成4096个ID, 在目前一段不用做成动态获取服务器ID
*/
private static volatile Snowflake SNOWFLAKE = null;
@Autowired
private RedisUtils redisUtils;
/**
* 多线程中加synchronized 保证不会获取重复id
......@@ -34,12 +33,7 @@ public class SnowflakeUtil {
if (SNOWFLAKE == null) {
synchronized (SnowflakeUtil.class) {
if (SNOWFLAKE == null) {
// workerId通过redis获取
long workerId = snowflakeUtil.redisUtils.incr("workerId", 1);
// redisUtils不需要用了,释放回收掉
snowflakeUtil.redisUtils = null;
SNOWFLAKE = new Snowflake(workerId, 1L);
SNOWFLAKE = new Snowflake(SnowflakeUtil.getWorkId(), 1L);
}
}
}
......@@ -47,11 +41,22 @@ public class SnowflakeUtil {
}
/**
* 静态方法里调用spring注入的方法
* workId通过本机ip计算获得
* @return
*/
@PostConstruct
public void init() {
snowflakeUtil = this;
snowflakeUtil.redisUtils = this.redisUtils;
private static Long getWorkId(){
try {
String hostAddress = Inet4Address.getLocalHost().getHostAddress();
int[] ints = StringUtils.toCodePoints(hostAddress);
int sums = 0;
for(int b : ints){
sums += b;
}
return (long)(sums % 32);
} catch (UnknownHostException e) {
// 如果获取失败,则使用随机数备用
return RandomUtils.nextLong(0,31);
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wecloud.im.mapper.ImClientDeviceMapper">
<update id="removeOldToken">
UPDATE im_client_device
SET device_token = NULL
WHERE device_token = #{deviceToken}
AND fk_appid = #{appId}
</update>
</mapper>
......@@ -5,14 +5,8 @@
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id
, create_time, update_time, fk_appid, attributes,client_id,device_type,valid,device_token,head_portrait,nickname
, create_time, update_time, fk_appid, attributes,client_id,head_portrait,nickname
</sql>
<update id="removeOldToken">
UPDATE im_client
SET device_token = NULL
WHERE device_token = #{deviceToken}
AND fk_appid = #{appId}
</update>
<select id="getImClientPageList" parameterType="com.wecloud.im.param.ImClientPageParam"
resultType="com.wecloud.im.param.ImClientQueryVo">
......@@ -20,6 +14,7 @@
<include refid="Base_Column_List"/>
from im_client
</select>
<select id="getInfoList" resultType="com.wecloud.im.vo.GetInfoListVo">
SELECT
......
......@@ -25,7 +25,7 @@
<select id="getApplyFriendPageList" resultType="com.wecloud.im.friend.param.ImFriendApplyDto">
select
friend.id, client.client_id as friendClientId, friend.friend_name, claimer.client_id as claimerClientId,
friend.id, client.client_id as friendClientId, friend.friend_name as friendName, claimer.client_id as claimerClientId,
friend.reject_remark, friend.request_remark, friend.state, friend.create_time
from im_friend friend inner join im_client client on friend.client_id_friend = client.client_id
inner join im_client claimer on friend.client_id_claimer = claimer.client_id
......
......@@ -63,7 +63,8 @@
im_message.system_flag,
im_message.`at`,
im_message.send_status,
im_message.`msg_type` AS 'type', im_message.fk_conversation_id,
im_message.`msg_type` AS 'type',
im_message.fk_conversation_id as conversationId,
(SELECT COUNT(id) FROM im_inbox WHERE fk_msg_id = msgId AND read_msg_status = 0) AS not_read_count,
(SELECT COUNT(id)
FROM im_inbox
......@@ -72,6 +73,7 @@
FROM `im_message`
INNER JOIN `im_client` ON `im_client`.id = `im_message`.sender
WHERE fk_conversation_id = #{param.conversationId} and im_message.is_delete = 1 and im_message.withdraw = 0
and (im_message.`event`=0 || (im_message.`event`=1 and sender != #{param.currentFkClientId} ))
<if test="param.msgIdStart != null">
AND im_message.id > #{param.msgIdStart}
</if>
......
-- 在feature-cluster 2021年12月22日之后,需要执行的的sql增量脚本
-- 在feature-cluster 2021年12月22日之后,需要执行的的sql增量脚本
......@@ -43,7 +43,7 @@ CREATE TABLE `im_friend`
`create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `friend_id`(`fk_client_id`,`fk_client_id_friend`) USING BTREE
UNIQUE KEY `friend_id`(`client_id`,`client_id_friend`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='好友表';
CREATE TABLE `im_friend_recommend`
......@@ -56,7 +56,7 @@ CREATE TABLE `im_friend_recommend`
`create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `friend_id`(fk_client_id, fk_client_id_friend) USING BTREE
UNIQUE KEY `friend_id`(client_id, client_id_friend) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='好友表';
......@@ -98,6 +98,27 @@ CREATE TABLE `im_user`
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
-- 20220302 by wenzhida
CREATE TABLE `im_client_device`
(
`id` bigint NOT NULL COMMENT '主键id',
`fk_appid` bigint DEFAULT NULL COMMENT '应用appid',
`fk_client_id` bigint NOT NULL COMMENT '客户端id',
`valid` int DEFAULT NULL COMMENT '设备不想收到推送提醒',
`device_type` int DEFAULT NULL COMMENT '设备类型1:ios; 2:android',
`device_token` varchar(300) DEFAULT NULL COMMENT '设备推送token',
`unique_device_id` varchar(50) DEFAULT NULL COMMENT '设备唯一id(由设备端生成)',
`create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_fk_client_id` (`fk_client_id`) USING BTREE,
KEY `idx_device_token_appid` (`device_token`,`fk_appid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户端设备表';
......@@ -59,7 +59,7 @@ public class JwtUtil {
*
* @return
*/
public static JwtToken getCurentJwtToken() {
public static JwtToken getCurrentJwtToken() {
JwtToken jwtToken = (JwtToken) SecurityUtils.getSubject().getPrincipal();
return jwtToken;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment