Commit e6aca3ce by 罗长华

增加PAAS平台 回调相关类

SDK增加getFriend接口
parent ae4aa1d6
...@@ -41,6 +41,7 @@ public class RestTemplateConfig { ...@@ -41,6 +41,7 @@ public class RestTemplateConfig {
factory.setReadTimeout(5000); factory.setReadTimeout(5000);
//单位为ms //单位为ms
factory.setConnectTimeout(5000); factory.setConnectTimeout(5000);
return factory; return factory;
} }
} }
...@@ -39,7 +39,7 @@ spring: ...@@ -39,7 +39,7 @@ spring:
dubbo: dubbo:
protocol: protocol:
port: 20881 port: 20882
name: dubbo name: dubbo
registry: registry:
address: nacos://localhost:8848?username=nacos&password=nacos address: nacos://localhost:8848?username=nacos&password=nacos
...@@ -58,4 +58,4 @@ load-blance: ...@@ -58,4 +58,4 @@ load-blance:
rocketmq: rocketmq:
namesrvAddr: 127.0.0.1:9876 namesrvAddr: 127.0.0.1:9876
# 生产者的组名 # 生产者的组名
producerId: im-server producerId: im-server
\ No newline at end of file
...@@ -145,6 +145,10 @@ ...@@ -145,6 +145,10 @@
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
</dependencies> </dependencies>
<!-- <build>--> <!-- <build>-->
...@@ -177,4 +181,4 @@ ...@@ -177,4 +181,4 @@
<!-- </plugins>--> <!-- </plugins>-->
<!-- </build>--> <!-- </build>-->
</project> </project>
\ No newline at end of file
...@@ -69,6 +69,12 @@ public class ImApplication extends BaseEntity implements Application { ...@@ -69,6 +69,12 @@ public class ImApplication extends BaseEntity implements Application {
@ApiModelProperty("创建会话时对比扩展字段 0不 1是") @ApiModelProperty("创建会话时对比扩展字段 0不 1是")
private Integer contrastExtendedFieldStatus; private Integer contrastExtendedFieldStatus;
@ApiModelProperty("在线状态订阅地址")
private String onlineStatusSubscribeUrl;
@ApiModelProperty("全量消息订阅地址")
private String fullMessageSubscribeUrl;
@Override @Override
public Boolean isActive() { public Boolean isActive() {
return true; return true;
......
package com.wecloud.im.event;
import org.springframework.context.ApplicationEvent;
/**
* 客户端在线状态变化事件
* @Author luozh
* @Date 2022年04月22日 09:44
* @Version 1.0
*/
public class ClientOnlineStatusChangeEvent extends ApplicationEvent {
/**
* Create a new {@code ApplicationEvent}.
* @param source the object on which the event initially occurred or with
* which the event is associated (never {@code null})
*/
public ClientOnlineStatusChangeEvent(Object source) {
super(source);
}
}
package com.wecloud.im.event;
import org.springframework.context.ApplicationEvent;
/**
* 消息发送事件
* @Author luozh
* @Date 2022年04月22日 09:40
* @Version 1.0
*/
public class ClientSendMessageEvent extends ApplicationEvent {
/**
* Create a new {@code ApplicationEvent}.
* @param source the object on which the event initially occurred or with
* which the event is associated (never {@code null})
*/
public ClientSendMessageEvent(Object source) {
super(source);
}
}
package com.wecloud.im.event.listener;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import com.wecloud.im.event.ClientOnlineStatusChangeEvent;
/**
*
* @Author luozh
* @Date 2022年04月22日 09:47
* @Version 1.0
*/
@Component
public class ClientOnlineStatusChangeListener implements ApplicationListener<ClientOnlineStatusChangeEvent> {
@Override
public void onApplicationEvent(ClientOnlineStatusChangeEvent event) {
}
}
package com.wecloud.im.event.listener;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import com.wecloud.im.event.ClientSendMessageEvent;
/**
*
* @Author luozh
* @Date 2022年04月22日 09:48
* @Version 1.0
*/
@Component
public class ClientSendMessageListener implements ApplicationListener<ClientSendMessageEvent> {
@Override
public void onApplicationEvent(ClientSendMessageEvent event) {
}
}
package com.wecloud.im.externalaccess.controller; package com.wecloud.im.externalaccess.controller;
import com.wecloud.im.friend.param.ImFriendBaseParam;
import com.wecloud.im.service.ImClientService;
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.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController; import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.geekidea.springbootplus.framework.shiro.util.SecurityUtils;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.List; import com.wecloud.im.entity.ImClient;
import com.wecloud.im.externalaccess.param.FriendDto;
import com.wecloud.im.externalaccess.service.FriendService;
import com.wecloud.im.friend.param.ImFriendBaseParam;
import com.wecloud.im.service.ImClientService;
/** /**
* @Author wenzhida * @Author wenzhida
...@@ -41,16 +47,18 @@ public class FriendController extends BaseController { ...@@ -41,16 +47,18 @@ public class FriendController extends BaseController {
@PostMapping("/info") @PostMapping("/info")
@ApiOperation(value = "查询好友信息,只有自己的好友才查得到") @ApiOperation(value = "查询好友信息,只有自己的好友才查得到")
public ApiResult<FriendDto> getFriendInfo(@RequestBody ImFriendBaseParam param) { public ApiResult<FriendDto> getFriendInfo(@RequestBody ImFriendBaseParam param) {
ImClient imClient = imClientService.getCurrentClient();
if(param == null) { if(param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
return ApiResult.ok(friendService.getFriendInfo(param)); return ApiResult.ok(friendService.getFriendInfo(imClient, param));
} }
@PostMapping("/getFriends") @PostMapping("/getFriends")
@ApiOperation(value = "全量获取好友列表") @ApiOperation(value = "全量获取好友列表")
public ApiResult<List<FriendDto>> getFriends() { public ApiResult<List<FriendDto>> getFriends() {
return ApiResult.ok(friendService.getFriends()); ImClient imClient = imClientService.getCurrentClient();
return ApiResult.ok(friendService.getFriends(imClient));
} }
/** /**
...@@ -59,7 +67,49 @@ public class FriendController extends BaseController { ...@@ -59,7 +67,49 @@ public class FriendController extends BaseController {
@PostMapping("/unsureFriends") @PostMapping("/unsureFriends")
@ApiOperation(value = "获取好友请求列表,最多只返回1000个") @ApiOperation(value = "获取好友请求列表,最多只返回1000个")
public ApiResult<List<FriendDto>> getUnsureFriends() { public ApiResult<List<FriendDto>> getUnsureFriends() {
List<FriendDto> applyFriends = friendService.getApplyFriends(); ImClient imClient = imClientService.getCurrentClient();
List<FriendDto> applyFriends = friendService.getApplyFriends(imClient);
return ApiResult.ok(applyFriends);
}
/**
* 查询好友信息,只有自己的好友才查得到 sdk
*/
@GetMapping("/sdk/info")
@ApiOperation(value = "查询好友信息,只有自己的好友才查得到")
public ApiResult<FriendDto> getFriendInfoSdk(@RequestBody ImFriendBaseParam param) {
if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
Long appId = SecurityUtils.getCurrentAppId();
ImClient imClient = imClientService.getCacheImClient(appId, param.getClientId());
return ApiResult.ok(friendService.getFriendInfo(imClient, param));
}
/**
* 全量获取好友列表 sdk使用
* @Author luozh
* @Date 2022年04月22日 11:28:44
* @param
* @Return
*/
@GetMapping("/sdk/getFriends")
@ApiOperation(value = "全量获取好友列表")
public ApiResult<List<FriendDto>> getFriendsSdk(@RequestParam("clientId") String clientId) {
Long appId = SecurityUtils.getCurrentAppId();
ImClient imClient = imClientService.getCacheImClient(appId, clientId);
return ApiResult.ok(friendService.getFriends(imClient));
}
/**
* 好友请求列表,最多只返回1000个 sdk使用
*/
@GetMapping("/sdk/unsureFriends")
@ApiOperation(value = "获取好友请求列表,最多只返回1000个")
public ApiResult<List<FriendDto>> getUnsureFriendsSdk(@RequestParam("clientId") String clientId) {
Long appId = SecurityUtils.getCurrentAppId();
ImClient imClient = imClientService.getCacheImClient(appId, clientId);
List<FriendDto> applyFriends = friendService.getApplyFriends(imClient);
return ApiResult.ok(applyFriends); return ApiResult.ok(applyFriends);
} }
......
package com.wecloud.im.externalaccess.service; package com.wecloud.im.externalaccess.service;
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;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.wecloud.im.entity.ImClient; import com.wecloud.im.entity.ImClient;
import com.wecloud.im.externalaccess.entity.User;
import com.wecloud.im.externalaccess.mapper.UserMapper;
import com.wecloud.im.externalaccess.param.FriendDto;
import com.wecloud.im.friend.param.ImFriendApplyDto; import com.wecloud.im.friend.param.ImFriendApplyDto;
import com.wecloud.im.friend.param.ImFriendBaseDto; import com.wecloud.im.friend.param.ImFriendBaseDto;
import com.wecloud.im.friend.param.ImFriendBaseParam; import com.wecloud.im.friend.param.ImFriendBaseParam;
import com.wecloud.im.friend.param.ImFriendPageParam; import com.wecloud.im.friend.param.ImFriendPageParam;
import com.wecloud.im.friend.service.ImFriendService; import com.wecloud.im.friend.service.ImFriendService;
import com.wecloud.im.service.ImClientService; import com.wecloud.im.service.ImClientService;
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;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/** /**
* @Author wenzhida * @Author wenzhida
...@@ -43,8 +45,7 @@ public class FriendService extends BaseServiceImpl<UserMapper, User> { ...@@ -43,8 +45,7 @@ public class FriendService extends BaseServiceImpl<UserMapper, User> {
private UserService userService; private UserService userService;
public FriendDto getFriendInfo(ImFriendBaseParam param) { public FriendDto getFriendInfo(ImClient currentClient, ImFriendBaseParam param) {
ImClient currentClient = imClientService.getCurrentClient();
if (currentClient == null) { if (currentClient == null) {
throw new BusinessException("当前登录用户未找到"); throw new BusinessException("当前登录用户未找到");
} }
...@@ -73,8 +74,7 @@ public class FriendService extends BaseServiceImpl<UserMapper, User> { ...@@ -73,8 +74,7 @@ public class FriendService extends BaseServiceImpl<UserMapper, User> {
/** /**
* 全量获取好友列表 * 全量获取好友列表
*/ */
public List<FriendDto> getFriends() { public List<FriendDto> getFriends(ImClient currentClient) {
ImClient currentClient = imClientService.getCurrentClient();
if (currentClient == null) { if (currentClient == null) {
throw new BusinessException("当前登录用户未找到"); throw new BusinessException("当前登录用户未找到");
} }
...@@ -86,27 +86,10 @@ public class FriendService extends BaseServiceImpl<UserMapper, User> { ...@@ -86,27 +86,10 @@ public class FriendService extends BaseServiceImpl<UserMapper, User> {
if (pageFriends == null || CollectionUtils.isEmpty(pageFriends.getRecords())) { if (pageFriends == null || CollectionUtils.isEmpty(pageFriends.getRecords())) {
return friendDtoList; return friendDtoList;
} }
List<String> friendClientIds = pageFriends.getRecords().stream().map(ImFriendBaseDto::getFriendClientId).collect(Collectors.toList());
List<User> userList = userService.list(
new QueryWrapper<User>().lambda()
.in(User::getId, friendClientIds)
);
if (CollectionUtils.isEmpty(userList)) {
return friendDtoList;
}
Map<String, User> userMap = Maps.newHashMap();
for (User user : userList) {
userMap.put(user.getId().toString(), user);
}
for (ImFriendBaseDto record : pageFriends.getRecords()) { for (ImFriendBaseDto record : pageFriends.getRecords()) {
FriendDto friendDto = new FriendDto(); FriendDto friendDto = new FriendDto();
BeanUtils.copyProperties(record, friendDto); BeanUtils.copyProperties(record, friendDto);
User user = userMap.get(record.getFriendClientId());
if (user != null) {
friendDto.setIdNumber(user.getIdNumber());
friendDto.setHeadPortrait(user.getHeadPortrait());
friendDto.setNickname(user.getNickname());
}
friendDtoList.add(friendDto); friendDtoList.add(friendDto);
} }
return friendDtoList; return friendDtoList;
...@@ -115,8 +98,7 @@ public class FriendService extends BaseServiceImpl<UserMapper, User> { ...@@ -115,8 +98,7 @@ public class FriendService extends BaseServiceImpl<UserMapper, User> {
/** /**
* 获取好友列表申请 * 获取好友列表申请
*/ */
public List<FriendDto> getApplyFriends() { public List<FriendDto> getApplyFriends(ImClient currentClient) {
ImClient currentClient = imClientService.getCurrentClient();
if (currentClient == null) { if (currentClient == null) {
throw new BusinessException("当前登录用户未找到"); throw new BusinessException("当前登录用户未找到");
} }
......
...@@ -7,7 +7,6 @@ import io.geekidea.springbootplus.framework.common.enums.BaseEnum; ...@@ -7,7 +7,6 @@ import io.geekidea.springbootplus.framework.common.enums.BaseEnum;
import io.geekidea.springbootplus.framework.core.pagination.Paging; import io.geekidea.springbootplus.framework.core.pagination.Paging;
import io.geekidea.springbootplus.framework.log.annotation.OperationLog; import io.geekidea.springbootplus.framework.log.annotation.OperationLog;
import io.geekidea.springbootplus.framework.log.enums.OperationLogType; import io.geekidea.springbootplus.framework.log.enums.OperationLogType;
import io.geekidea.springbootplus.framework.shiro.util.SecurityUtils;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -16,11 +15,9 @@ import java.util.List; ...@@ -16,11 +15,9 @@ import java.util.List;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.wecloud.im.entity.ImClient; import com.wecloud.im.entity.ImClient;
...@@ -114,24 +111,6 @@ public class ImFriendController extends BaseController { ...@@ -114,24 +111,6 @@ public class ImFriendController extends BaseController {
} }
/** /**
* 待接受的好友请求列表,最多只返回1000个(sdk 调用)
* @Author luozh
* @Date 2022年04月21日 05:07:31
* @param
* @Return
*/
@GetMapping("/sdk/unsureFriends")
@ApiOperation(value = "待接受的好友请求列表,最多只返回1000个")
public ApiResult<List<ImFriendApplyDto>> getUnsureFriendsSdk(@RequestParam("clientId") String clientId) {
ImClient currentClient = imClientService.getCacheImClient(SecurityUtils.getCurrentAppId(), clientId);
if (currentClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
}
List<ImFriendApplyDto> friendInfo = imFriendService.getApplyFriends(currentClient);
return ApiResult.ok(friendInfo);
}
/**
* 接受/拒绝好友申请 * 接受/拒绝好友申请
*/ */
@PostMapping("/approve") @PostMapping("/approve")
......
...@@ -14,6 +14,9 @@ import java.io.Serializable; ...@@ -14,6 +14,9 @@ import java.io.Serializable;
public class ImFriendBaseParam implements Serializable { public class ImFriendBaseParam implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ApiModelProperty("clientId")
private String clientId;
@ApiModelProperty("好友的client-id") @ApiModelProperty("好友的client-id")
private String friendClientId; private String friendClientId;
} }
package com.wecloud.im.param;
import lombok.Builder;
import lombok.Data;
/**
*
* @Author luozh
* @Date 2022年04月22日 11:07
* @Version 1.0
*/
@Builder
@Data
public class ClientOnlineStatusChangeDto {
/**
* 用户id
*/
private String userId;
/**
* 状态:0:online 上线、1:offline 离线、2:logout 登出。
*/
private Integer status;
/**
* 操作系统:iOS、Android、Websocket、PC、MiniProgram(小程序),用户上线时同步。
*/
private String os;
/**
* 发生时间
*/
private Long time;
/**
* 用户当前的 IP 地址及端口。
*/
private String clientIp;
}
package com.wecloud.im.service;
/**
* sdk 回调服务
* @Author luozh
* @Date 2022年04月22日 09:08
* @Version 1.0
*/
public interface ImCallbackService {
/**
* 全量消息路由
* @Author luozh
* @Date 2022年04月22日 09:10:15
* @param
* @Return 路由结果
*/
Boolean fullMessageRouting();
/**
* 用户在线状态变化
* @Author luozh
* @Date 2022年04月22日 09:11:28
* @param
* @Return
*/
Boolean clientOnlineStatusChange(Long applicationId, String clientId, Integer status,
Integer deviceType, Long time, String clientIp);
}
package com.wecloud.im.service.impl;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.shiro.signature.SignUtils;
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.id.NanoId;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.param.ClientOnlineStatusChangeDto;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImCallbackService;
/**
* 回调服务实现类
* @Author luozh
* @Date 2022年04月22日 09:11
* @Version 1.0
*/
public class ImCallbackServiceImpl implements ImCallbackService {
@Autowired
private RestTemplate restTemplate;
@Autowired
private ImApplicationService applicationService;
/**
* 全量消息路由
* @Author luozh
* @Date 2022年04月22日 09:35:24
* @param
* @Return
*/
@Override
public Boolean fullMessageRouting() {
return null;
}
/**
* 用户在线状态
* @Author luozh
* @Date 2022年04月22日 09:35:47
* @param clientId
* @param status
* @param deviceType
* @param time
* @param clientIp
* @Return
*/
@Override
public Boolean clientOnlineStatusChange(Long applicationId, String clientId, Integer status,
Integer deviceType, Long time, String clientIp) {
ImApplication application = applicationService.getCacheById(applicationId);
if (application == null) {
throw new BusinessException("application not exist");
}
String subscribeUrl = application.getOnlineStatusSubscribeUrl();
String appKey = application.getAppKey();
String appSecret = application.getAppSecret();
String callbackUrl = buildCallbackUrl(subscribeUrl, appKey, appSecret);
ClientOnlineStatusChangeDto body = ClientOnlineStatusChangeDto.builder()
.userId(clientId)
.status(status)
.os("")
.time(time)
.clientIp(clientIp)
.build();
ResponseEntity<Object> response = restTemplate.postForEntity(callbackUrl, body, Object.class);
// 同步在线状态时需要接收服务提供应答,只要有 HTTP 应答码 200 即认为状态已经同步
if (response.getStatusCode().equals(HttpStatus.OK)) {
// do nothing
} else {
// 如果应答超时 5 秒,会再尝试推送 2 次,如果仍然失败,将不再同步此条状态。如短时间内有大面积超时,将暂停推送,1 分钟后会继续推送。
}
return true;
}
/**
* 构建回调请求
* @Author luozh
* @Date 2022年04月22日 10:58:42
* @param
* @Return
*/
private String buildCallbackUrl(String subscribeUrl, String appKey, String appSecret) {
// 计算 Signature (数据签名)
String nonce = NanoId.randomNanoId();
String date = DateUtil.formatHttpDate(new Date());
String signature = SignUtils.buildSignature(appKey, appSecret, nonce, date);
String finalUrl =
subscribeUrl + "?appKey=" + appKey + "&nonce=" + nonce + "&date=" + date + "&signature=" + signature;
return finalUrl;
}
}
...@@ -136,4 +136,19 @@ public class SignUtils { ...@@ -136,4 +136,19 @@ public class SignUtils {
return new HmacSHA256Signature().computeSignature(secretAccessKey, canonicalString); return new HmacSHA256Signature().computeSignature(secretAccessKey, canonicalString);
} }
/**
* 创建回调 Signature (数据签名)
* @Author luozh
* @Date 2022年04月22日 08:43:04
* @param appKey 蔚可云平台分配的App Key
* @param appSecret 蔚可云平台分配的App Secret
* @param nonce 随机字符串 长度为21
* @param date GMT格式时间8
* @Return 数据签名
*/
public static String buildSignature(String appKey, String appSecret, String nonce, String date) {
String canonicalString = appKey + nonce + date;
return new HmacSHA256Signature().computeSignature(appSecret, canonicalString);
}
} }
...@@ -29,7 +29,12 @@ public class ResourcePathConstants { ...@@ -29,7 +29,12 @@ public class ResourcePathConstants {
/** /**
* 获取好友申请列表 * 获取好友申请列表
*/ */
public static final String GET_UNSURE_FRIENDS = "/api/friend/sdk/unsureFriends"; public static final String GET_UNSURE_FRIENDS = "/api/friends/sdk/unsureFriends";
/**
* 全量获取好友列表
*/
public static final String GET_FRIENDS = "/api/friends/sdk/getFriends";
} }
...@@ -5,6 +5,7 @@ import java.util.List; ...@@ -5,6 +5,7 @@ import java.util.List;
import com.wecloud.im.sdk.model.Friend; import com.wecloud.im.sdk.model.Friend;
import com.wecloud.im.sdk.model.ImClient; import com.wecloud.im.sdk.model.ImClient;
import com.wecloud.im.sdk.model.Token; import com.wecloud.im.sdk.model.Token;
import com.wecloud.im.sdk.model.UnsureFriend;
/** /**
* *
...@@ -25,7 +26,7 @@ public interface WecloudIm { ...@@ -25,7 +26,7 @@ public interface WecloudIm {
* @Return * @Return
* @return * @return
*/ */
ImClient registerClient(Long userId, String headPortrait, String nickname); ImClient registerClient(String userId, String headPortrait, String nickname);
/** /**
* 获取用户token * 获取用户token
...@@ -35,7 +36,7 @@ public interface WecloudIm { ...@@ -35,7 +36,7 @@ public interface WecloudIm {
* @param deviceType 设备类型 1:ios; 2:android; 3:web; 4:win; 5:mac * @param deviceType 设备类型 1:ios; 2:android; 3:web; 4:win; 5:mac
* @Return * @Return
*/ */
Token getToken(Long userId, Integer deviceType); Token getToken(String userId, Integer deviceType);
/** /**
...@@ -47,7 +48,7 @@ public interface WecloudIm { ...@@ -47,7 +48,7 @@ public interface WecloudIm {
* @param headPortrait 头像 * @param headPortrait 头像
* @Return * @Return
*/ */
Boolean modifyUser(Long userId, String nickname, String headPortrait); Boolean modifyUser(String userId, String nickname, String headPortrait);
/** /**
* 获取好友请求列表 * 获取好友请求列表
...@@ -56,6 +57,14 @@ public interface WecloudIm { ...@@ -56,6 +57,14 @@ public interface WecloudIm {
* @param userId 用户id * @param userId 用户id
* @Return * @Return
*/ */
List<Friend> getUnsureFriends(Long userId); List<UnsureFriend> getUnsureFriends(String userId);
/**
* 获取所有好友列表
* @Author luozh
* @Date 2022年04月22日 11:45:15
* @param userId 用户id
* @Return
*/
List<Friend> getFriends(String userId);
} }
...@@ -6,11 +6,13 @@ import java.util.List; ...@@ -6,11 +6,13 @@ import java.util.List;
import com.wecloud.im.sdk.internal.WecloudImClientOperation; import com.wecloud.im.sdk.internal.WecloudImClientOperation;
import com.wecloud.im.sdk.model.ClientLoginRequest; import com.wecloud.im.sdk.model.ClientLoginRequest;
import com.wecloud.im.sdk.model.Friend; import com.wecloud.im.sdk.model.Friend;
import com.wecloud.im.sdk.model.GetFriendsRequest;
import com.wecloud.im.sdk.model.GetUnsureFriendsRequest; import com.wecloud.im.sdk.model.GetUnsureFriendsRequest;
import com.wecloud.im.sdk.model.ImClient; import com.wecloud.im.sdk.model.ImClient;
import com.wecloud.im.sdk.model.ModifyUserRequest; import com.wecloud.im.sdk.model.ModifyUserRequest;
import com.wecloud.im.sdk.model.RegisterClientRequest; import com.wecloud.im.sdk.model.RegisterClientRequest;
import com.wecloud.im.sdk.model.Token; import com.wecloud.im.sdk.model.Token;
import com.wecloud.im.sdk.model.UnsureFriend;
/** /**
* *
...@@ -46,7 +48,7 @@ public class WecloudImClient implements WecloudIm { ...@@ -46,7 +48,7 @@ public class WecloudImClient implements WecloudIm {
} }
@Override @Override
public ImClient registerClient(Long userId, String headPortrait, String nickname) { public ImClient registerClient(String userId, String headPortrait, String nickname) {
RegisterClientRequest registerClientRequest = RegisterClientRequest registerClientRequest =
RegisterClientRequest.builder() RegisterClientRequest.builder()
.userId(userId).headPortrait(headPortrait) .userId(userId).headPortrait(headPortrait)
...@@ -56,14 +58,14 @@ public class WecloudImClient implements WecloudIm { ...@@ -56,14 +58,14 @@ public class WecloudImClient implements WecloudIm {
} }
@Override @Override
public Token getToken(Long userId, Integer deviceType) { public Token getToken(String userId, Integer deviceType) {
ClientLoginRequest clientLoginRequest = ClientLoginRequest.builder().clientId(userId).deviceType(deviceType).build(); ClientLoginRequest clientLoginRequest = ClientLoginRequest.builder().clientId(userId).deviceType(deviceType).build();
return imClientOperation.getToken(clientLoginRequest); return imClientOperation.getToken(clientLoginRequest);
} }
@Override @Override
public Boolean modifyUser(Long userId, String nickname, String headPortrait) { public Boolean modifyUser(String userId, String nickname, String headPortrait) {
ModifyUserRequest modifyUserRequest = ModifyUserRequest modifyUserRequest =
ModifyUserRequest.builder().userId(userId).nickname(nickname).headPortrait(headPortrait).build(); ModifyUserRequest.builder().userId(userId).nickname(nickname).headPortrait(headPortrait).build();
...@@ -71,12 +73,19 @@ public class WecloudImClient implements WecloudIm { ...@@ -71,12 +73,19 @@ public class WecloudImClient implements WecloudIm {
} }
@Override @Override
public List<Friend> getUnsureFriends(Long userId) { public List<UnsureFriend> getUnsureFriends(String userId) {
GetUnsureFriendsRequest getUnsureFriendsRequest = GetUnsureFriendsRequest.builder().userId(userId).build(); GetUnsureFriendsRequest getUnsureFriendsRequest = GetUnsureFriendsRequest.builder().userId(userId).build();
return imClientOperation.getUnsureFriends(getUnsureFriendsRequest); return imClientOperation.getUnsureFriends(getUnsureFriendsRequest);
} }
@Override
public List<Friend> getFriends(String userId) {
GetFriendsRequest getFriendsRequest = GetFriendsRequest.builder().userId(userId).build();
return imClientOperation.getFriends(getFriendsRequest);
}
private void initOperations() { private void initOperations() {
this.imClientOperation = new WecloudImClientOperation(apiDomain, appKey, appSecret); this.imClientOperation = new WecloudImClientOperation(apiDomain, appKey, appSecret);
} }
......
...@@ -144,4 +144,19 @@ public class SignUtils { ...@@ -144,4 +144,19 @@ public class SignUtils {
return new HmacSHA256Signature().computeSignature(secretAccessKey, canonicalString); return new HmacSHA256Signature().computeSignature(secretAccessKey, canonicalString);
} }
/**
* 创建回调 Signature (数据签名)
* @Author luozh
* @Date 2022年04月22日 08:43:04
* @param appKey 蔚可云平台分配的App Key
* @param appSecret 蔚可云平台分配的App Secret
* @param nonce 随机字符串 长度为21
* @param date GMT格式时间8
* @Return 数据签名
*/
public static String buildSignature(String appKey, String appSecret, String nonce, String date) {
String canonicalString = appKey + nonce + date;
return new HmacSHA256Signature().computeSignature(appSecret, canonicalString);
}
} }
...@@ -12,12 +12,15 @@ import com.wecloud.im.sdk.common.HttpMethod; ...@@ -12,12 +12,15 @@ import com.wecloud.im.sdk.common.HttpMethod;
import com.wecloud.im.sdk.common.RequestMessage; import com.wecloud.im.sdk.common.RequestMessage;
import com.wecloud.im.sdk.model.ClientLoginRequest; import com.wecloud.im.sdk.model.ClientLoginRequest;
import com.wecloud.im.sdk.model.Friend; import com.wecloud.im.sdk.model.Friend;
import com.wecloud.im.sdk.model.GetFriendsRequest;
import com.wecloud.im.sdk.model.GetUnsureFriendsRequest; import com.wecloud.im.sdk.model.GetUnsureFriendsRequest;
import com.wecloud.im.sdk.model.ImClient; import com.wecloud.im.sdk.model.ImClient;
import com.wecloud.im.sdk.model.ModifyUserRequest; import com.wecloud.im.sdk.model.ModifyUserRequest;
import com.wecloud.im.sdk.model.RegisterClientRequest; import com.wecloud.im.sdk.model.RegisterClientRequest;
import com.wecloud.im.sdk.model.Token; import com.wecloud.im.sdk.model.Token;
import com.wecloud.im.sdk.model.UnsureFriend;
import static com.wecloud.im.sdk.ResourcePathConstants.GET_FRIENDS;
import static com.wecloud.im.sdk.ResourcePathConstants.GET_TOKEN_URL; import static com.wecloud.im.sdk.ResourcePathConstants.GET_TOKEN_URL;
import static com.wecloud.im.sdk.ResourcePathConstants.GET_UNSURE_FRIENDS; import static com.wecloud.im.sdk.ResourcePathConstants.GET_UNSURE_FRIENDS;
import static com.wecloud.im.sdk.ResourcePathConstants.MODIFY_USER_URL; import static com.wecloud.im.sdk.ResourcePathConstants.MODIFY_USER_URL;
...@@ -45,7 +48,7 @@ public class WecloudImClientOperation extends WecloudImOperation { ...@@ -45,7 +48,7 @@ public class WecloudImClientOperation extends WecloudImOperation {
* @Return * @Return
*/ */
public ImClient registerClient(RegisterClientRequest registerClientRequest) { public ImClient registerClient(RegisterClientRequest registerClientRequest) {
Long userId = registerClientRequest.getUserId(); String userId = registerClientRequest.getUserId();
// 参数校验 // 参数校验
assertParameterNotNull(userId, "userId"); assertParameterNotNull(userId, "userId");
// 校验通过 构建参数 // 校验通过 构建参数
...@@ -71,7 +74,7 @@ public class WecloudImClientOperation extends WecloudImOperation { ...@@ -71,7 +74,7 @@ public class WecloudImClientOperation extends WecloudImOperation {
* @Return * @Return
*/ */
public Token getToken(ClientLoginRequest clientLoginRequest) { public Token getToken(ClientLoginRequest clientLoginRequest) {
Long clientId = clientLoginRequest.getClientId(); String clientId = clientLoginRequest.getClientId();
Integer deviceType = clientLoginRequest.getDeviceType(); Integer deviceType = clientLoginRequest.getDeviceType();
// 参数校验 // 参数校验
assertParameterNotNull(clientId, "userId"); assertParameterNotNull(clientId, "userId");
...@@ -99,7 +102,7 @@ public class WecloudImClientOperation extends WecloudImOperation { ...@@ -99,7 +102,7 @@ public class WecloudImClientOperation extends WecloudImOperation {
* @Return * @Return
*/ */
public Boolean modifyUser(ModifyUserRequest modifyUserRequest) { public Boolean modifyUser(ModifyUserRequest modifyUserRequest) {
Long userId = modifyUserRequest.getUserId(); String userId = modifyUserRequest.getUserId();
String headPortrait = modifyUserRequest.getHeadPortrait(); String headPortrait = modifyUserRequest.getHeadPortrait();
String nickname = modifyUserRequest.getNickname(); String nickname = modifyUserRequest.getNickname();
// 参数校验 // 参数校验
...@@ -128,8 +131,8 @@ public class WecloudImClientOperation extends WecloudImOperation { ...@@ -128,8 +131,8 @@ public class WecloudImClientOperation extends WecloudImOperation {
* @param getUnsureFriendsRequest * @param getUnsureFriendsRequest
* @Return * @Return
*/ */
public List<Friend> getUnsureFriends(GetUnsureFriendsRequest getUnsureFriendsRequest) { public List<UnsureFriend> getUnsureFriends(GetUnsureFriendsRequest getUnsureFriendsRequest) {
Long userId = getUnsureFriendsRequest.getUserId(); String userId = getUnsureFriendsRequest.getUserId();
// 参数校验 // 参数校验
assertParameterNotNull(userId, "userId"); assertParameterNotNull(userId, "userId");
// 校验通过 构建参数 // 校验通过 构建参数
...@@ -142,9 +145,28 @@ public class WecloudImClientOperation extends WecloudImOperation { ...@@ -142,9 +145,28 @@ public class WecloudImClientOperation extends WecloudImOperation {
.setOriginalRequest(getUnsureFriendsRequest).build(); .setOriginalRequest(getUnsureFriendsRequest).build();
Object result = doOperation(request); Object result = doOperation(request);
TypeReference<List<UnsureFriend>> typeReference = new TypeReference<List<UnsureFriend>>() {
};
List<UnsureFriend> unsureFriends = JSON.parseObject(JSON.toJSONString(result), typeReference);
return unsureFriends;
}
public List<Friend> getFriends(GetFriendsRequest getFriendsRequest) {
String userId = getFriendsRequest.getUserId();
// 参数校验
assertParameterNotNull(userId, "userId");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
param.put("clientId", userId + "");
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(GET_FRIENDS)
.setMethod(HttpMethod.GET).setParameters(param)
.setOriginalRequest(getFriendsRequest).build();
Object result = doOperation(request);
TypeReference<List<Friend>> typeReference = new TypeReference<List<Friend>>() { TypeReference<List<Friend>> typeReference = new TypeReference<List<Friend>>() {
}; };
List<Friend> friends = JSON.parseObject(JSON.toJSONString(result), typeReference); List<Friend> unsureFriends = JSON.parseObject(JSON.toJSONString(result), typeReference);
return friends; return unsureFriends;
} }
} }
...@@ -85,6 +85,4 @@ public abstract class WecloudImOperation { ...@@ -85,6 +85,4 @@ public abstract class WecloudImOperation {
return new RequestSigner(method.toString(), resourcePath, creds); return new RequestSigner(method.toString(), resourcePath, creds);
} }
} }
...@@ -18,7 +18,7 @@ public class ClientLoginRequest extends WebServiceRequest { ...@@ -18,7 +18,7 @@ public class ClientLoginRequest extends WebServiceRequest {
/** /**
* 用户id * 用户id
*/ */
private Long clientId; private String clientId;
/** /**
* 设备类型 1:ios; 2:android; 3:web; 4:win; 5:mac * 设备类型 1:ios; 2:android; 3:web; 4:win; 5:mac
......
...@@ -5,7 +5,7 @@ import lombok.Data; ...@@ -5,7 +5,7 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
/** /**
* * 申请中的用户信息
* @Author luozh * @Author luozh
* @Date 2022年04月13日 11:03 * @Date 2022年04月13日 11:03
* @Version 1.0 * @Version 1.0
...@@ -30,19 +30,4 @@ public class Friend implements Serializable { ...@@ -30,19 +30,4 @@ public class Friend implements Serializable {
*/ */
private Integer state; private Integer state;
/**
* 好友申请者
*/
private String claimerClientId;
/**
* 好友拒绝原因
*/
private String rejectRemark;
/**
* 好友请求说明
*/
private String requestRemark;
} }
package com.wecloud.im.sdk.model;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 全量获取好友列表请求
* @Author luozh
* @Date 2022年04月21日 16:51
* @Version 1.0
*/
@EqualsAndHashCode(callSuper = true)
@Builder
@Data
public class GetFriendsRequest extends WebServiceRequest {
/**
* 用户id
*/
private String userId;
}
...@@ -18,5 +18,5 @@ public class GetUnsureFriendsRequest extends WebServiceRequest { ...@@ -18,5 +18,5 @@ public class GetUnsureFriendsRequest extends WebServiceRequest {
/** /**
* 用户id * 用户id
*/ */
private Long userId; private String userId;
} }
...@@ -18,7 +18,7 @@ public class ModifyUserRequest extends WebServiceRequest { ...@@ -18,7 +18,7 @@ public class ModifyUserRequest extends WebServiceRequest {
/** /**
* userId * userId
*/ */
private Long userId; private String userId;
/** /**
* 昵称 * 昵称
......
...@@ -18,7 +18,7 @@ public class RegisterClientRequest extends WebServiceRequest { ...@@ -18,7 +18,7 @@ public class RegisterClientRequest extends WebServiceRequest {
/** /**
* app 用户id * app 用户id
*/ */
private Long userId; private String userId;
/** /**
* 头像 * 头像
......
package com.wecloud.im.sdk.model;
import lombok.Data;
import java.io.Serializable;
/**
* 申请中的用户信息
* @Author luozh
* @Date 2022年04月13日 11:03
* @Version 1.0
*/
@Data
public class UnsureFriend implements Serializable {
private static final long serialVersionUID = 5580006330057637138L;
/**
* 好友的client-id
*/
private String friendClientId;
/**
* 好友的昵称备注
*/
private String friendName;
/**
* 好友关系状态,1:待确定,2:已确认,3:已拒绝,4:已删除
*/
private Integer state;
/**
* 好友申请者
*/
private String claimerClientId;
/**
* 好友拒绝原因
*/
private String rejectRemark;
/**
* 好友请求说明
*/
private String requestRemark;
}
...@@ -18,7 +18,7 @@ public class GetTokenSample { ...@@ -18,7 +18,7 @@ public class GetTokenSample {
"QizKVHcILRWp6Td2", "QizKVHcILRWp6Td2",
"287d04828099fb7de871e9dda845fa8b6b2302faf2ab3737"); "287d04828099fb7de871e9dda845fa8b6b2302faf2ab3737");
Long userId = 20220413001L; String userId = "20220413001";
Integer deviceType = 1; Integer deviceType = 1;
Token token = im.getToken(userId, deviceType); Token token = im.getToken(userId, deviceType);
System.out.println("\t get token result=" + JSONObject.toJSONString(token)); System.out.println("\t get token result=" + JSONObject.toJSONString(token));
......
...@@ -17,7 +17,7 @@ public class ModifySample { ...@@ -17,7 +17,7 @@ public class ModifySample {
"QizKVHcILRWp6Td2", "QizKVHcILRWp6Td2",
"287d04828099fb7de871e9dda845fa8b6b2302faf2ab3737"); "287d04828099fb7de871e9dda845fa8b6b2302faf2ab3737");
Long userId = 20220413001L; String userId = "20220413001";
String headPortrait = "http://123"; String headPortrait = "http://123";
String nickname = "luo_test2"; String nickname = "luo_test2";
Boolean result = im.modifyUser(userId, nickname, headPortrait); Boolean result = im.modifyUser(userId, nickname, headPortrait);
......
...@@ -18,7 +18,7 @@ public class RegisterClientSample { ...@@ -18,7 +18,7 @@ public class RegisterClientSample {
"QizKVHcILRWp6Td2", "QizKVHcILRWp6Td2",
"287d04828099fb7de871e9dda845fa8b6b2302faf2ab3737"); "287d04828099fb7de871e9dda845fa8b6b2302faf2ab3737");
Long userId = 20220413001L; String userId = "20220413001";
String headPortrait = ""; String headPortrait = "";
String nickname = "luo_test1"; String nickname = "luo_test1";
ImClient imClient = im.registerClient(userId, headPortrait, nickname); ImClient imClient = im.registerClient(userId, headPortrait, nickname);
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
<reflections.version>0.9.9</reflections.version> <reflections.version>0.9.9</reflections.version>
<jansi.version>1.18</jansi.version> <jansi.version>1.18</jansi.version>
<lombok.version>1.18.12</lombok.version> <lombok.version>1.18.12</lombok.version>
<hutool.version>5.2.4</hutool.version> <hutool.version>5.7.22</hutool.version>
<junit.version>4.12</junit.version> <junit.version>4.12</junit.version>
<ini4j.version>0.5.4</ini4j.version> <ini4j.version>0.5.4</ini4j.version>
<mapstruct.version>1.3.1.Final</mapstruct.version> <mapstruct.version>1.3.1.Final</mapstruct.version>
......
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