Commit cc02bc27 by Shadow

sdk 增加创建群聊接口

parent 800059ef
......@@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON;
import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.param.ChatRoomMemberPageParam;
import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.ExitChatRoomParam;
......@@ -289,5 +290,16 @@ public class ImConversationController extends BaseController {
return ApiResult.ok(conversationList);
}
/**
* 创建会话
*/
@PostMapping("/sdk/create")
@ApiOperation(value = "创建会话", notes = "后台可配置:两个客户端如果已经创建过会话,是否重复创建会话")
public ApiResult<Long> create(@RequestBody ImConversationCreate imConversationCreate) throws Exception {
log.info("sdk 创建会话入参 {}", JSON.toJSONString(imConversationCreate));
ImConversation conversation = imConversationService.serverCreateImConversation(imConversationCreate);
return ApiResult.ok(conversation.getId());
}
}
......@@ -34,6 +34,12 @@ public class ImConversationCreate extends BaseEntity {
@ApiModelProperty("可选 邀请加入会话的客户端,如创建单聊,则填入对方的clientId")
private List<String> clientIds;
@ApiModelProperty("创建者id,sdk调用时传递该参数")
private String creatorUserId;
@ApiModelProperty("成员用户id,sdk调用时传递该参数")
private String memberUserIds;
/**
* @see com.wecloud.im.sdk.enums.ChatTypeEnum
*/
......
......@@ -31,7 +31,7 @@ public class ServerImConversationCreate implements Serializable {
private String name;
/**
* tring格式,可选 自定义属性,供开发者扩展使用。")
* Map格式,可选 自定义属性,供开发者扩展使用。")
*/
private Map<String, Object> attributes;
......
......@@ -71,6 +71,14 @@ public interface ImConversationService extends BaseService<ImConversation> {
*/
ImConversation serverCreateImConversation(ServerImConversationCreate imConversationCreate);
/**
* 创建会话 sdk用
*
* @param imConversationCreate
* @return
*/
ImConversation serverCreateImConversation(ImConversationCreate imConversationCreate);
/**
* 将用户添加进会话
......
......@@ -230,4 +230,16 @@ public class ImCallbackServiceImpl implements ImCallbackService {
headers.add("WECLOUD-IM-SIGNATURE", signature);
return headers;
}
public static void main(String[] args) {
// 计算 Signature (数据签名)
String appKey = "QizKVHcILRWp6Td2";
String appSecret = "287d04828099fb7de871e9dda845fa8b6b2302faf2ab3457";
String nonce = NanoId.randomNanoId();
String date = DateUtil.formatHttpDate(new Date());
String signature = SignUtils.buildSignature(appKey, appSecret, nonce, date);
System.out.println("nonce = " + nonce);
System.out.println("date = " + date);
System.out.println("signature = " + signature);
}
}
......@@ -11,6 +11,7 @@ import io.geekidea.springbootplus.framework.shiro.util.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
......@@ -81,6 +82,7 @@ import com.wecloud.im.sdk.enums.GroupRoleEnum;
import com.wecloud.im.sdk.enums.JoinConversationTypeEnum;
import com.wecloud.im.sdk.enums.MutedEnum;
import com.wecloud.im.service.ContextService;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.service.ImConversationMembersService;
import com.wecloud.im.service.ImConversationService;
......@@ -93,6 +95,7 @@ import com.wecloud.im.vo.OfflineMsgDto;
import com.wecloud.im.ws.enums.MsgTypeEnum;
import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.utils.RedisUtils;
import com.wecloud.imserver.client.model.enums.DeviceTypeEnum;
import com.wecloud.utils.JsonUtils;
import com.wecloud.utils.SnowflakeUtil;
......@@ -146,6 +149,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Autowired
private ChatRoomCacheManager chatRoomCacheManager;
@Autowired
private ImApplicationService applicationService;
@Transactional(rollbackFor = Exception.class)
@Override
public boolean saveImConversation(ImConversation imConversation) {
......@@ -218,6 +224,42 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
}
@Override
public ImConversation serverCreateImConversation(ImConversationCreate imConversationCreate) {
// 获取应用
Long appId = SecurityUtils.getCurrentAppId();
ImApplication application = applicationService.getCacheById(appId);
ImClient creator = imClientService.getCacheImClient(appId, imConversationCreate.getCreatorUserId());
List<String> memberIds = Arrays.asList(imConversationCreate.getMemberUserIds().split(","));
// 获取群成员信息
List<ImClient> members =
imClientService.list(Wrappers.<ImClient>lambdaQuery().eq(ImClient::getFkAppid, appId).in(ImClient::getClientId, memberIds));
if (members.isEmpty()) {
throw new BusinessException("成员列表为空");
}
ChatTypeEnum chatTypeEnum = null;
for (ChatTypeEnum value : ChatTypeEnum.values()) {
if (value.getCode().equals(imConversationCreate.getChatType())) {
chatTypeEnum = value;
break;
}
}
ServerImConversationCreate conversationCreate = new ServerImConversationCreate();
conversationCreate.setName(imConversationCreate.getName());
conversationCreate.setAttributes(imConversationCreate.getAttributes());
conversationCreate.setApplication(application);
conversationCreate.setCreator(creator);
conversationCreate.setMembers(members);
conversationCreate.setChatType(chatTypeEnum);
conversationCreate.setPlatform(DeviceTypeEnum.IOS);
return this.serverCreateImConversation(conversationCreate);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean addClientToConversation(ImClientToConversation imClientToConversation) {
......@@ -1315,11 +1357,6 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 如果存在重复单聊类型会话,则不会为空
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;
......
......@@ -174,6 +174,11 @@ public class ResourcePathConstants {
/**
* 单次发布
*/
public static final String SINGLE_USER_NOTIFICATION = "/api/imMessage/system-notification/publish";
public static final String SINGLE_USER_NOTIFICATION_REQUEST = "/api/imMessage/system-notification/publish";
/**
* 创建会话
*/
public static final String CREATE_CONVERSATION_REQUEST = "/api/conversation/sdk/create";
}
......@@ -7,6 +7,7 @@ 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.CreateConversation;
import com.wecloud.im.sdk.model.Friend;
import com.wecloud.im.sdk.model.GroupChatMessage;
import com.wecloud.im.sdk.model.GroupChatStatusMessage;
......@@ -171,6 +172,23 @@ public interface WecloudIm {
PageResult<Blacklist> pageBlacklist(Integer pageIndex, Integer pageSize, String userId);
/**
* 创建会话
* @Author Shadow
* @Date 2022年05月31日 03:54:49
* @param
* @Return
*/
Long createConversation(CreateConversation createConversation);
/**
* 批量获取会话信息
* @param chatType 会话属性,1:单聊,2:普通群,3:万人群,4:聊天室
* @param conversationIds
* @return
*/
List<Conversation> listConversation(Integer chatType, List<Long> conversationIds);
/**
* 设置会话置顶
* @Author luozh
* @Date 2022年04月26日 03:33:44
......@@ -210,14 +228,6 @@ public interface WecloudIm {
List<ChatRoomMember> listChatRoomMember(Long chatRoomId);
/**
* 批量获取会话信息
* @param chatType 会话属性,1:单聊,2:普通群,3:万人群,4:聊天室
* @param conversationIds
* @return
*/
List<Conversation> listConversation(Integer chatType, List<Long> conversationIds);
/**
* 发布群聊消息
* @Author luozh
* @Date 2022年05月05日 09:38:34
......@@ -257,7 +267,7 @@ public interface WecloudIm {
* 创建群组
* @Author luozh
* @Date 2022年05月09日 06:34:58
* @param userId 用户id
* @param groupOwnerUserId 用户id
* @param groupName 用户名称
* @param memberIds 群成员
* @Return 创建结果 true/false
......
......@@ -165,6 +165,18 @@ public class WecloudImClient implements WecloudIm {
}
@Override
public Long createConversation(CreateConversation createConversation) {
CreateConversationRequest request = CreateConversationRequest.builder()
.name(createConversation.getName())
.creatorUserId(createConversation.getCreatorUserId())
.memberUserIds(createConversation.getMemberUserIds())
.chatType(createConversation.getChatType())
.attributes(createConversation.getAttributes())
.build();
return imConversationOperation.create(request);
}
@Override
public List<Conversation> listConversation(Integer chatType, List<Long> conversationIds) {
ListConversationRequest request = ListConversationRequest.builder().chatType(chatType)
.conversationIds(conversationIds).build();
......
package com.wecloud.im.sdk.internal;
import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
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.exception.WecloudException;
import com.wecloud.im.sdk.model.Conversation;
import com.wecloud.im.sdk.model.CreateConversationRequest;
import com.wecloud.im.sdk.model.ListConversationRequest;
import com.wecloud.im.sdk.model.SetConversationDoNotDisturbRequest;
import com.wecloud.im.sdk.model.SetConversationTopRequest;
import static com.wecloud.im.sdk.ResourcePathConstants.CHAT_SETTING;
import static com.wecloud.im.sdk.ResourcePathConstants.CREATE_CONVERSATION_REQUEST;
import static com.wecloud.im.sdk.ResourcePathConstants.LIST_CONVERSATION_REQUEST;
import static com.wecloud.im.sdk.utils.CodingUtils.assertParameterNotBlank;
import static com.wecloud.im.sdk.utils.CodingUtils.assertParameterNotNull;
/**
......@@ -115,4 +121,34 @@ public class WecloudImConversationOperation extends WecloudImOperation {
List<Conversation> conversations = JSON.parseObject(JSON.toJSONString(result), typeReference);
return conversations;
}
/**
* 创建会话
* @Author Shadow
* @Date 2022年05月31日 04:26:58
* @param createConversationRequest 创建会话请求
* @Return 会话id
*/
public Long create(CreateConversationRequest createConversationRequest) {
// 参数校验
assertParameterNotBlank(createConversationRequest.getName(), "name");
assertParameterNotBlank(createConversationRequest.getCreatorUserId(), "creatorUserId");
assertParameterNotBlank(createConversationRequest.getMemberUserIds(), "memberUserIds");
assertParameterNotBlank(createConversationRequest.getChatType(), "chatType");
// 校验chatType
String[] allowType = new String[]{"1", "5", "6"};
if (!Arrays.asList(allowType).contains(createConversationRequest.getChatType())) {
throw new WecloudException("chatType 只能为 1 5 6");
}
// 校验通过 构建参数
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(createConversationRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(CREATE_CONVERSATION_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
.setOriginalRequest(createConversationRequest).build();
Object result = doOperation(request);
return JSON.parseObject(JSON.toJSONString(result), Long.class);
}
}
......@@ -10,7 +10,7 @@ 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.ResourcePathConstants.SINGLE_USER_NOTIFICATION_REQUEST;
import static com.wecloud.im.sdk.utils.CodingUtils.assertParameterNotNull;
/**
......@@ -40,7 +40,7 @@ public class WecloudImSystemNotificationOperation extends WecloudImOperation {
};
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(singleUserNotificationRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(SINGLE_USER_NOTIFICATION)
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(SINGLE_USER_NOTIFICATION_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
.setOriginalRequest(singleUserNotificationRequest).build();
doOperation(request);
......
package com.wecloud.im.sdk.model;
import lombok.Data;
import java.util.Map;
/**
* 创建会话
* @Author luozh
* @Date 2022年05月31日 16:09
* @Version 1.0
*/
@Data
public class CreateConversation {
/**
* 会话名称
*/
private String name;
/**
* 创建人用户id
*/
private String creatorUserId;
/**
* 成员用户id
*/
private String memberUserIds;
/**
* 会话属性,1:单聊 5:临时会话 6:系统会话
*/
private String chatType;
/**
* Map格式,可选 自定义属性,供开发者扩展使用。")
*/
private Map<String, Object> attributes;
}
package com.wecloud.im.sdk.model;
import lombok.Builder;
import lombok.Data;
import java.util.Map;
/**
* 创建会话
* @Author luozh
* @Date 2022年05月31日 16:09
* @Version 1.0
*/
@Data
@Builder
public class CreateConversationRequest extends WebServiceRequest {
/**
* 会话名称
*/
private String name;
/**
* 创建人用户id
*/
private String creatorUserId;
/**
* 成员用户id
*/
private String memberUserIds;
/**
* 会话属性,1:单聊 5:临时会话 6:系统会话
*/
private String chatType;
/**
* Map格式,可选 自定义属性,供开发者扩展使用。")
*/
private Map<String, Object> attributes;
}
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