Commit fca5bb0e by hweeeeeei

将用户添加进会话

parent 66505dce
......@@ -45,8 +45,13 @@ public class ImConversationController extends BaseController {
/**
* TODO 将client从会话移除
* 将client从会话移除
*/
@PostMapping("delClient")
@ApiOperation(value = "将client从会话移除", notes = "")
public ApiResult<Boolean> delClientToConversation(@RequestBody ImClientToConversation imClientToConversation) throws Exception {
return imConversationService.delClientToConversation(imClientToConversation);
}
/**
......@@ -55,7 +60,7 @@ public class ImConversationController extends BaseController {
@PostMapping("addClient")
@ApiOperation(value = "将用户添加进会话", notes = "")
public ApiResult<Boolean> addClientToConversation(@RequestBody ImClientToConversation imClientToConversation) throws Exception {
return imConversationService.ImClientToConversation(imClientToConversation);
return imConversationService.addClientToConversation(imClientToConversation);
}
/**
......
......@@ -23,7 +23,7 @@ public class ImClientToConversation extends BaseEntity {
@ApiModelProperty("会话表id")
private Long conversationId;
@ApiModelProperty("可选 邀请加入会话的客户端,如创建单聊,则填入对方的clientId")
@ApiModelProperty("要操作的clientId")
private List<String> clientIds;
}
......@@ -49,7 +49,17 @@ public interface ImConversationService extends BaseService<ImConversation> {
* @return
* @throws JsonProcessingException
*/
ApiResult<Boolean> ImClientToConversation(ImClientToConversation imClientToConversation);
ApiResult<Boolean> addClientToConversation(ImClientToConversation imClientToConversation);
/**
* 将client从会话移除
*
* @param imClientToConversation
* @return
*/
ApiResult<Boolean> delClientToConversation(ImClientToConversation imClientToConversation);
/**
* 修改
......
package com.wecloud.im.service;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.param.ImHistoryMessagePageParam;
import com.wecloud.im.param.add.ImMsgRecall;
......@@ -21,6 +23,9 @@ import java.util.List;
public interface ImMessageService extends BaseService<ImMessage> {
ImMessage saveImMessage(ImApplication imApplication, ImClient imClientSender, Long toConversationId, long messageId, String content);
/**
* 消息撤回 只能撤回客户端自己发送的消息
*
......
......@@ -11,6 +11,8 @@ import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.entity.ImMessageOnlineSend;
import com.wecloud.im.mapper.ImConversationMapper;
import com.wecloud.im.param.ImConversationPageParam;
import com.wecloud.im.param.ImConversationQueryVo;
......@@ -25,6 +27,9 @@ import com.wecloud.im.service.ImMessageService;
import com.wecloud.im.vo.ImConversationCreateVo;
import com.wecloud.im.vo.MyConversationListVo;
import com.wecloud.im.vo.OfflineMsgDto;
import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.WsResponseModel;
import com.wecloud.im.ws.service.WriteDataService;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
......@@ -42,6 +47,7 @@ import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 会话表 服务实现类
......@@ -53,6 +59,12 @@ import java.util.List;
@Service
public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMapper, ImConversation> implements ImConversationService {
private static final JsonMapper JSON_MAPPER = new JsonMapper();
@Autowired
private WriteDataService writeDataService;
@Autowired
private ImConversationMapper imConversationMapper;
......@@ -208,13 +220,26 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
}
@Override
public ApiResult<Boolean> ImClientToConversation(ImClientToConversation imClientToConversation) {
public ApiResult<Boolean> addClientToConversation(ImClientToConversation imClientToConversation) {
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken();
// 根据appKey查询application
ImApplication imApplication = imApplicationService.getOneByAppKey(curentJwtToken.getAppKey());
ImClient imClientSender = imClientService.getCurentClient();
// 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list(
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId())
.notIn(ImConversationMembers::getId, imClientSender.getId())
);
if (membersList.isEmpty()) {
log.info("membersList为空,toConversationId:" + imClientToConversation.getConversationId());
return ApiResult.fail();
}
// 将他人添加到会话
for (String id : imClientToConversation.getClientIds()) {
......@@ -223,12 +248,17 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
.eq(ImClient::getClientId, id));
// 判断用户是否已经在该会话
imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda()
ImConversationMembers members = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkAppid, imApplication.getId())
.eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId())
.eq(ImConversationMembers::getFkClientId, client2.getId())
);
// 已经在该会话 则跳过
if (members != null) {
continue;
}
Long imConversationMembersId2 = SnowflakeUtil.getId();
ImConversationMembers imConversationMembers2 = new ImConversationMembers();
imConversationMembers2.setId(imConversationMembersId2);
......@@ -237,7 +267,81 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imConversationMembers2.setFkConversationId(imClientToConversation.getConversationId());
imConversationMembers2.setFkClientId(client2.getId());
imConversationMembersService.save(imConversationMembers2);
// ws邀请事件通知给群内其他人 ----------
// 生成消息id
long messageId = SnowflakeUtil.getId();
ImMessage imMessage = new ImMessage();
Map<String, Object> content = new HashMap<>();
content.put("operator", imClientSender.getClientId()); //操作的client ID
content.put("passivityOperator", client2.getClientId()); //被操作的client ID
content.put("type", -1007); //xx邀请xx加入会话 -1007
try {
String asString = JSON_MAPPER.writeValueAsString(content);
imMessage.setContent(asString);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
// 保存消息至消息表
imMessage.setId(messageId);
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(imApplication.getId());
imMessage.setSender(imClientSender.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystem(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(imClientToConversation.getConversationId());
boolean save = imMessageService.save(imMessage);
// 遍历发送
for (ImConversationMembers conversationMembers : membersList) {
// 查询接收方
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getId, conversationMembers.getFkClientId()));
if (imClientReceiver == null) {
continue;
}
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(messageId);
imMessageOnlineSend.setSender(imClientSender.getClientId());
imMessageOnlineSend.setContent((HashMap) content);
imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId());
imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
// 向接收方推送
WsResponseModel<ImMessageOnlineSend> responseModel = new WsResponseModel<>();
responseModel.setCmd(WsResponseCmdEnum.CONVERSATION_EVENT_MSG.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setData(imMessageOnlineSend);
responseModel.setReqId(null);
writeDataService.write(responseModel, imApplication.getAppKey(), imClientReceiver.getClientId());
}
}
return ApiResult.ok();
}
@Override
public ApiResult<Boolean> delClientToConversation(ImClientToConversation imClientToConversation) {
return ApiResult.ok();
}
......
......@@ -76,6 +76,24 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
private WriteDataService writeDataService;
@Override
public ImMessage saveImMessage(ImApplication imApplication, ImClient imClientSender, Long toConversationId, long messageId, String content) {
ImMessage imMessage = new ImMessage();
imMessage.setId(messageId);
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(imApplication.getId());
imMessage.setSender(imClientSender.getId());
imMessage.setContent(content);
imMessage.setWithdraw(false);
imMessage.setEvent(false);
imMessage.setSystem(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(toConversationId);
this.save(imMessage);
return imMessage;
}
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> updateMsgWithdrawById(ImMsgRecall imMsgRecall) {
ImClient imClientSender = imClientService.getCurentClient();
......
......@@ -8,6 +8,11 @@ package com.wecloud.im.ws.enums;
public enum WsResponseCmdEnum {
/**
* 会话中的事件
*/
CONVERSATION_EVENT_MSG(5),
/**
* 下发在线RTC事件
*/
SINGLE_RTC_MSG(4),
......
......@@ -137,7 +137,7 @@ public class ImChatConcrete extends ImCmdAbstract {
// 生成消息id
long messageId = SnowflakeUtil.getId();
// 保存消息至消息表
ImMessage imMessage = saveImMessage(imApplication, imClientSender, toConversationId, messageId, content);
ImMessage imMessage = imMessageService.saveImMessage(imApplication, imClientSender, toConversationId, messageId, content);
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
......@@ -210,21 +210,6 @@ public class ImChatConcrete extends ImCmdAbstract {
return imClientSender;
}
private ImMessage saveImMessage(ImApplication imApplication, ImClient imClientSender, Long toConversationId, long messageId, String content) {
ImMessage imMessage = new ImMessage();
imMessage.setId(messageId);
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(imApplication.getId());
imMessage.setSender(imClientSender.getId());
imMessage.setContent(content);
imMessage.setWithdraw(false);
imMessage.setEvent(false);
imMessage.setSystem(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(toConversationId);
imMessageService.save(imMessage);
return imMessage;
}
private boolean black(ReceiveModel receiveModel, String appKey, String clientUniId, ImClient imClientSender, List<ImConversationMembers> membersList) {
// 判断是否被拉黑
......
# wecloud-im 前端Websocket对接文档
# wecloud-im 前端Websocket对接文档
......@@ -450,6 +450,93 @@ websocket是异步的 有可能你很快速的发送了几条消息,服务器响
- xx已读某条消息 -1010
- 你被xx拉入新会话 -1011
### 下发 xx被xx移出会话
type为-1008
"cmd":5
该event事件消息类型需要已读和已接收回执,该消息会存入离线消息列表和消息历史记录列表
```json
{
"cmd":5,
"code":200,
"msg":"成功",
"data":{
"msgId":1427109835333308416,
"createTime":1629086007054,
"content":{
"operator":"aaaaa1",
"passivityOperator":"aaaaa2",
"type":-1008
},
"event":true,
"conversationId":1427109730563788800
},
"reqId":null
}
```
**参数描述**
| 字段名 | 字段类型 | 是否可空 | 说明 |
| ----------------- | -------- | -------- | ----------------- |
| operator | String | 否 | 操作的client ID |
| passivityOperator | String | 否 | 被操作的client ID |
### 下发 xx邀请xx加入会话
type为-1007
"cmd":5
该event事件消息类型需要已读和已接收回执,该消息会存入离线消息列表和消息历史记录列表
```json
{
"cmd":5,
"code":200,
"msg":"成功",
"data":{
"msgId":1427109835333308416,
"createTime":1629086007054,
"content":{
"operator":"aaaaa1",
"passivityOperator":"aaaaa2",
"type":"-1007"
},
"event":true,
"conversationId":1427109730563788800
},
"reqId":null
}
```
**参数描述**
| 字段名 | 字段类型 | 是否可空 | 说明 |
| ------------------ | -------- | -------- | -------------- |
| operator | String | 否 | 操作的client ID |
| passivityOperator | String | 否 | 被操作的client ID |
### 服务端在线下发 某消息*已接收*状态
receiverId:接收方客户端id
......
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