Commit 21288506 by 罗长华

1、增加单个用户通知-普通消息接口

2、sdk对参数不再进行认证签名
3、covnersation的attributes要求Map<String,Object>类型
parent 3ef5aa63
......@@ -7,7 +7,10 @@ import lombok.extern.slf4j.Slf4j;
import java.util.Arrays;
import java.util.List;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
......@@ -38,6 +41,8 @@ public class ImGroupController {
private final ImGroupService groupService;
private final DiscoveryClient discoveryClient;
/**
* 创建群组
* @Author luozh
......@@ -154,4 +159,10 @@ public class ImGroupController {
log.info("移除群管理员请求 参数: {}", JSON.toJSONString(param));
return ApiResult.ok(groupService.removeGroupAdmin(param.getGroupId(), param.getAdminUserIds()));
}
@GetMapping("/getServiceInstance")
public List<ServiceInstance> getServiceInstance() {
List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("providers:com.wecloud.im.router.RouterSendService::");
return serviceInstanceList;
}
}
......@@ -27,6 +27,7 @@ import com.wecloud.im.param.ImHistoryMessagePageParam;
import com.wecloud.im.param.MsgDeleteParam;
import com.wecloud.im.param.PrivateChatMessageParam;
import com.wecloud.im.param.PrivateChatStatusMessageParam;
import com.wecloud.im.param.SingleUserNotificationParam;
import com.wecloud.im.param.add.ImMsgRecall;
import com.wecloud.im.param.add.ImMsgUpdate;
import com.wecloud.im.service.ImMessageService;
......@@ -138,5 +139,11 @@ public class ImMessageController extends BaseController {
return ApiResult.ok(imMessageService.privateStatusMessagePublish(param));
}
@ApiOperation("单个用户通知-普通消息")
@PostMapping("/system-notification/publish")
public ApiResult<Boolean> singleUserNotification(@RequestBody @Validated SingleUserNotificationParam param) {
return ApiResult.ok(imMessageService.singleUserNotification(param));
}
}
package com.wecloud.im.param;
import lombok.Data;
import java.util.Map;
import com.wecloud.im.sdk.enums.ChatTypeEnum;
/**
*
* @Author luozh
* @Date 2022年05月25日 10:35
* @Version 1.0
*/
@Data
public class ConversationExtParam {
/**
* 名称
*/
private String name;
/**
* 拓展属性
*/
private Map<String, Object> attributes;
/**
* 会话类型
*/
private ChatTypeEnum chatType;
public ConversationExtParam() {
}
}
package com.wecloud.im.param;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* 单个用户通知
* @Author luozh
* @Date 2022年05月05日 11:49
* @Version 1.0
*/
@Data
public class SingleUserNotificationParam {
/**
* 发送人用户id
*/
@NotBlank(message = "发送人用户id不能为空")
private String fromUserId;
/**
* 指定一个或多个用户
*/
@NotBlank(message = "接收用户不能为空")
private String toUserIds;
/**
* 消息类型
*/
@NotBlank(message = "消息类型不能为空")
private String messageType;
/**
* 消息
*/
@NotBlank(message = "消息内容不能为空")
private String content;
/**
* 指定离线推送通知中的推送内容
*/
private String pushContent;
/**
* 是否存储此条消息
*/
private Boolean persisted;
/**
* 推送拓展配置
*/
private PushExtParam pushExt;
/**
* 会话拓展配置
*/
private ConversationExtParam conversationExt;
}
......@@ -8,6 +8,7 @@ import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.List;
import java.util.Map;
import javax.validation.constraints.NotNull;
......@@ -28,7 +29,7 @@ public class ImConversationCreate extends BaseEntity {
private String name;
@ApiModelProperty("string格式,可选 自定义属性,供开发者扩展使用。")
private String attributes;
private Map<String, Object> attributes;
@ApiModelProperty("可选 邀请加入会话的客户端,如创建单聊,则填入对方的clientId")
private List<String> clientIds;
......
......@@ -6,6 +6,7 @@ import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
......@@ -32,7 +33,7 @@ public class ServerImConversationCreate implements Serializable {
/**
* tring格式,可选 自定义属性,供开发者扩展使用。")
*/
private String attributes;
private Map<String, Object> attributes;
/**
* 应用, 前端")
......
......@@ -28,7 +28,13 @@ public enum ChatTypeEnum implements BaseEnum {
/**
* 临时会话
*/
TEMP(5, "临时会话");
TEMP(5, "临时会话"),
/**
* 系统会话
*/
SYSTEM(6, "系统会话"),
;
private final Integer code;
private final String desc;
......
......@@ -20,6 +20,7 @@ import com.wecloud.im.param.ImHistoryMessagePageParam;
import com.wecloud.im.param.MsgDeleteParam;
import com.wecloud.im.param.PrivateChatMessageParam;
import com.wecloud.im.param.PrivateChatStatusMessageParam;
import com.wecloud.im.param.SingleUserNotificationParam;
import com.wecloud.im.param.add.ImMsgRecall;
import com.wecloud.im.param.add.ImMsgSendToOnlineClient;
import com.wecloud.im.param.add.ImMsgUpdate;
......@@ -179,4 +180,12 @@ public interface ImMessageService extends BaseService<ImMessage> {
*/
Boolean privateStatusMessagePublish(PrivateChatStatusMessageParam param);
/**
* 单个用户通知-普通消息
* @Author luozh
* @Date 2022年05月25日 10:42:31
* @param param
* @Return
*/
Boolean singleUserNotification(SingleUserNotificationParam param);
}
......@@ -166,7 +166,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
Integer chatType = imConversationCreate.getChatType();
String name = imConversationCreate.getName();
String attributes = imConversationCreate.getAttributes();
Map<String, Object> attributes = imConversationCreate.getAttributes();
List<String> memberClientIds = imConversationCreate.getClientIds();
if (ChatTypeEnum.CHAT_ROOM.getCode().equals(chatType)) {
// 聊天室
......@@ -205,12 +205,14 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
ChatTypeEnum chatType = imConversationCreate.getChatType();
String name = imConversationCreate.getName();
String attributes = imConversationCreate.getAttributes();
Map<String, Object> attributes = imConversationCreate.getAttributes();
List<String> memberClientIds = imConversationCreate.getMembers().stream().map(ImClient::getClientId).collect(Collectors.toList());
if (ChatTypeEnum.SINGLE.equals(chatType)) {
return this.createPrivateChat(creator, memberClientIds.get(0), name, attributes);
} else if (ChatTypeEnum.NORMAL_GROUP.equals(chatType)) {
return this.createGroupChat(imApplication, creator, memberClientIds, name, attributes);
} else if (ChatTypeEnum.SYSTEM.equals(chatType)) {
return createSystemConversation(creator, memberClientIds.get(0), name, attributes);
}
return null;
}
......@@ -1153,7 +1155,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imConversation.setChatType(imConversationCreate.getChatType());
imConversation.setName(imConversationCreate.getName());
imConversation.setSystemFlag(false);
imConversation.setAttributes(imConversationCreate.getAttributes());
imConversation.setAttributes(JsonUtils.encodeJson(imConversationCreate.getAttributes()));
imConversationService.save(imConversation);
// 将创建者自己添加到会话
......@@ -1243,7 +1245,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
* @param
* @Return
*/
private ImConversation createPrivateChat(ImClient creator, String memberUserId, String name, String attributes) {
private ImConversation createPrivateChat(ImClient creator, String memberUserId, String name, Map<String, Object> attributes) {
Long appId = creator.getFkAppid();
ImClient memberClient = imClientService.getOne(Wrappers.<ImClient>lambdaQuery().eq(ImClient::getClientId,
memberUserId).eq(ImClient::getFkAppid, appId));
......@@ -1293,13 +1295,52 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
}
/**
* 创建系统会话
* @Author luozh
* @Date 2022年05月25日 02:09:43
* @param
* @Return
*/
private ImConversation createSystemConversation(ImClient creator, String memberUserId, String name, Map<String, Object> attributes) {
Long appId = creator.getFkAppid();
ImClient memberClient = imClientService.getOne(Wrappers.<ImClient>lambdaQuery().eq(ImClient::getClientId,
memberUserId).eq(ImClient::getFkAppid, appId));
if (memberClient == null) {
return null;
}
// 如果存在重复单聊类型会话,则不会为空
ImConversation existConversation = imConversationMapper.getRepetitionConversationSingle(creator.getId(), memberClient.getId());
if (existConversation != null) {
// 双方可见
List<ImConversationMembers> memberList =
imConversationMembersService.list(Wrappers.<ImConversationMembers>lambdaQuery().eq(ImConversationMembers::getFkConversationId, existConversation.getId()));
imConversationMembersService.updateBatchById(memberList);
log.info("存在重复的系统类型会话,返回已存在的系统类型会话id: {}", existConversation.getId());
// 返回已存在的单聊类型会话id
return existConversation;
}
// 创建会话
ImConversation conversation = buildConversation(creator, ChatTypeEnum.SYSTEM, name, 2, attributes);
// 创建成员
List<ImConversationMembers> conversationMemberList = buildPrivateChatMembers(conversation, creator,
memberClient);
this.save(conversation);
this.imConversationMembersService.saveBatch(conversationMemberList);
return conversation;
}
/**
* 创建群聊会话
* @return
*/
private ImConversation createGroupChat(ImApplication application, ImClient creator,
List<String> memberUserIds,
String name,
String attributes) {
Map<String, Object> attributes) {
if (CollectionUtils.isEmpty(memberUserIds)) {
log.info("未找到群成员信息");
......@@ -1342,7 +1383,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
}
private ImConversation buildConversation(ImClient creator, ChatTypeEnum chatType,
String name, Integer memberCount, String attributes) {
String name, Integer memberCount, Map<String, Object> attributes) {
// 创建会话
Long imConversationId = SnowflakeUtil.getId();
ImConversation imConversation = new ImConversation();
......
......@@ -51,6 +51,7 @@ import com.wecloud.im.event.ClientSendMessageEvent;
import com.wecloud.im.mapper.ImMessageMapper;
import com.wecloud.im.mq.MqSender;
import com.wecloud.im.param.ChatContentVo;
import com.wecloud.im.param.ConversationExtParam;
import com.wecloud.im.param.GetReadersParam;
import com.wecloud.im.param.GroupChatMessageParam;
import com.wecloud.im.param.GroupChatStatusMessageParam;
......@@ -60,6 +61,7 @@ import com.wecloud.im.param.MsgDeleteParam;
import com.wecloud.im.param.PrivateChatMessageParam;
import com.wecloud.im.param.PrivateChatStatusMessageParam;
import com.wecloud.im.param.PushExtParam;
import com.wecloud.im.param.SingleUserNotificationParam;
import com.wecloud.im.param.add.ImMsgRecall;
import com.wecloud.im.param.add.ImMsgSendToOnlineClient;
import com.wecloud.im.param.add.ImMsgUpdate;
......@@ -829,10 +831,68 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
return true;
}
@Override
public Boolean singleUserNotification(SingleUserNotificationParam param) {
ImApplication application = imApplicationService.getCacheById(SecurityUtils.getCurrentAppId());
String senderClientId = param.getFromUserId();
String toUserIdsStr = param.getToUserIds();
List<String> toUserIdList = Arrays.asList(toUserIdsStr.split(","));
// 获取发件人信息
ImClient sender = imClientService.getCacheImClient(application.getId(), senderClientId);
if (sender == null) {
throw new BusinessException("id为 " + senderClientId + " 的发件人不存在");
}
Map<Long, ImConversation> conversationMapGroupById = new HashMap<>();
Map<Long, List<ImConversationMembers>> conMembersMapGroupByConId = new HashMap<>();
if (param.getConversationExt() == null) {
ConversationExtParam conversationExt = new ConversationExtParam();
conversationExt.setChatType(ChatTypeEnum.SYSTEM);
param.setConversationExt(conversationExt);
} else {
param.getConversationExt().setChatType(ChatTypeEnum.SYSTEM);
}
beforePublishPrivateMessage(application, sender, toUserIdList, param.getConversationExt(),
conversationMapGroupById, conMembersMapGroupByConId);
// 开始发送消息
conversationMapGroupById.forEach((conversationId, conversation) -> {
List<ImConversationMembers> membersList = conMembersMapGroupByConId.getOrDefault(conversationId,
Collections.emptyList());
// 组装消息
ImMessage message = assembleImMessage(application.getId(), sender, conversation.getId(), param.getMessageType(),
false, param.getContent());
// 持久化
this.save(message);
// 拼装发送消息体
ImMessageOnlineSend imMessageOnlineSend = assembleImMessageOnlineSend(message, sender, application.getId());
// 发送消息
for (ImConversationMembers members : membersList) {
if (members.getClientId().equals(senderClientId)) {
// 系统消息不给自己发
continue;
}
// 入库 保存收件箱
saveImInbox(application, conversation.getId(), imMessageOnlineSend.getMsgId(),
members, SnowflakeUtil.getId());
// 在线用户直接发消息
sendMsgForOnline(members.getFkClientId(), imMessageOnlineSend);
// 离线消息推送
pushMsgToOfflineMembers(application, members, param.getPushContent(), param.getPushExt());
}
});
return true;
}
/**
* 私聊消息发送前
*
* @Author luozh
* @Date 2022年05月07日 11:28:59
* @Date 2022年05月25日 10:48:58
* @param application
* @param sender
* @param toUserIdList
......@@ -845,6 +905,27 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
List<String> toUserIdList,
Map<Long, ImConversation> conversationMapGroupById,
Map<Long, List<ImConversationMembers>> conMembersMapGroupByConId) {
this.beforePublishPrivateMessage(application, sender, toUserIdList, null, conversationMapGroupById, conMembersMapGroupByConId);
}
/**
* 私聊消息发送前
* @Author luozh
* @Date 2022年05月07日 11:28:59
* @param application 应用
* @param sender 发送者
* @param toUserIdList 接收人用户id
* @param conversationExt 会话拓展信息,该参数非必填,如果传入,则会话名称和
* @param conversationMapGroupById
* @param conMembersMapGroupByConId
* @Return
*/
private void beforePublishPrivateMessage(ImApplication application,
ImClient sender,
List<String> toUserIdList,
ConversationExtParam conversationExt,
Map<Long, ImConversation> conversationMapGroupById,
Map<Long, List<ImConversationMembers>> conMembersMapGroupByConId) {
Long appId = application.getId();
// 获取收件人信息
List<ImClient> receiverList = imClientService.list(Wrappers.<ImClient>lambdaQuery().eq(ImClient::getFkAppid,
......@@ -896,7 +977,26 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
conversationCreate.setMembers(members);
conversationCreate.setChatType(ChatTypeEnum.SINGLE);
conversationCreate.setApplication(application);
// 会话拓展信息不为空
if (conversationExt != null) {
if (StringUtils.isNotBlank(conversationExt.getName())) {
conversationCreate.setName(conversationExt.getName());
}
if (conversationExt.getChatType() != null) {
conversationCreate.setChatType(conversationExt.getChatType());
}
if (conversationExt.getAttributes() != null) {
conversationCreate.setAttributes(conversationExt.getAttributes());
}
}
ImConversation conversation = imConversationService.serverCreateImConversation(conversationCreate);
if (conversation == null) {
continue;
}
// 构建ImConversationMembers(只保存必要信息)
ImConversationMembers receiverMember = new ImConversationMembers();
receiverMember.setClientId(receiver.getClientId());
......
......@@ -87,7 +87,7 @@
on con.id = mem1.fk_conversation_id and mem1.fk_client_id = #{clientId1}
inner join im_conversation_members mem2
on con.id = mem2.fk_conversation_id and mem2.fk_client_id = #{clientId2}
where con.chat_type in (1, 5)
where con.chat_type in (1, 5, 6)
and con.member_count = 2
order by con.id asc
LIMIT 1
......
......@@ -21,11 +21,11 @@
from im_message
</select>
<select id="getOfflineListByClientAndConversation" resultType="com.wecloud.im.vo.OfflineMsgDto">
SELECT im_message.id AS msgId,
SELECT im_message.id AS msgId,
im_message.create_time,
im_message.withdraw_time,
im_message.update_date,
`im_client`.client_id AS sender,
`im_client`.client_id AS sender,
im_message.content,
im_message.withdraw,
im_message.`event`,
......@@ -33,14 +33,15 @@
im_message.`at`,
im_message.send_status,
im_message.fk_conversation_id,
im_message.`msg_type` AS 'type', (SELECT COUNT(id)
FROM im_inbox
WHERE fk_msg_id = msgId
AND read_msg_status = 0) AS not_read_count,
im_message.`msg_type` AS 'type',
(SELECT COUNT(id)
FROM im_inbox
WHERE fk_msg_id = msgId
AND receiver_msg_status = 0) AS not_receiver_count
AND read_msg_status = 0) AS not_read_count,
(SELECT COUNT(id)
FROM im_inbox
WHERE fk_msg_id = msgId
AND receiver_msg_status = 0) AS not_receiver_count
FROM im_inbox
INNER JOIN im_message im_message ON im_message.id = im_inbox.fk_msg_id
......@@ -52,28 +53,29 @@
AND im_message.withdraw = 0
</select>
<select id="getHistoryMsgConversationId" resultType="com.wecloud.im.vo.OfflineMsgDto">
SELECT im_message.id AS msgId,
im_message.create_time,
im_message.withdraw_time,
im_message.update_date,
`im_client`.client_id AS sender,
im_message.content,
im_message.withdraw,
im_message.`event`,
im_message.system_flag,
im_message.`at`,
im_message.send_status,
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
WHERE fk_msg_id = msgId
AND receiver_msg_status = 0) AS not_receiver_count
SELECT im_message.id AS msgId,
im_message.create_time,
im_message.withdraw_time,
im_message.update_date,
`im_client`.client_id AS sender,
im_message.content,
im_message.withdraw,
im_message.`event`,
im_message.system_flag,
im_message.`at`,
im_message.send_status,
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
WHERE fk_msg_id = msgId
AND receiver_msg_status = 0) AS not_receiver_count
FROM `im_message`
INNER JOIN `im_client` ON `im_client`.id = `im_message`.sender
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} and (receivers is null || (receivers !=null and FIND_IN_SET(#{param.currentFkClientId}, receivers))) ))
and (im_message.`event`=0 || (im_message.`event`=1 and sender != #{param.currentFkClientId} and (receivers is
null || (receivers !=null and FIND_IN_SET(#{param.currentFkClientId}, receivers))) ))
<if test="param.msgIdStart != null">
AND im_message.id > #{param.msgIdStart}
</if>
......@@ -86,11 +88,11 @@
<select id="getHistoryMsgConversationIdNew" resultType="com.wecloud.im.vo.OfflineMsgDto">
SELECT im_message.id AS msgId,
SELECT im_message.id AS msgId,
im_message.create_time,
im_message.withdraw_time,
im_message.update_date,
`im_client`.client_id AS sender,
`im_client`.client_id AS sender,
im_message.content,
im_message.withdraw,
im_message.`event`,
......@@ -103,11 +105,12 @@
(SELECT COUNT(id)
FROM im_inbox
WHERE fk_msg_id = msgId
AND receiver_msg_status = 0) AS not_receiver_count
AND receiver_msg_status = 0) AS not_receiver_count
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} and (receivers is null || (receivers !=null and FIND_IN_SET(#{param.currentFkClientId}, receivers))) ))
and (im_message.`event`=0 || (im_message.`event`=1 and sender != #{param.currentFkClientId} and (receivers is
null || (receivers !=null and FIND_IN_SET(#{param.currentFkClientId}, receivers))) ))
<if test="param.msgIdStart != null">
AND im_message.id > #{param.msgIdStart}
</if>
......@@ -137,14 +140,16 @@
im_message.`event`,
im_message.system_flag,
im_message.`at`,
im_message.`msg_type` AS 'type', im_message.send_status,
im_message.`msg_type` AS 'type',
im_message.send_status,
im_message.fk_conversation_id
FROM im_inbox
INNER JOIN im_message ON im_message.id = im_inbox.fk_msg_id
INNER JOIN im_client AS im_client ON im_client.id = im_message.sender
WHERE im_inbox.receiver = #{clientId}
AND im_inbox.fk_conversation_id = #{conversationId}
ORDER BY create_time DESC LIMIT 1
ORDER BY create_time DESC
LIMIT 1
</select>
<select id="getLastMsgByConversationId" resultType="com.wecloud.im.vo.OfflineMsgDto">
......@@ -159,25 +164,30 @@
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
FROM im_message
INNER JOIN im_client AS im_client ON im_client.id = im_message.sender
WHERE im_message.fk_conversation_id = #{conversationId}
and (im_message.`event`=0 || (im_message.`event`=1 and sender != #{currentFkClientId} and (receivers is null || (receivers !=null and FIND_IN_SET(#{currentFkClientId}, receivers))) ))
and (im_message.`event` = 0 || (im_message.`event` = 1 and sender != #{currentFkClientId} and
(receivers is null ||
(receivers != null and FIND_IN_SET(#{currentFkClientId}, receivers)))))
ORDER BY create_time DESC LIMIT 1
ORDER BY create_time DESC
LIMIT 1
</select>
<select id="getReaders" resultType="com.wecloud.im.vo.ReaderVo">
SELECT client.id as id,
client.head_portrait as headPortrait,
client.nickname as nickname,
client.client_id as clientId,
SELECT client.id as id,
client.head_portrait as headPortrait,
client.nickname as nickname,
client.client_id as clientId,
inbox.read_msg_status as readMsgStatus
FROM `im_inbox` inbox LEFT JOIN im_client client on inbox.receiver = client.id
FROM `im_inbox` inbox
LEFT JOIN im_client client on inbox.receiver = client.id
WHERE inbox.fk_conversation_id = #{param.conversationId}
and inbox.fk_msg_id = #{param.msgId}
and inbox.receiver != #{currentClientId}
and inbox.fk_msg_id = #{param.msgId}
and inbox.receiver != #{currentClientId}
</select>
</mapper>
......@@ -26,7 +26,7 @@ public class SignUtils {
public static final String NEW_LINE = "\n";
public static String buildCanonicalString(String method, String resourcePath, Map<String, String> headers, Map<String, String> parameters) {
public static String buildCanonicalString(String method, String resourcePath, Map<String, String> headers) {
StringBuilder canonicalString = new StringBuilder();
canonicalString.append(method).append(NEW_LINE);
......@@ -69,38 +69,16 @@ public class SignUtils {
}
// Append canonical resource to canonical string
canonicalString.append(buildCanonicalizedResource(resourcePath, parameters));
canonicalString.append(buildCanonicalizedResource(resourcePath));
return canonicalString.toString();
}
private static String buildCanonicalizedResource(String resourcePath, Map<String, String> parameters) {
private static String buildCanonicalizedResource(String resourcePath) {
Assert.isTrue(resourcePath.startsWith("/"), "Resource path should start with slash character");
StringBuilder builder = new StringBuilder();
builder.append(uriEncoding(resourcePath));
if (parameters != null) {
TreeMap<String, String> canonicalizedParams = new TreeMap<String, String>();
for (Map.Entry<String, String> param : parameters.entrySet()) {
if (param.getValue() != null) {
canonicalizedParams.put(uriEncoding(param.getKey()), uriEncoding(param.getValue()));
} else {
canonicalizedParams.put(uriEncoding(param.getKey()), null);
}
}
char separator = '?';
for (Map.Entry<String, String> entry : canonicalizedParams.entrySet()) {
builder.append(separator);
builder.append(entry.getKey());
if (entry.getValue() != null && !entry.getValue().isEmpty()) {
builder.append("=").append(entry.getValue());
}
separator = '&';
}
}
return builder.toString();
}
......@@ -135,8 +113,8 @@ public class SignUtils {
return result;
}
public static String buildSignature(String secretAccessKey, String httpMethod, String resourcePath, Map<String, String> headers, Map<String, String> parameters) {
String canonicalString = buildCanonicalString(httpMethod, resourcePath, headers, parameters);
public static String buildSignature(String secretAccessKey, String httpMethod, String resourcePath, Map<String, String> headers) {
String canonicalString = buildCanonicalString(httpMethod, resourcePath, headers);
return new HmacSHA256Signature().computeSignature(secretAccessKey, canonicalString);
}
......
......@@ -41,8 +41,6 @@ public class SignatureChecker {
* @Return appKey
*/
public static void check(HttpServletRequest request, String clientSignature, String appSecret) {
// 获取到入参
Map<String, String> params = getParameterMap(request);
// 获取请求头
Map<String, String> headers = getHeaderMap(request);
// resourcePath
......@@ -50,7 +48,7 @@ public class SignatureChecker {
// request methos
String requestMethod = request.getMethod();
String canonicalString = SignUtils.buildCanonicalString(requestMethod, resourcePath, headers, params);
String canonicalString = SignUtils.buildCanonicalString(requestMethod, resourcePath, headers);
log.info("服务端api签名字符串: {}", canonicalString);
log.info("服务端api appSecret: {}", appSecret);
String serverSignature = new HmacSHA256Signature().computeSignature(appSecret, canonicalString);
......
......@@ -171,4 +171,9 @@ public class ResourcePathConstants {
*/
public static final String LIST_RTCRECORDS_REQUEST = "/api/rtcrecord/listRtcRecords";
/**
* 单次发布
*/
public static final String SINGLE_USER_NOTIFICATION = "/api/imMessage/system-notification/publish";
}
package com.wecloud.im.sdk;
import com.wecloud.im.sdk.model.*;
import java.util.List;
import com.wecloud.im.sdk.model.Attributes;
import com.wecloud.im.sdk.model.Blacklist;
import com.wecloud.im.sdk.model.ChatRoomMember;
import com.wecloud.im.sdk.model.ClientRelation;
import com.wecloud.im.sdk.model.Conversation;
import com.wecloud.im.sdk.model.Friend;
import com.wecloud.im.sdk.model.GroupChatMessage;
import com.wecloud.im.sdk.model.GroupChatStatusMessage;
import com.wecloud.im.sdk.model.GroupSettingParam;
import com.wecloud.im.sdk.model.ImClient;
import com.wecloud.im.sdk.model.ImRtcRecord;
import com.wecloud.im.sdk.model.PageResult;
import com.wecloud.im.sdk.model.PrivateChatMessage;
import com.wecloud.im.sdk.model.PrivateChatStatusMessage;
import com.wecloud.im.sdk.model.RtcRecord;
import com.wecloud.im.sdk.model.SingleUserNotification;
import com.wecloud.im.sdk.model.Token;
import com.wecloud.im.sdk.model.UnsureFriend;
/**
*
* @Author luozh
......@@ -53,7 +70,7 @@ public interface WecloudIm {
* @param userId 用户id
* @Return
*/
UserAttributes getUserAttributes(String userId);
Attributes getUserAttributes(String userId);
/**
* 更新用户拓展信息
......@@ -63,7 +80,7 @@ public interface WecloudIm {
* @param attributes 用户拓展字段
* @Return
*/
Boolean modifyUserAttributes(String userId, UserAttributes attributes);
Boolean modifyUserAttributes(String userId, Attributes attributes);
/**
* 封禁用户
......@@ -338,5 +355,14 @@ public interface WecloudIm {
* @Author nanqianhao
* @Date 2022年05月23日 11:30
*/
PageResult<ImRtcRecord> getPageImRtcRecords(RtcRecordRequest rtcRecordRequest);
PageResult<ImRtcRecord> getPageImRtcRecords(RtcRecord rtcRecord);
/**
* 单个用户通知
* @Author luozh
* @Date 2022年05月25日 09:36:47
* @param
* @Return
*/
Boolean singleUserNotification(SingleUserNotification singleUserNotification);
}
package com.wecloud.im.sdk;
import java.net.URL;
import java.util.List;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Assert;
import com.wecloud.im.sdk.internal.*;
import com.wecloud.im.sdk.model.*;
import java.net.URL;
import java.util.List;
import com.wecloud.im.sdk.internal.WecloudImContactsOperation;
import com.wecloud.im.sdk.internal.WecloudImConversationOperation;
import com.wecloud.im.sdk.internal.WecloudImGroupOperation;
import com.wecloud.im.sdk.internal.WecloudImMessageOperation;
import com.wecloud.im.sdk.internal.WecloudImRtcRecordOperation;
import com.wecloud.im.sdk.internal.WecloudImSystemNotificationOperation;
import com.wecloud.im.sdk.internal.WecloudImUserOperation;
import com.wecloud.im.sdk.model.*;
/**
*
......@@ -44,6 +51,8 @@ public class WecloudImClient implements WecloudIm {
private WecloudImRtcRecordOperation imRtcRecordOperation;
private WecloudImSystemNotificationOperation imSystemNotificationOperation;
public WecloudImClient(URL apiDomain, String appKey, String appSecret) {
this.apiDomain = apiDomain;
this.appKey = appKey;
......@@ -77,13 +86,13 @@ public class WecloudImClient implements WecloudIm {
}
@Override
public UserAttributes getUserAttributes(String userId) {
public Attributes getUserAttributes(String userId) {
GetUserAttributesRequest getUserAttributesRequest = GetUserAttributesRequest.builder().userId(userId).build();
return imUserOperation.getUserAttributes(getUserAttributesRequest);
}
@Override
public Boolean modifyUserAttributes(String userId, UserAttributes attributes) {
public Boolean modifyUserAttributes(String userId, Attributes attributes) {
ModifyUserAttributesRequest modifyUserAttributesRequest =
ModifyUserAttributesRequest.builder().userId(userId).attributes(attributes).build();
;
......@@ -301,16 +310,25 @@ public class WecloudImClient implements WecloudIm {
}
@Override
public PageResult<ImRtcRecord> getPageImRtcRecords(RtcRecordRequest rtcRecordRequest) {
public PageResult<ImRtcRecord> getPageImRtcRecords(RtcRecord record) {
RtcRecordRequest rtcRecordRequest = BeanUtil.toBean(record, RtcRecordRequest.class);
return imRtcRecordOperation.listRtcRecords(rtcRecordRequest);
}
@Override
public Boolean singleUserNotification(SingleUserNotification singleUserNotification) {
SingleUserNotificationRequest singleUserNotificationRequest = BeanUtil.toBean(singleUserNotification,
SingleUserNotificationRequest.class);
return imSystemNotificationOperation.singleUserNotification(singleUserNotificationRequest);
}
private void initOperations() {
this.imUserOperation = new WecloudImUserOperation(apiDomain, appKey, appSecret);
this.imConversationOperation = new WecloudImConversationOperation(apiDomain, appKey, appSecret);
this.imMessageOperation = new WecloudImMessageOperation(apiDomain, appKey, appSecret);
this.imGroupOperation = new WecloudImGroupOperation(apiDomain, appKey, appSecret);
this.imContactsOperation = new WecloudImContactsOperation(apiDomain, appKey, appSecret);
this.imRtcRecordOperation=new WecloudImRtcRecordOperation(apiDomain, appKey, appSecret);
this.imRtcRecordOperation = new WecloudImRtcRecordOperation(apiDomain, appKey, appSecret);
this.imSystemNotificationOperation = new WecloudImSystemNotificationOperation(apiDomain, appKey, appSecret);
}
}
......@@ -38,7 +38,7 @@ public class HttpClient {
private static volatile OkHttpClient okHttpClient = null;
private static volatile Semaphore semaphore = null;
private Map<String, String> headerMap;
private Map<String, String> paramMap;
private Map<String, Object> paramMap;
private URL url;
private Request.Builder request;
......@@ -121,7 +121,7 @@ public class HttpClient {
* @param params
* @Return
*/
public HttpClient addParams(Map<String, String> params) {
public HttpClient addParams(Map<String, Object> params) {
if (paramMap == null) {
paramMap = new LinkedHashMap<>(16);
}
......@@ -163,10 +163,10 @@ public class HttpClient {
if (paramMap != null) {
urlBuilder.append("?");
try {
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
for (Map.Entry<String, Object> entry : paramMap.entrySet()) {
urlBuilder.append(URLEncoder.encode(entry.getKey(), "utf-8")).
append("=").
append(URLEncoder.encode(entry.getValue(), "utf-8")).
append(URLEncoder.encode(entry.getValue().toString(), "utf-8")).
append("&");
}
} catch (Exception e) {
......@@ -196,7 +196,7 @@ public class HttpClient {
} else {
FormBody.Builder formBody = new FormBody.Builder();
if (paramMap != null) {
paramMap.forEach(formBody::add);
paramMap.forEach((k, v) -> formBody.add(k, v.toString()));
}
requestBody = formBody.build();
}
......
......@@ -33,7 +33,7 @@ public class RequestMessage extends HttpMesssage {
/**
* Use a LinkedHashMap to preserve the insertion order.
*/
private Map<String, String> parameters = new LinkedHashMap<String, String>();
private Map<String, Object> parameters = new LinkedHashMap<>();
/**
* The original request provided by user
......@@ -84,11 +84,11 @@ public class RequestMessage extends HttpMesssage {
this.platform = platform;
}
public Map<String, String> getParameters() {
public Map<String, Object> getParameters() {
return parameters;
}
public void setParameters(Map<String, String> parameters) {
public void setParameters(Map<String, Object> parameters) {
this.parameters.clear();
if (parameters != null && !parameters.isEmpty()) {
this.parameters.putAll(parameters);
......
......@@ -61,7 +61,6 @@ public class SignUtils {
// Append fixed headers to sign to canonical string
for (Map.Entry<String, String> entry : fixedHeadersToSign.entrySet()) {
Object value = entry.getValue();
canonicalString.append(value);
canonicalString.append(SignParameters.NEW_LINE);
}
......@@ -75,38 +74,16 @@ public class SignUtils {
}
// Append canonical resource to canonical string
canonicalString.append(buildCanonicalizedResource(resourcePath, request.getParameters()));
canonicalString.append(buildCanonicalizedResource(resourcePath));
return canonicalString.toString();
}
private static String buildCanonicalizedResource(String resourcePath, Map<String, String> parameters) {
private static String buildCanonicalizedResource(String resourcePath) {
Assert.isTrue(resourcePath.startsWith("/"), "Resource path should start with slash character");
StringBuilder builder = new StringBuilder();
builder.append(uriEncoding(resourcePath));
if (parameters != null) {
TreeMap<String, String> canonicalizedParams = new TreeMap<String, String>();
for (Map.Entry<String, String> param : parameters.entrySet()) {
if (param.getValue() != null) {
canonicalizedParams.put(uriEncoding(param.getKey()), uriEncoding(param.getValue()));
} else {
canonicalizedParams.put(uriEncoding(param.getKey()), null);
}
}
char separator = '?';
for (Map.Entry<String, String> entry : canonicalizedParams.entrySet()) {
builder.append(separator);
builder.append(entry.getKey());
if (entry.getValue() != null && !entry.getValue().isEmpty()) {
builder.append("=").append(entry.getValue());
}
separator = '&';
}
}
return builder.toString();
}
......
......@@ -56,7 +56,7 @@ public class WecloudImContactsOperation extends WecloudImOperation {
// 参数校验
assertParameterNotNull(userId, "userId");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("clientId", userId + "");
// 发送请求
......@@ -83,7 +83,7 @@ public class WecloudImContactsOperation extends WecloudImOperation {
// 参数校验
assertParameterNotNull(userId, "userId");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("clientId", userId + "");
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(GET_FRIENDS)
......@@ -110,7 +110,7 @@ public class WecloudImContactsOperation extends WecloudImOperation {
assertParameterNotNull(userId, "userId");
assertParameterNotNull(friendId, "friendId");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("clientId", userId + "");
param.put("friendClientId", friendId + "");
param.put("friendName", Optional.ofNullable(friendRequestRequest.getFriendName()).orElse(""));
......@@ -140,7 +140,7 @@ public class WecloudImContactsOperation extends WecloudImOperation {
assertParameterNotNull(userId, "userId");
assertParameterNotNull(friendId, "friendId");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("conversationId", conversationId + "");
param.put("clientId", userId + "");
param.put("friendClientId", friendId + "");
......@@ -172,7 +172,7 @@ public class WecloudImContactsOperation extends WecloudImOperation {
if (pageBlacklistRequest.getPageSize() == null) {
pageBlacklistRequest.setPageSize(10);
}
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("clientId", pageBlacklistRequest.getUserId());
param.put("pageIndex", pageBlacklistRequest.getPageIndex() + "");
param.put("pageSize", pageBlacklistRequest.getPageSize() + "");
......@@ -196,7 +196,7 @@ public class WecloudImContactsOperation extends WecloudImOperation {
assertParameterNotBlank(userId, "userId");
assertParameterNotBlank(friendUserIds, "friendUserIds");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("userId", userId);
param.put("friendUserIds", friendUserIds);
// 发送请求
......@@ -219,7 +219,7 @@ public class WecloudImContactsOperation extends WecloudImOperation {
assertParameterNotBlank(userId, "userId");
assertParameterNotBlank(friendUserId, "friendUserId");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("userId", userId);
param.put("friendUserId", friendUserId);
param.put("friendRemark", remark);
......
......@@ -46,7 +46,7 @@ public class WecloudImConversationOperation extends WecloudImOperation {
assertParameterNotNull(conversationId, "conversationId");
assertParameterNotNull(top, "top");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("clientId", userId);
param.put("conversationId", conversationId.toString());
param.put("type", "TOP");
......@@ -76,7 +76,7 @@ public class WecloudImConversationOperation extends WecloudImOperation {
assertParameterNotNull(conversationId, "conversationId");
assertParameterNotNull(doNotDisturb, "doNotDisturb");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("clientId", userId);
param.put("conversationId", conversationId.toString());
param.put("type", "DO_NOT_DISTURB");
......@@ -101,7 +101,7 @@ public class WecloudImConversationOperation extends WecloudImOperation {
// 参数校验
assertParameterNotNull(listConversationRequest.getConversationIds(), "conversationIds");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("chatType", listConversationRequest.getChatType() + "");
param.put("conversationIds", JSON.toJSONString(listConversationRequest.getConversationIds()));
// 发送请求
......
......@@ -61,9 +61,9 @@ public class WecloudImGroupOperation extends WecloudImOperation {
assertParameterNotBlank(userId, "userId");
assertParameterNotBlank(memberIds, "memberIds");
// 校验通过 构建参数
TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(createGroupRequest), typeReference);
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(createGroupRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(CREATE_GROUP_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
......@@ -86,9 +86,9 @@ public class WecloudImGroupOperation extends WecloudImOperation {
assertParameterNotBlank(userId, "userId");
assertParameterNotBlank(groupId, "groupId");
// 校验通过 构建参数
TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(dismissGroupRequest), typeReference);
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(dismissGroupRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(DISMISS_GROUP_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
......@@ -113,9 +113,9 @@ public class WecloudImGroupOperation extends WecloudImOperation {
assertParameterNotBlank(groupId, "groupId");
assertParameterNotBlank(userIds, "userIds");
// 校验通过 构建参数
TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(joinGroupRequest), typeReference);
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(joinGroupRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(JOIN_GROUP_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
......@@ -140,9 +140,9 @@ public class WecloudImGroupOperation extends WecloudImOperation {
assertParameterNotBlank(groupId, "groupId");
assertParameterNotBlank(userIds, "userIds");
// 校验通过 构建参数
TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(leaveGroupRequest), typeReference);
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(leaveGroupRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(LEAVE_GROUP_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
......@@ -163,9 +163,9 @@ public class WecloudImGroupOperation extends WecloudImOperation {
// 必填参数校验
assertParameterNotBlank(groupId, "groupId");
// 校验通过 构建参数
TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(listGroupMembersRequest), typeReference);
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(listGroupMembersRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(LIST_GROUP_MEMBERS_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
......@@ -213,7 +213,7 @@ public class WecloudImGroupOperation extends WecloudImOperation {
}
// 校验完成,构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("type", type.name());
param.put("groupId", groupId);
param.put("operatorClientId", operatorClientId);
......@@ -252,7 +252,7 @@ public class WecloudImGroupOperation extends WecloudImOperation {
assertParameterNotNull(muted, "muted");
assertParameterNotBlank(userIds, "userIds");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("groupId", groupId);
param.put("muted", muted.toString());
param.put("userIds", userIds);
......@@ -272,7 +272,7 @@ public class WecloudImGroupOperation extends WecloudImOperation {
assertParameterNotNull(newGroupOwnerUserId, "newGroupOwnerUserId");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("groupId", groupId);
param.put("newGroupOwnerUserId", newGroupOwnerUserId);
// 发送请求
......@@ -291,7 +291,7 @@ public class WecloudImGroupOperation extends WecloudImOperation {
assertParameterNotBlank(groupId, "groupId");
assertParameterNotNull(adminUserIds, "adminUserIds");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("groupId", groupId);
param.put("adminUserIds", adminUserIds);
// 发送请求
......@@ -309,7 +309,7 @@ public class WecloudImGroupOperation extends WecloudImOperation {
assertParameterNotBlank(groupId, "groupId");
assertParameterNotNull(adminUserIds, "adminUserIds");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("groupId", groupId);
param.put("adminUserIds", adminUserIds);
// 发送请求
......
......@@ -49,9 +49,9 @@ public class WecloudImMessageOperation extends WecloudImOperation {
assertParameterNotNull(messageType, "messageType");
assertParameterNotNull(content, "content");
// 校验通过 构建参数
TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(publishGroupChatMessageRequest), typeReference);
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(publishGroupChatMessageRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(PUBLISH_GROUP_CHAT_MESSAGE_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
......@@ -78,9 +78,9 @@ public class WecloudImMessageOperation extends WecloudImOperation {
assertParameterNotNull(messageType, "messageType");
assertParameterNotNull(content, "content");
// 校验通过 构建参数
TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(publishGroupChatStatusMessageRequest), typeReference);
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(publishGroupChatStatusMessageRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(PUBLISH_GROUP_CHAT_STATUS_MESSAGE_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
......@@ -100,9 +100,9 @@ public class WecloudImMessageOperation extends WecloudImOperation {
assertParameterNotNull(messageType, "messageType");
assertParameterNotNull(content, "content");
// 校验通过 构建参数
TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(publishPrivateChatMessageRequest), typeReference);
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(publishPrivateChatMessageRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(PUBLISH_PRIVATE_CHAT_MESSAGE_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
......@@ -122,9 +122,9 @@ public class WecloudImMessageOperation extends WecloudImOperation {
assertParameterNotNull(messageType, "messageType");
assertParameterNotNull(content, "content");
// 校验通过 构建参数
TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(publishPrivateChatStatusMessageRequest), typeReference);
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(publishPrivateChatStatusMessageRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(PUBLISH_PRIVATE_CHAT_STATUS_MESSAGE_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
......
package com.wecloud.im.sdk.internal;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.wecloud.im.sdk.common.HttpMethod;
......@@ -8,10 +12,6 @@ import com.wecloud.im.sdk.model.ImRtcRecord;
import com.wecloud.im.sdk.model.PageResult;
import com.wecloud.im.sdk.model.RtcRecordRequest;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import static com.wecloud.im.sdk.ResourcePathConstants.LIST_RTCRECORDS_REQUEST;
/**
......@@ -29,7 +29,7 @@ public class WecloudImRtcRecordOperation extends WecloudImOperation {
public PageResult<ImRtcRecord> listRtcRecords(RtcRecordRequest rtcRecordRequest) {
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("pageNum",rtcRecordRequest.getPageNum()+"");
param.put("pageSize",rtcRecordRequest.getPageSize()+"");
if (rtcRecordRequest.getFromClientId() != null && !"".equals(rtcRecordRequest.getFromClientId())){
......
package com.wecloud.im.sdk.internal;
import java.net.URL;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.wecloud.im.sdk.common.HttpMethod;
import com.wecloud.im.sdk.common.RequestMessage;
import com.wecloud.im.sdk.model.SingleUserNotificationRequest;
import static com.wecloud.im.sdk.ResourcePathConstants.SINGLE_USER_NOTIFICATION;
import static com.wecloud.im.sdk.utils.CodingUtils.assertParameterNotNull;
/**
* 系统通知操作
* @Author luozh
* @Date 2022年05月10日 09:30
* @Version 1.0
*/
public class WecloudImSystemNotificationOperation extends WecloudImOperation {
public WecloudImSystemNotificationOperation(URL apiDomain, String appKey, String appSecret) {
super(apiDomain, appKey, appSecret);
}
public Boolean singleUserNotification(SingleUserNotificationRequest singleUserNotificationRequest) {
String fromUserId = singleUserNotificationRequest.getFromUserId();
String toUserIds = singleUserNotificationRequest.getToUserIds();
String messageType = singleUserNotificationRequest.getMessageType();
String content = singleUserNotificationRequest.getContent();
// 必填参数校验
assertParameterNotNull(fromUserId, "fromUserId");
assertParameterNotNull(toUserIds, "toUserIds");
assertParameterNotNull(messageType, "messageType");
assertParameterNotNull(content, "content");
// 校验通过 构建参数
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(singleUserNotificationRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(SINGLE_USER_NOTIFICATION)
.setMethod(HttpMethod.POST).setParameters(param)
.setOriginalRequest(singleUserNotificationRequest).build();
doOperation(request);
return true;
}
}
......@@ -11,6 +11,7 @@ import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.wecloud.im.sdk.common.HttpMethod;
import com.wecloud.im.sdk.common.RequestMessage;
import com.wecloud.im.sdk.model.Attributes;
import com.wecloud.im.sdk.model.BannedUserRequest;
import com.wecloud.im.sdk.model.ChatRoomMember;
import com.wecloud.im.sdk.model.ClientLoginRequest;
......@@ -22,7 +23,6 @@ import com.wecloud.im.sdk.model.ModifyUserAttributesRequest;
import com.wecloud.im.sdk.model.ModifyUserRequest;
import com.wecloud.im.sdk.model.RegisterClientRequest;
import com.wecloud.im.sdk.model.Token;
import com.wecloud.im.sdk.model.UserAttributes;
import com.wecloud.im.sdk.model.UserRelationRequest;
import com.wecloud.im.sdk.model.UsersRelationRequest;
......@@ -61,7 +61,7 @@ public class WecloudImUserOperation extends WecloudImOperation {
// 参数校验
assertParameterNotNull(userId, "userId");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("userId", registerClientRequest.getUserId() + "");
param.put("headPortrait", Optional.ofNullable(registerClientRequest.getHeadPortrait()).orElse(""));
param.put("nickname", Optional.ofNullable(registerClientRequest.getNickname()).orElse(""));
......@@ -89,7 +89,7 @@ public class WecloudImUserOperation extends WecloudImOperation {
assertParameterNotNull(userId, "userId");
assertParameterNotNull(deviceType, "deviceType");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("deviceType", clientLoginRequest.getDeviceType() + "");
param.put("clientId", clientLoginRequest.getUserId() + "");
......@@ -119,7 +119,7 @@ public class WecloudImUserOperation extends WecloudImOperation {
assertParameterNotBlank(headPortrait, "headPortrait");
assertParameterNotBlank(nickname, "headPortrait");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("userId", userId + "");
param.put("headPortrait", headPortrait);
param.put("nickname", nickname);
......@@ -144,7 +144,7 @@ public class WecloudImUserOperation extends WecloudImOperation {
// 参数校验
assertParameterNotNull(listChatRoomMemberRequest.getChatRoomId(), "chatRoomId");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("chatRoomId", listChatRoomMemberRequest.getChatRoomId() + "");
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(LIST_CHAT_ROOM_MEMBER_REQUEST)
......@@ -171,7 +171,7 @@ public class WecloudImUserOperation extends WecloudImOperation {
assertParameterNotBlank(clientId, "userId");
assertParameterNotBlank(friendClientId, "friendUserId");
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("clientId", clientId);
param.put("friendClientId", friendClientId);
// 发送请求
......@@ -194,7 +194,7 @@ public class WecloudImUserOperation extends WecloudImOperation {
Integer minute = bannedUserRequest.getMinute();
assertParameterNotBlank(userId, "userId");
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("clientId", userId);
param.put("minute", minute.toString());
// 发送请求
......@@ -207,11 +207,11 @@ public class WecloudImUserOperation extends WecloudImOperation {
return flag;
}
public UserAttributes getUserAttributes(GetUserAttributesRequest getUserAttributesRequest) {
public Attributes getUserAttributes(GetUserAttributesRequest getUserAttributesRequest) {
String userId = getUserAttributesRequest.getUserId();
assertParameterNotBlank(userId, "userId");
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("userId", userId);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(GET_USER_ATTRIBUTES_REQUEST)
......@@ -219,19 +219,19 @@ public class WecloudImUserOperation extends WecloudImOperation {
.setOriginalRequest(getUserAttributesRequest).build();
Object result = doOperation(request);
UserAttributes userAttributes = JSON.parseObject(JSON.toJSONString(result), UserAttributes.class);
return userAttributes;
Attributes attributes = JSON.parseObject(JSON.toJSONString(result), Attributes.class);
return attributes;
}
public Boolean modifyUserAttributes(ModifyUserAttributesRequest modifyUserAttributesRequest) {
String userId = modifyUserAttributesRequest.getUserId();
UserAttributes attributes = modifyUserAttributesRequest.getAttributes();
Attributes attributes = modifyUserAttributesRequest.getAttributes();
assertParameterNotBlank(userId, "userId");
assertParameterNotNull(attributes, "attributes");
// 校验通过 构建参数
TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(modifyUserAttributesRequest), typeReference);
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(modifyUserAttributesRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(MODIFY_USER_ATTRIBUTES_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
......
......@@ -21,9 +21,9 @@ public class WecloudRequestMessageBuilder {
private HttpMethod method = HttpMethod.GET;
private Map<String, String> headers = new HashMap<String, String>();
private Map<String, String> headers = new HashMap<>();
private Map<String, String> parameters = new LinkedHashMap<String, String>();
private Map<String, Object> parameters = new LinkedHashMap<>();
private WebServiceRequest originalRequest;
......@@ -64,16 +64,16 @@ public class WecloudRequestMessageBuilder {
return this;
}
public Map<String, String> getParameters() {
public Map<String, Object> getParameters() {
return Collections.unmodifiableMap(parameters);
}
public WecloudRequestMessageBuilder setParameters(Map<String, String> parameters) {
public WecloudRequestMessageBuilder setParameters(Map<String, Object> parameters) {
this.parameters = parameters;
return this;
}
public WecloudRequestMessageBuilder addParameter(String key, String value) {
public WecloudRequestMessageBuilder addParameter(String key, Object value) {
parameters.put(key, value);
return this;
}
......@@ -89,7 +89,7 @@ public class WecloudRequestMessageBuilder {
public RequestMessage build() {
Map<String, String> sentHeaders = new HashMap<String, String>(this.headers);
Map<String, String> sentParameters = new LinkedHashMap<String, String>(this.parameters);
Map<String, Object> sentParameters = new LinkedHashMap<String, Object>(this.parameters);
RequestMessage request = new RequestMessage(this.originalRequest);
request.setEndpoint(endpoint);
request.setHeaders(sentHeaders);
......
......@@ -8,20 +8,20 @@ import java.util.Set;
import cn.hutool.core.lang.Assert;
/**
*
* 拓展属性
* @Author luozh
* @Date 2022年05月19日 16:30
* @Version 1.0
*/
public class UserAttributes extends HashMap<String, Object> {
public class Attributes extends HashMap<String, Object> {
final Map<String, Object> attributes;
public UserAttributes() {
public Attributes() {
attributes = new HashMap<>(8);
}
public UserAttributes(Map<String, Object> attributes) {
public Attributes(Map<String, Object> attributes) {
Assert.notNull(attributes, "MultiValueMap must not be null");
this.attributes = attributes;
}
......@@ -100,11 +100,11 @@ public class UserAttributes extends HashMap<String, Object> {
if (this == other) {
return true;
}
if (!(other instanceof UserAttributes)) {
if (!(other instanceof Attributes)) {
return false;
}
UserAttributes otherUserAttributes = (UserAttributes) other;
return this.attributes.equals(otherUserAttributes.attributes);
Attributes otherAttributes = (Attributes) other;
return this.attributes.equals(otherAttributes.attributes);
}
@Override
......
package com.wecloud.im.sdk.model;
import lombok.Data;
/**
*
* @Author luozh
* @Date 2022年05月25日 10:02
* @Version 1.0
*/
@Data
public class ConversationExt {
/**
* 名称
*/
private String name;
/**
* 拓展属性
*/
private Attributes attributes;
}
......@@ -23,6 +23,6 @@ public class ModifyUserAttributesRequest extends WebServiceRequest {
/**
* 参数
*/
private UserAttributes attributes;
private Attributes attributes;
}
package com.wecloud.im.sdk.model;
import lombok.Data;
/**
* @author nanqianhao
* @date 2022/5/23
* @apiNote
*/
@Data
public class RtcRecord {
/**
* 发送者id
*/
private String fromClientId;
/**
* 接受者id
*/
private String toClientId;
/**
* 房间id
*/
private String channelId;
/**
* 通话记录类型 1视频 2音频
*/
private Integer callType;
/***
* 页码
*/
private Integer pageNum;
/**
* 每页数量
*/
private Integer pageSize;
}
package com.wecloud.im.sdk.model;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
......@@ -8,6 +9,7 @@ import lombok.EqualsAndHashCode;
* @date 2022/5/23
* @apiNote
*/
@Builder
@Data
@EqualsAndHashCode(callSuper = true)
public class RtcRecordRequest extends WebServiceRequest{
......
package com.wecloud.im.sdk.model;
import lombok.Builder;
import lombok.Data;
import lombok.experimental.Tolerate;
/**
* 单个用户通知
* @Author luozh
* @Date 2022年05月05日 11:49
* @Version 1.0
*/
@Builder
@Data
public class SingleUserNotification {
/**
* 发送人用户id
*/
private String fromUserId;
/**
* 指定一个或多个用户
*/
private String toUserIds;
/**
* 消息类型
*/
private String messageType;
/**
* 消息
*/
private String content;
/**
* 指定离线推送通知中的推送内容
*/
private String pushContent;
/**
* 是否存储此条消息
*/
private Boolean persisted;
/**
* 推送拓展配置
*/
private PushExtParam pushExt;
/**
* 会话拓展配置
*/
private ConversationExt conversationExt;
@Tolerate
public SingleUserNotification() {
}
}
package com.wecloud.im.sdk.model;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Tolerate;
/**
* 单个用户通知 请求
* @Author luozh
* @Date 2022年05月05日 11:49
* @Version 1.0
*/
@EqualsAndHashCode(callSuper = true)
@Builder
@Data
public class SingleUserNotificationRequest extends WebServiceRequest {
/**
* 发送人用户id
*/
private String fromUserId;
/**
* 指定一个或多个用户
*/
private String toUserIds;
/**
* 消息类型
*/
private String messageType;
/**
* 消息
*/
private String content;
/**
* 指定离线推送通知中的推送内容
*/
private String pushContent;
/**
* 是否存储此条消息
*/
private Boolean persisted;
/**
* 推送拓展配置
*/
private PushExtParam pushExt;
/**
* 会话拓展配置
*/
private ConversationExt conversationExt;
@Tolerate
public SingleUserNotificationRequest() {
}
}
......@@ -3,6 +3,7 @@ package com.wecloud.im.sdk.sample;
import com.alibaba.fastjson.JSONObject;
import com.wecloud.im.sdk.WecloudIm;
import com.wecloud.im.sdk.WecloudImClientBuilder;
import com.wecloud.im.sdk.model.ClientRelation;
/**
*
......@@ -17,10 +18,13 @@ public class ModifySample {
"QizKVHcILRWp6Td2",
"287d04828099fb7de871e9dda845fa8b6b2302faf2ab3737");
String userId = "20220413001";
String headPortrait = "http://123";
String nickname = "luo_test2";
Boolean result = im.modifyUser(userId, nickname, headPortrait);
System.out.println("\t modify user result=" + JSONObject.toJSONString(result));
String userId = "1526928068558675968";
String friendId = "1526804546603610112";
// String headPortrait = "http://123";
// String nickname = "luo_test2";
ClientRelation result = im.userRelation(userId, friendId);
ClientRelation result2 = im.userRelation(friendId, userId);
System.out.println("\t user relation userId result=" + JSONObject.toJSONString(result));
System.out.println("\t modify user result=" + JSONObject.toJSONString(result2));
}
}
......@@ -25,7 +25,7 @@ public class SignTest {
headers.put(ImHeaders.DATE, date);
headers.put(ImHeaders.CONTENT_TYPE, "application/json; charset=utf-8");
// 请求参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint("/api/imClient/registerClient")
.setMethod(HttpMethod.POST).setParameters(param).addHeaders(headers)
......
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