Commit 9f0193f9 by 罗长华

1、增加了ActionRequestHolder用于传递ActionRequest

2、调整对应的Action、Service代码
parent 0ce048a0
...@@ -18,8 +18,11 @@ import com.wecloud.dispatch.registry.ActionBoxRegistry; ...@@ -18,8 +18,11 @@ import com.wecloud.dispatch.registry.ActionBoxRegistry;
import com.wecloud.dispatch.registry.ActionInterceptorRegistry; import com.wecloud.dispatch.registry.ActionInterceptorRegistry;
import com.wecloud.dispatch.registry.ActionRegistry; import com.wecloud.dispatch.registry.ActionRegistry;
import com.wecloud.dispatch.registry.MethodArgumentResolverRegistry; import com.wecloud.dispatch.registry.MethodArgumentResolverRegistry;
import com.wecloud.dispatch.util.ActionRequestHolder;
import io.netty.channel.Channel; import io.netty.channel.Channel;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter; import org.springframework.core.MethodParameter;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
...@@ -49,9 +52,14 @@ public class ActionDispatcher { ...@@ -49,9 +52,14 @@ public class ActionDispatcher {
} }
public Object action(ActionMessage am) { public Object action(ActionMessage am) {
ActionRequest request = getActionRequest(am); // modify by luozh 2022/04/03 获取到ActionRequest后保存到ThreadLocal,便于后面业务获取
try {
return action(request, getArgumentBox()); ActionRequest request = getActionRequest(am);
ActionRequestHolder.setActionRequest(request);
return action(request, getArgumentBox());
} finally {
ActionRequestHolder.remove();
}
} }
public Object action(ActionMessage am, ArgumentBox argumentBox) { public Object action(ActionMessage am, ArgumentBox argumentBox) {
......
package com.wecloud.dispatch.util;
import com.wecloud.dispatch.extend.ActionRequest;
/**
* 记录websocket请求详情信息到当前线程中
* @Author luozh
* @Date 2022年04月03日 23:14
* @Version 1.0
*/
public class ActionRequestHolder {
private static final ThreadLocal<ActionRequest> THREAD_LOCAL = new ThreadLocal<>();
/**
* 从当前线程中获取请求信息
*/
public static ActionRequest getActionRequest() {
return THREAD_LOCAL.get();
}
/**
* 设置请求信息到当前线程中
*
* @param actionRequest
*/
public static void setActionRequest(ActionRequest actionRequest) {
THREAD_LOCAL.set(actionRequest);
}
/**
* 销毁
*/
public static void remove() {
THREAD_LOCAL.remove();
}
}
...@@ -11,7 +11,6 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -11,7 +11,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.wecloud.dispatch.annotation.ActionMapping; import com.wecloud.dispatch.annotation.ActionMapping;
import com.wecloud.dispatch.extend.ActionRequest;
import com.wecloud.im.param.ImClientBlacklistPageParam; import com.wecloud.im.param.ImClientBlacklistPageParam;
import com.wecloud.im.param.ImClientBlacklistQueryVo; import com.wecloud.im.param.ImClientBlacklistQueryVo;
import com.wecloud.im.param.add.ImClientBlacklistUpdate; import com.wecloud.im.param.add.ImClientBlacklistUpdate;
...@@ -26,7 +25,7 @@ import com.wecloud.im.ws.model.WsResponse; ...@@ -26,7 +25,7 @@ import com.wecloud.im.ws.model.WsResponse;
*/ */
@Slf4j @Slf4j
@Component @Component
@ActionMapping(value = "/blacklist") @ActionMapping(value = "/im/blacklist")
@Api(value = "ws-黑名单API", tags = {"黑名单"}) @Api(value = "ws-黑名单API", tags = {"黑名单"})
public class BlacklistAction { public class BlacklistAction {
...@@ -38,8 +37,8 @@ public class BlacklistAction { ...@@ -38,8 +37,8 @@ public class BlacklistAction {
*/ */
@ActionMapping("/add") @ActionMapping("/add")
@ApiOperation(value = "拉入黑名单") @ApiOperation(value = "拉入黑名单")
public WsResponse<Boolean> addImClientBlacklist(ActionRequest request, ImClientBlacklistUpdate data) { public WsResponse<Boolean> addImClientBlacklist(ImClientBlacklistUpdate data) {
imClientBlacklistService.addImClientBlacklist(request, data); imClientBlacklistService.addImClientBlacklist(data);
return WsResponse.ok(); return WsResponse.ok();
} }
...@@ -49,8 +48,8 @@ public class BlacklistAction { ...@@ -49,8 +48,8 @@ public class BlacklistAction {
*/ */
@ActionMapping("/delete") @ActionMapping("/delete")
@ApiOperation(value = "移出黑名单") @ApiOperation(value = "移出黑名单")
public WsResponse<Boolean> deleteImClientBlacklist(ActionRequest request, ImClientBlacklistUpdate data) { public WsResponse<Boolean> deleteImClientBlacklist(ImClientBlacklistUpdate data) {
imClientBlacklistService.removeImClientBlacklist(request, data); imClientBlacklistService.removeImClientBlacklist(data);
return WsResponse.ok(); return WsResponse.ok();
} }
...@@ -60,9 +59,9 @@ public class BlacklistAction { ...@@ -60,9 +59,9 @@ public class BlacklistAction {
@ActionMapping("/getPageList") @ActionMapping("/getPageList")
@OperationLog(name = "黑名单分页列表", type = OperationLogType.PAGE) @OperationLog(name = "黑名单分页列表", type = OperationLogType.PAGE)
@ApiOperation(value = "黑名单分页列表") @ApiOperation(value = "黑名单分页列表")
public WsResponse<Paging<ImClientBlacklistQueryVo>> getImClientBlacklistPageList(ActionRequest request, ImClientBlacklistPageParam data) { public WsResponse<Paging<ImClientBlacklistQueryVo>> getImClientBlacklistPageList(ImClientBlacklistPageParam data) {
Paging<ImClientBlacklistQueryVo> blacklist = Paging<ImClientBlacklistQueryVo> blacklist =
imClientBlacklistService.getImClientBlacklistPageList(request, data); imClientBlacklistService.getImClientBlacklistPageList(data);
return WsResponse.ok(blacklist); return WsResponse.ok(blacklist);
} }
} }
package com.wecloud.im.action; package com.wecloud.im.action;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.shiro.jwt.JwtToken;
import io.geekidea.springbootplus.framework.shiro.util.JwtUtil;
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;
...@@ -15,7 +12,6 @@ import org.springframework.stereotype.Component; ...@@ -15,7 +12,6 @@ import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.wecloud.dispatch.annotation.ActionMapping; import com.wecloud.dispatch.annotation.ActionMapping;
import com.wecloud.dispatch.extend.ActionRequest;
import com.wecloud.im.entity.ImApplication; import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient; import com.wecloud.im.entity.ImClient;
import com.wecloud.im.param.ClientInfoParam; import com.wecloud.im.param.ClientInfoParam;
...@@ -43,7 +39,7 @@ import com.wecloud.im.ws.model.WsResponse; ...@@ -43,7 +39,7 @@ import com.wecloud.im.ws.model.WsResponse;
*/ */
@Slf4j @Slf4j
@Component @Component
@ActionMapping("/client") @ActionMapping("/im/client")
@Api(value = "ws-终端", tags = {"终端"}) @Api(value = "ws-终端", tags = {"终端"})
public class ClientAction { public class ClientAction {
...@@ -64,16 +60,16 @@ public class ClientAction { ...@@ -64,16 +60,16 @@ public class ClientAction {
*/ */
@ActionMapping("/myInfo") @ActionMapping("/myInfo")
@ApiOperation(value = "查询我的信息") @ApiOperation(value = "查询我的信息")
public WsResponse<MyInfoVo> myInfo(ActionRequest request) { public WsResponse<MyInfoVo> myInfo() {
MyInfoVo myInfo = imClientService.getMyInfo(request); MyInfoVo myInfo = imClientService.getMyInfo();
return WsResponse.ok(myInfo); return WsResponse.ok(myInfo);
} }
@ActionMapping("/infoList") @ActionMapping("/infoList")
@ApiOperation(value = "根据id获取Client的头像昵称") @ApiOperation(value = "根据id获取Client的头像昵称")
public WsResponse<List<GetInfoListVo>> getInfoList(ActionRequest request, GetClientInfoParam data) throws Exception { public WsResponse<List<GetInfoListVo>> getInfoList(GetClientInfoParam data) throws Exception {
return WsResponse.ok(imClientService.getInfoList(request, data)); return WsResponse.ok(imClientService.getInfoList(data));
} }
/** /**
...@@ -81,34 +77,34 @@ public class ClientAction { ...@@ -81,34 +77,34 @@ public class ClientAction {
*/ */
@ActionMapping("/clientInfo") @ActionMapping("/clientInfo")
@ApiOperation(value = "查询用户信息 用户可能是好友、陌生人、被拉黑名单的人") @ApiOperation(value = "查询用户信息 用户可能是好友、陌生人、被拉黑名单的人")
public WsResponse<ClientInfoVo> getClientInfo(ActionRequest request, ClientInfoParam data) { public WsResponse<ClientInfoVo> getClientInfo(ClientInfoParam data) {
ClientInfoVo clientInfoVo = imClientService.getClientInfo(request, data); ClientInfoVo clientInfoVo = imClientService.getClientInfo(data);
return WsResponse.ok(clientInfoVo); return WsResponse.ok(clientInfoVo);
} }
@ActionMapping("/updateHeadAndNickname") @ActionMapping("/updateHeadAndNickname")
@ApiOperation(value = "添加或修改头像和昵称") @ApiOperation(value = "添加或修改头像和昵称")
public WsResponse<Boolean> updateHeadAndNickname(ActionRequest request, ImClientHeadPortraitAndNicknameUpdate data) throws Exception { public WsResponse<Boolean> updateHeadAndNickname(ImClientHeadPortraitAndNicknameUpdate data) throws Exception {
log.info("添加或修改头像和昵称入参 {}", JSON.toJSONString(data)); log.info("添加或修改头像和昵称入参 {}", JSON.toJSONString(data));
boolean flag = imClientService.updateHeadAndNickname(request, data); boolean flag = imClientService.updateHeadAndNickname(data);
return WsResponse.ok(flag); return WsResponse.ok(flag);
} }
@ActionMapping("/updateHeadPortrait") @ActionMapping("/updateHeadPortrait")
@ApiOperation(value = "添加或修改头像") @ApiOperation(value = "添加或修改头像")
public WsResponse<Boolean> updateHeadPortrait(ActionRequest request, ImClientHeadPortraitAdd data) throws Exception { public WsResponse<Boolean> updateHeadPortrait(ImClientHeadPortraitAdd data) throws Exception {
log.info("添加或修改头像入参 {}", JSON.toJSONString(data)); log.info("添加或修改头像入参 {}", JSON.toJSONString(data));
boolean flag = imClientService.updateHeadPortrait(request, data); boolean flag = imClientService.updateHeadPortrait(data);
return WsResponse.ok(flag); return WsResponse.ok(flag);
} }
@ActionMapping("/updateNickname") @ActionMapping("/updateNickname")
@ApiOperation(value = "添加或修改主昵称") @ApiOperation(value = "添加或修改主昵称")
public WsResponse<Boolean> updateNickname(ActionRequest request, ImClientNicknameAdd data) throws Exception { public WsResponse<Boolean> updateNickname(ImClientNicknameAdd data) throws Exception {
log.info("添加或修改主昵称入参 {}", JSON.toJSONString(data)); log.info("添加或修改主昵称入参 {}", JSON.toJSONString(data));
boolean flag = imClientService.updateNickname(request, data); boolean flag = imClientService.updateNickname(data);
return WsResponse.ok(flag); return WsResponse.ok(flag);
} }
...@@ -121,9 +117,9 @@ public class ClientAction { ...@@ -121,9 +117,9 @@ public class ClientAction {
*/ */
@ActionMapping("/logout") @ActionMapping("/logout")
@ApiOperation(value = "退出登陆 清除推送token等") @ApiOperation(value = "退出登陆 清除推送token等")
public WsResponse<Boolean> logout(ActionRequest request, LogoutParam param) { public WsResponse<Boolean> logout(LogoutParam param) {
log.info("退出登陆入参 {}", JSON.toJSONString(param)); log.info("退出登陆入参 {}", JSON.toJSONString(param));
boolean flag = imClientService.logout(request, param); boolean flag = imClientService.logout(param);
return WsResponse.ok(flag); return WsResponse.ok(flag);
} }
...@@ -134,10 +130,10 @@ public class ClientAction { ...@@ -134,10 +130,10 @@ public class ClientAction {
*/ */
@ActionMapping("/onlineStatus") @ActionMapping("/onlineStatus")
@ApiOperation(value = "获取用户在线状态(批量)") @ApiOperation(value = "获取用户在线状态(批量)")
public WsResponse<List<ImOnlineStatusVo>> getOnlineStatus(ActionRequest request, public WsResponse<List<ImOnlineStatusVo>> getOnlineStatus(
GetOnlineStatusParam getOnlineStatusParam) { GetOnlineStatusParam getOnlineStatusParam) {
// shiro线程中获取当前token // shiro线程中获取当前token
ImClient imClient = contextService.getImClientIfNotNullOrThrow(request); ImClient imClient = contextService.getImClientIfNotNullOrThrow();
ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(imClient.getFkAppid()); ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(imClient.getFkAppid());
ArrayList<ImOnlineStatusVo> imOnlineStatusVos = new ArrayList<>(); ArrayList<ImOnlineStatusVo> imOnlineStatusVos = new ArrayList<>();
......
package com.wecloud.im.action;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import com.alibaba.fastjson.JSON;
import com.wecloud.dispatch.annotation.ActionMapping;
import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.ImConversationQueryParam;
import com.wecloud.im.param.MutedGroupMemberParam;
import com.wecloud.im.param.MutedGroupParam;
import com.wecloud.im.param.SetAdminsParam;
import com.wecloud.im.param.TransferOwnerParam;
import com.wecloud.im.param.add.ImClientLeaveConversation;
import com.wecloud.im.param.add.ImClientToConversation;
import com.wecloud.im.param.add.ImConversationAttrUpdate;
import com.wecloud.im.param.add.ImConversationCreate;
import com.wecloud.im.param.add.ImConversationDisplayUpdate;
import com.wecloud.im.param.add.ImConversationNameUpdate;
import com.wecloud.im.service.ImConversationService;
import com.wecloud.im.vo.ConversationVo;
import com.wecloud.im.vo.ImConversationCreateVo;
import com.wecloud.im.ws.model.WsResponse;
/**
*
* @Author luozh
* @Date 2022年04月02日 16:39
* @Version 1.0
*/
@Slf4j
@Component
@ActionMapping(value = "/im/conversation")
@Api(value = "ws-会话表API", tags = {"会话表"})
public class ConversationAction {
@Autowired
private ImConversationService imConversationService;
/**
* 添加或修改会话名称
*/
@ActionMapping("/saveOrUpdateName")
@ApiOperation(value = "添加或修改会话名称", notes = "权限:目前只有创建者有权限操作")
public WsResponse<Boolean> saveOrUpdateName(ImConversationNameUpdate data) {
log.info("添加或修改会话名称入参 {}", JSON.toJSONString(data));
imConversationService.saveOrUpdateName(data);
return WsResponse.ok();
}
/**
* 添加或修改会话拓展字段
*/
@ActionMapping("/saveOrUpdateAttr")
@ApiOperation(value = "添加或修改会话拓展字段", notes = "权限:所有client都权限操作")
public WsResponse<Boolean> saveOrUpdateAttr(ImConversationAttrUpdate imConversationAttrUpdate) {
imConversationService.saveOrUpdateAttr(imConversationAttrUpdate);
return WsResponse.ok();
}
/**
* client退出会话
*/
@ActionMapping("/leave")
@ApiOperation(value = "client退出会话", notes = "若是创建者退出,[创建者]权限将会转移给按加入会话时间排序的下一个client")
public WsResponse<Boolean> leaveConversation(ImClientLeaveConversation imClientToConversation) {
log.info("client退出会话入参 {}", JSON.toJSONString(imClientToConversation));
imConversationService.leaveConversation(imClientToConversation);
return WsResponse.ok();
}
/**
* 将client从会话移除
*/
@ActionMapping("/delClient")
@ApiOperation(value = "将client从会话移除", notes = "权限:目前只有群主有权限操作")
public WsResponse<Boolean> delClientToConversation(ImClientToConversation imClientToConversation) throws Exception {
log.info("将client从会话移除入参 {}", JSON.toJSONString(imClientToConversation));
return WsResponse.ok(imConversationService.delClientToConversation(imClientToConversation));
}
/**
* 解散群聊
*/
@ActionMapping("/disband")
@ApiOperation(value = "解散群聊", notes = "权限:目前只有群主有权限操作")
public WsResponse<Boolean> disband(DisbandConversationParam param) throws Exception {
log.info("解散群聊入参 {}", JSON.toJSONString(param));
imConversationService.disband(param);
return WsResponse.ok();
}
/**
* 将用户添加进会话
*/
@ActionMapping("/addClient")
@ApiOperation(value = "将用户添加进会话", notes = "权限:会话中所有client都有权限操作")
public WsResponse<Boolean> addClientToConversation(ImClientToConversation imClientToConversation) throws Exception {
log.info("将用户添加进会话入参 {}", JSON.toJSONString(imClientToConversation));
imConversationService.addClientToConversation(imClientToConversation);
return WsResponse.ok();
}
/**
* 创建会话
*/
@ActionMapping("/create")
@ApiOperation(value = "创建会话", notes = "后台可配置:两个客户端如果已经创建过会话,是否重复创建会话")
public WsResponse<ImConversationCreateVo> createImConversation(ImConversationCreate imConversationCreate) throws Exception {
log.info("创建会话入参 {}", JSON.toJSONString(imConversationCreate));
ImConversationCreateVo vo = imConversationService.createImConversation(imConversationCreate);
return WsResponse.ok(vo);
}
/**
* 群主转让
*/
@ActionMapping("/transferOwner")
@ApiOperation(value = "群主转让", notes = "权限:目前只有群主有权限操作")
public WsResponse<Boolean> transferOwner(TransferOwnerParam param) {
log.info("群主转让入参 {}", JSON.toJSONString(param));
Boolean result = imConversationService.transferOwner(param);
return WsResponse.ok(result);
}
/**
* 设置群管理员
*/
@ActionMapping("/setAdmins")
@ApiOperation(value = "设置群管理员", notes = "权限:目前只有群主有权限操作")
public WsResponse<Boolean> setAdmins(@Validated SetAdminsParam param) {
log.info("设置群管理员入参 {}", JSON.toJSONString(param));
if (CollectionUtils.isEmpty(param.getClientIds())) {
return WsResponse.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
Boolean result = imConversationService.setAdmins(param);
return WsResponse.ok(result);
}
/**
* 群禁言、取消群禁言
*/
@ActionMapping("/mutedGroup")
@ApiOperation(value = "群禁言、取消群禁言", notes = "权限:群主和管理员有权限操作")
public WsResponse<Boolean> mutedGroup(@Validated MutedGroupParam param) {
log.info("群禁言、取消群禁言入参 {}", JSON.toJSONString(param));
Boolean result = imConversationService.mutedGroup(param);
return WsResponse.ok(result);
}
/**
* 选择禁言
*/
@ActionMapping("/mutedGroupMember")
@ApiOperation(value = "选择禁言", notes = "权限:群主和管理员有权限操作")
public WsResponse<Boolean> mutedGroupMember(@Validated MutedGroupMemberParam param) {
log.info("选择禁言入参 {}", JSON.toJSONString(param));
if (CollectionUtils.isEmpty(param.getClientIds())) {
return WsResponse.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
Boolean result = imConversationService.mutedGroupMember(param);
return WsResponse.ok(result);
}
/**
* 查询用户加入的所有会话 与每个会话的未读条数 成员
*/
@ActionMapping("/getList")
@ApiOperation(value = "查询加入的会话列表", notes = "查询用户加入的非隐藏状态的会话列表 与每个会话的未读条数 成员")
public WsResponse<List<ConversationVo>> getMyImConversationListAndMsgCount() {
List<ConversationVo> conversationList = imConversationService.getMyImConversationListAndMsgCount();
return WsResponse.ok(conversationList);
}
/**
* 根据会话id查询指定会话信息
*/
@ActionMapping("/info")
@ApiOperation(value = "根据会话id查询指定会话信息", notes = "根据会话id查询指定会话信息 与每个会话的未读条数")
public WsResponse<ConversationVo> info(@Validated ImConversationQueryParam param) throws Exception {
ConversationVo conversationVo = imConversationService.infoImConversationAndMsgCount(param);
return WsResponse.ok(conversationVo);
}
/**
* 批量修改单向隐藏或显示会话
*/
@ActionMapping("/displayUpdate")
@ApiOperation(value = "批量修改单向隐藏或显示会话", notes = "拉取会话列表不展示已隐藏状态的会话,云端聊天记录不删除;假设有A和B两个用户,A删会话,B还能发; 如果B发了消息,A这边要重新把会话显示出来,并能显示之前的聊天记录")
public ApiResult<Boolean> updateDisplayConversation(ImConversationDisplayUpdate imConversationDisplayUpdate) throws Exception {
imConversationService.updateDisplayConversation(imConversationDisplayUpdate);
return ApiResult.result(true);
}
}
...@@ -43,7 +43,7 @@ public class ImClientBlacklistController extends BaseController { ...@@ -43,7 +43,7 @@ public class ImClientBlacklistController extends BaseController {
@PostMapping("/add") @PostMapping("/add")
@ApiOperation(value = "拉入黑名单") @ApiOperation(value = "拉入黑名单")
public ApiResult<Boolean> addImClientBlacklist(@Validated(Add.class) @RequestBody ImClientBlacklistUpdate imClientBlacklistUpdate) throws Exception { public ApiResult<Boolean> addImClientBlacklist(@Validated(Add.class) @RequestBody ImClientBlacklistUpdate imClientBlacklistUpdate) throws Exception {
imClientBlacklistService.addImClientBlacklist(null, imClientBlacklistUpdate); imClientBlacklistService.addImClientBlacklist(imClientBlacklistUpdate);
return ApiResult.ok(); return ApiResult.ok();
} }
...@@ -54,7 +54,7 @@ public class ImClientBlacklistController extends BaseController { ...@@ -54,7 +54,7 @@ public class ImClientBlacklistController extends BaseController {
@PostMapping("/delete") @PostMapping("/delete")
@ApiOperation(value = "移出黑名单") @ApiOperation(value = "移出黑名单")
public ApiResult<Boolean> deleteImClientBlacklist(@RequestBody ImClientBlacklistUpdate imClientBlacklistUpdate) throws Exception { public ApiResult<Boolean> deleteImClientBlacklist(@RequestBody ImClientBlacklistUpdate imClientBlacklistUpdate) throws Exception {
imClientBlacklistService.removeImClientBlacklist(null, imClientBlacklistUpdate); imClientBlacklistService.removeImClientBlacklist(imClientBlacklistUpdate);
return ApiResult.ok(); return ApiResult.ok();
} }
...@@ -66,7 +66,7 @@ public class ImClientBlacklistController extends BaseController { ...@@ -66,7 +66,7 @@ public class ImClientBlacklistController extends BaseController {
@ApiOperation(value = "黑名单分页列表") @ApiOperation(value = "黑名单分页列表")
public ApiResult<Paging<ImClientBlacklistQueryVo>> getImClientBlacklistPageList(@RequestBody ImClientBlacklistPageParam imClientBlacklistPageParam) throws Exception { public ApiResult<Paging<ImClientBlacklistQueryVo>> getImClientBlacklistPageList(@RequestBody ImClientBlacklistPageParam imClientBlacklistPageParam) throws Exception {
Paging<ImClientBlacklistQueryVo> blacklist = Paging<ImClientBlacklistQueryVo> blacklist =
imClientBlacklistService.getImClientBlacklistPageList(null, imClientBlacklistPageParam); imClientBlacklistService.getImClientBlacklistPageList(imClientBlacklistPageParam);
return ApiResult.ok(blacklist); return ApiResult.ok(blacklist);
} }
......
...@@ -66,7 +66,7 @@ public class ImClientController extends BaseController { ...@@ -66,7 +66,7 @@ public class ImClientController extends BaseController {
@PostMapping("/myInfo") @PostMapping("/myInfo")
@ApiOperation(value = "查询我的信息") @ApiOperation(value = "查询我的信息")
public ApiResult<MyInfoVo> myInfo() { public ApiResult<MyInfoVo> myInfo() {
MyInfoVo myInfo = imClientService.getMyInfo(null); MyInfoVo myInfo = imClientService.getMyInfo();
return ApiResult.ok(myInfo); return ApiResult.ok(myInfo);
} }
...@@ -74,7 +74,7 @@ public class ImClientController extends BaseController { ...@@ -74,7 +74,7 @@ public class ImClientController extends BaseController {
@PostMapping("/infoList") @PostMapping("/infoList")
@ApiOperation(value = "根据id获取Client的头像昵称") @ApiOperation(value = "根据id获取Client的头像昵称")
public ApiResult<List<GetInfoListVo>> getInfoList(@Validated(Add.class) @RequestBody GetClientInfoParam getClientInfoParam) throws Exception { public ApiResult<List<GetInfoListVo>> getInfoList(@Validated(Add.class) @RequestBody GetClientInfoParam getClientInfoParam) throws Exception {
return ApiResult.ok(imClientService.getInfoList(null, getClientInfoParam)); return ApiResult.ok(imClientService.getInfoList(getClientInfoParam));
} }
/** /**
...@@ -86,7 +86,7 @@ public class ImClientController extends BaseController { ...@@ -86,7 +86,7 @@ public class ImClientController extends BaseController {
if (param == null) { if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
ClientInfoVo clientInfoVo = imClientService.getClientInfo(null, param); ClientInfoVo clientInfoVo = imClientService.getClientInfo(param);
return ApiResult.ok(clientInfoVo); return ApiResult.ok(clientInfoVo);
} }
...@@ -107,7 +107,7 @@ public class ImClientController extends BaseController { ...@@ -107,7 +107,7 @@ public class ImClientController extends BaseController {
@ApiOperation(value = "添加或修改头像和昵称") @ApiOperation(value = "添加或修改头像和昵称")
public ApiResult<Boolean> updateHeadAndNickname(@Validated(Add.class) @RequestBody ImClientHeadPortraitAndNicknameUpdate imClientHeadPortraitAndNicknameUpdate) throws Exception { public ApiResult<Boolean> updateHeadAndNickname(@Validated(Add.class) @RequestBody ImClientHeadPortraitAndNicknameUpdate imClientHeadPortraitAndNicknameUpdate) throws Exception {
log.info("添加或修改头像和昵称入参 {}", JSON.toJSONString(imClientHeadPortraitAndNicknameUpdate)); log.info("添加或修改头像和昵称入参 {}", JSON.toJSONString(imClientHeadPortraitAndNicknameUpdate));
boolean flag = imClientService.updateHeadAndNickname(null, imClientHeadPortraitAndNicknameUpdate); boolean flag = imClientService.updateHeadAndNickname(imClientHeadPortraitAndNicknameUpdate);
return ApiResult.result(flag); return ApiResult.result(flag);
} }
...@@ -116,7 +116,7 @@ public class ImClientController extends BaseController { ...@@ -116,7 +116,7 @@ public class ImClientController extends BaseController {
@ApiOperation(value = "添加或修改头像") @ApiOperation(value = "添加或修改头像")
public ApiResult<Boolean> updateHeadPortrait(@Validated(Add.class) @RequestBody ImClientHeadPortraitAdd imClientHeadPortraitAdd) throws Exception { public ApiResult<Boolean> updateHeadPortrait(@Validated(Add.class) @RequestBody ImClientHeadPortraitAdd imClientHeadPortraitAdd) throws Exception {
log.info("添加或修改头像入参 {}", JSON.toJSONString(imClientHeadPortraitAdd)); log.info("添加或修改头像入参 {}", JSON.toJSONString(imClientHeadPortraitAdd));
boolean flag = imClientService.updateHeadPortrait(null, imClientHeadPortraitAdd); boolean flag = imClientService.updateHeadPortrait(imClientHeadPortraitAdd);
return ApiResult.result(flag); return ApiResult.result(flag);
} }
...@@ -124,7 +124,7 @@ public class ImClientController extends BaseController { ...@@ -124,7 +124,7 @@ public class ImClientController extends BaseController {
@ApiOperation(value = "添加或修改主昵称") @ApiOperation(value = "添加或修改主昵称")
public ApiResult<Boolean> updateNickname(@Validated(Add.class) @RequestBody ImClientNicknameAdd imClientNicknameAdd) throws Exception { public ApiResult<Boolean> updateNickname(@Validated(Add.class) @RequestBody ImClientNicknameAdd imClientNicknameAdd) throws Exception {
log.info("添加或修改主昵称入参 {}", JSON.toJSONString(imClientNicknameAdd)); log.info("添加或修改主昵称入参 {}", JSON.toJSONString(imClientNicknameAdd));
boolean flag = imClientService.updateNickname(null, imClientNicknameAdd); boolean flag = imClientService.updateNickname(imClientNicknameAdd);
return ApiResult.result(flag); return ApiResult.result(flag);
} }
...@@ -139,7 +139,7 @@ public class ImClientController extends BaseController { ...@@ -139,7 +139,7 @@ public class ImClientController extends BaseController {
@ApiOperation(value = "退出登陆 清除推送token等") @ApiOperation(value = "退出登陆 清除推送token等")
public ApiResult<Boolean> logout(@RequestBody @Validated LogoutParam param) { public ApiResult<Boolean> logout(@RequestBody @Validated LogoutParam param) {
log.info("退出登陆入参 {}", JSON.toJSONString(param)); log.info("退出登陆入参 {}", JSON.toJSONString(param));
boolean flag = imClientService.logout(null, param); boolean flag = imClientService.logout(param);
return ApiResult.result(flag); return ApiResult.result(flag);
} }
......
package com.wecloud.im.controller; package com.wecloud.im.controller;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.wecloud.im.param.DisbandConversationParam; import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.ImConversationQueryParam; import com.wecloud.im.param.ImConversationQueryParam;
...@@ -16,21 +33,6 @@ import com.wecloud.im.param.add.ImConversationNameUpdate; ...@@ -16,21 +33,6 @@ import com.wecloud.im.param.add.ImConversationNameUpdate;
import com.wecloud.im.service.ImConversationService; import com.wecloud.im.service.ImConversationService;
import com.wecloud.im.vo.ConversationVo; import com.wecloud.im.vo.ConversationVo;
import com.wecloud.im.vo.ImConversationCreateVo; import com.wecloud.im.vo.ImConversationCreateVo;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/** /**
* 会话表 控制器 * 会话表 控制器
...@@ -78,7 +80,7 @@ public class ImConversationController extends BaseController { ...@@ -78,7 +80,7 @@ public class ImConversationController extends BaseController {
@ApiOperation(value = "client退出会话", notes = "若是创建者退出,[创建者]权限将会转移给按加入会话时间排序的下一个client") @ApiOperation(value = "client退出会话", notes = "若是创建者退出,[创建者]权限将会转移给按加入会话时间排序的下一个client")
public ApiResult<Boolean> leaveConversation(@RequestBody ImClientLeaveConversation imClientToConversation) { public ApiResult<Boolean> leaveConversation(@RequestBody ImClientLeaveConversation imClientToConversation) {
log.info("client退出会话入参 {}", JSON.toJSONString(imClientToConversation)); log.info("client退出会话入参 {}", JSON.toJSONString(imClientToConversation));
return imConversationService.leaveConversation(imClientToConversation); return ApiResult.ok(imConversationService.leaveConversation(imClientToConversation));
} }
...@@ -89,7 +91,7 @@ public class ImConversationController extends BaseController { ...@@ -89,7 +91,7 @@ public class ImConversationController extends BaseController {
@ApiOperation(value = "将client从会话移除", notes = "权限:目前只有群主有权限操作") @ApiOperation(value = "将client从会话移除", notes = "权限:目前只有群主有权限操作")
public ApiResult<Boolean> delClientToConversation(@RequestBody ImClientToConversation imClientToConversation) throws Exception { public ApiResult<Boolean> delClientToConversation(@RequestBody ImClientToConversation imClientToConversation) throws Exception {
log.info("将client从会话移除入参 {}", JSON.toJSONString(imClientToConversation)); log.info("将client从会话移除入参 {}", JSON.toJSONString(imClientToConversation));
return imConversationService.delClientToConversation(imClientToConversation); return ApiResult.ok(imConversationService.delClientToConversation(imClientToConversation));
} }
/** /**
...@@ -111,7 +113,7 @@ public class ImConversationController extends BaseController { ...@@ -111,7 +113,7 @@ public class ImConversationController extends BaseController {
@ApiOperation(value = "将用户添加进会话", notes = "权限:会话中所有client都有权限操作") @ApiOperation(value = "将用户添加进会话", notes = "权限:会话中所有client都有权限操作")
public ApiResult<Boolean> addClientToConversation(@RequestBody ImClientToConversation imClientToConversation) throws Exception { public ApiResult<Boolean> addClientToConversation(@RequestBody ImClientToConversation imClientToConversation) throws Exception {
log.info("将用户添加进会话入参 {}", JSON.toJSONString(imClientToConversation)); log.info("将用户添加进会话入参 {}", JSON.toJSONString(imClientToConversation));
return imConversationService.addClientToConversation(imClientToConversation); return ApiResult.ok(imConversationService.addClientToConversation(imClientToConversation));
} }
/** /**
...@@ -121,7 +123,7 @@ public class ImConversationController extends BaseController { ...@@ -121,7 +123,7 @@ public class ImConversationController extends BaseController {
@ApiOperation(value = "创建会话", notes = "后台可配置:两个客户端如果已经创建过会话,是否重复创建会话") @ApiOperation(value = "创建会话", notes = "后台可配置:两个客户端如果已经创建过会话,是否重复创建会话")
public ApiResult<ImConversationCreateVo> createImConversation(@RequestBody ImConversationCreate imConversationCreate) throws Exception { public ApiResult<ImConversationCreateVo> createImConversation(@RequestBody ImConversationCreate imConversationCreate) throws Exception {
log.info("创建会话入参 {}", JSON.toJSONString(imConversationCreate)); log.info("创建会话入参 {}", JSON.toJSONString(imConversationCreate));
return imConversationService.createImConversation(imConversationCreate); return ApiResult.ok(imConversationService.createImConversation(imConversationCreate));
} }
/** /**
...@@ -129,7 +131,7 @@ public class ImConversationController extends BaseController { ...@@ -129,7 +131,7 @@ public class ImConversationController extends BaseController {
*/ */
@PostMapping("/transferOwner") @PostMapping("/transferOwner")
@ApiOperation(value = "群主转让", notes = "权限:目前只有群主有权限操作") @ApiOperation(value = "群主转让", notes = "权限:目前只有群主有权限操作")
public ApiResult<Boolean> transferOwner(@RequestBody TransferOwnerParam param) { public ApiResult<Boolean> transferOwner(@RequestBody TransferOwnerParam param) {
log.info("群主转让入参 {}", JSON.toJSONString(param)); log.info("群主转让入参 {}", JSON.toJSONString(param));
Boolean result = imConversationService.transferOwner(param); Boolean result = imConversationService.transferOwner(param);
return ApiResult.ok(result); return ApiResult.ok(result);
...@@ -140,7 +142,7 @@ public class ImConversationController extends BaseController { ...@@ -140,7 +142,7 @@ public class ImConversationController extends BaseController {
*/ */
@PostMapping("/setAdmins") @PostMapping("/setAdmins")
@ApiOperation(value = "设置群管理员", notes = "权限:目前只有群主有权限操作") @ApiOperation(value = "设置群管理员", notes = "权限:目前只有群主有权限操作")
public ApiResult<Boolean> setAdmins(@RequestBody @Validated SetAdminsParam param) { public ApiResult<Boolean> setAdmins(@RequestBody @Validated SetAdminsParam param) {
log.info("设置群管理员入参 {}", JSON.toJSONString(param)); log.info("设置群管理员入参 {}", JSON.toJSONString(param));
if (CollectionUtils.isEmpty(param.getClientIds())) { if (CollectionUtils.isEmpty(param.getClientIds())) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
...@@ -154,7 +156,7 @@ public class ImConversationController extends BaseController { ...@@ -154,7 +156,7 @@ public class ImConversationController extends BaseController {
*/ */
@PostMapping("/mutedGroup") @PostMapping("/mutedGroup")
@ApiOperation(value = "群禁言、取消群禁言", notes = "权限:群主和管理员有权限操作") @ApiOperation(value = "群禁言、取消群禁言", notes = "权限:群主和管理员有权限操作")
public ApiResult<Boolean> mutedGroup(@RequestBody @Validated MutedGroupParam param) { public ApiResult<Boolean> mutedGroup(@RequestBody @Validated MutedGroupParam param) {
log.info("群禁言、取消群禁言入参 {}", JSON.toJSONString(param)); log.info("群禁言、取消群禁言入参 {}", JSON.toJSONString(param));
Boolean result = imConversationService.mutedGroup(param); Boolean result = imConversationService.mutedGroup(param);
return ApiResult.ok(result); return ApiResult.ok(result);
...@@ -165,7 +167,7 @@ public class ImConversationController extends BaseController { ...@@ -165,7 +167,7 @@ public class ImConversationController extends BaseController {
*/ */
@PostMapping("/mutedGroupMember") @PostMapping("/mutedGroupMember")
@ApiOperation(value = "选择禁言", notes = "权限:群主和管理员有权限操作") @ApiOperation(value = "选择禁言", notes = "权限:群主和管理员有权限操作")
public ApiResult<Boolean> mutedGroupMember(@RequestBody @Validated MutedGroupMemberParam param) { public ApiResult<Boolean> mutedGroupMember(@RequestBody @Validated MutedGroupMemberParam param) {
log.info("选择禁言入参 {}", JSON.toJSONString(param)); log.info("选择禁言入参 {}", JSON.toJSONString(param));
if (CollectionUtils.isEmpty(param.getClientIds())) { if (CollectionUtils.isEmpty(param.getClientIds())) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
......
...@@ -298,7 +298,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -298,7 +298,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
this.updateById(user); this.updateById(user);
ImClientHeadPortraitAdd imClientHeadPortraitAdd = new ImClientHeadPortraitAdd(); ImClientHeadPortraitAdd imClientHeadPortraitAdd = new ImClientHeadPortraitAdd();
imClientHeadPortraitAdd.setHeadPortrait(param.getHeadPortrait()); imClientHeadPortraitAdd.setHeadPortrait(param.getHeadPortrait());
imClientService.updateHeadPortrait(null, imClientHeadPortraitAdd); imClientService.updateHeadPortrait(imClientHeadPortraitAdd);
} }
/** /**
...@@ -319,7 +319,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -319,7 +319,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
this.updateById(user); this.updateById(user);
ImClientNicknameUpdate imClientNicknameUpdate = new ImClientNicknameUpdate(); ImClientNicknameUpdate imClientNicknameUpdate = new ImClientNicknameUpdate();
imClientNicknameUpdate.setNickname(param.getNickname()); imClientNicknameUpdate.setNickname(param.getNickname());
imClientService.updateNickname(null, imClientNicknameUpdate); imClientService.updateNickname(imClientNicknameUpdate);
} }
/** /**
......
...@@ -19,7 +19,7 @@ public interface ContextService { ...@@ -19,7 +19,7 @@ public interface ContextService {
* @param request Ws请求 * @param request Ws请求
* @Return * @Return
*/ */
ImClient getImClientIfNotNullOrThrow(ActionRequest request); ImClient getImClientIfNotNullOrThrow();
/** /**
* 获取当前或指定appId的ImApplication 存在返回 不存在则抛出异常 * 获取当前或指定appId的ImApplication 存在返回 不存在则抛出异常
......
...@@ -34,7 +34,7 @@ public interface ImClientBlacklistService extends BaseService<ImClientBlacklist> ...@@ -34,7 +34,7 @@ public interface ImClientBlacklistService extends BaseService<ImClientBlacklist>
* @return * @return
* @throws Exception * @throws Exception
*/ */
Boolean addImClientBlacklist(ActionRequest request, ImClientBlacklistUpdate imClientBlacklistUpdate); Boolean addImClientBlacklist(ImClientBlacklistUpdate imClientBlacklistUpdate);
/** /**
* 移出黑名单 * 移出黑名单
...@@ -43,7 +43,7 @@ public interface ImClientBlacklistService extends BaseService<ImClientBlacklist> ...@@ -43,7 +43,7 @@ public interface ImClientBlacklistService extends BaseService<ImClientBlacklist>
* @return * @return
* @throws Exception * @throws Exception
*/ */
Boolean removeImClientBlacklist(ActionRequest request, ImClientBlacklistUpdate imClientBlacklistUpdate); Boolean removeImClientBlacklist(ImClientBlacklistUpdate imClientBlacklistUpdate);
/** /**
* 获取分页对象 * 获取分页对象
...@@ -51,6 +51,6 @@ public interface ImClientBlacklistService extends BaseService<ImClientBlacklist> ...@@ -51,6 +51,6 @@ public interface ImClientBlacklistService extends BaseService<ImClientBlacklist>
* @return * @return
* @throws Exception * @throws Exception
*/ */
Paging<ImClientBlacklistQueryVo> getImClientBlacklistPageList(ActionRequest request, ImClientBlacklistPageParam imClientBlacklistPageParam); Paging<ImClientBlacklistQueryVo> getImClientBlacklistPageList(ImClientBlacklistPageParam imClientBlacklistPageParam);
} }
...@@ -35,23 +35,23 @@ public interface ImClientService extends BaseService<ImClient> { ...@@ -35,23 +35,23 @@ public interface ImClientService extends BaseService<ImClient> {
* 查询我的信息 * 查询我的信息
* @return * @return
*/ */
MyInfoVo getMyInfo(ActionRequest request); MyInfoVo getMyInfo();
/** /**
* 更新头像 * 更新头像
* @param imClientHeadPortraitAdd * @param imClientHeadPortraitAdd
* @return * @return
*/ */
boolean updateHeadPortrait(ActionRequest request, ImClientHeadPortraitAdd imClientHeadPortraitAdd); boolean updateHeadPortrait(ImClientHeadPortraitAdd imClientHeadPortraitAdd);
/** /**
* 修改昵称 * 修改昵称
* @param imClientNicknameUpdate * @param imClientNicknameUpdate
* @return * @return
*/ */
boolean updateNickname(ActionRequest request, ImClientNicknameUpdate imClientNicknameUpdate); boolean updateNickname(ImClientNicknameUpdate imClientNicknameUpdate);
boolean updateHeadAndNickname(ActionRequest request, ImClientHeadPortraitAndNicknameUpdate imClientHeadPortraitAndNicknameUpdate); boolean updateHeadAndNickname(ImClientHeadPortraitAndNicknameUpdate imClientHeadPortraitAndNicknameUpdate);
/** /**
...@@ -61,17 +61,17 @@ public interface ImClientService extends BaseService<ImClient> { ...@@ -61,17 +61,17 @@ public interface ImClientService extends BaseService<ImClient> {
* @return * @return
* @throws Exception * @throws Exception
*/ */
List<GetInfoListVo> getInfoList(ActionRequest request, GetClientInfoParam getClientInfoParam) throws Exception; List<GetInfoListVo> getInfoList(GetClientInfoParam getClientInfoParam) throws Exception;
/** /**
* 获取群里成员信息 * 获取群里成员信息
* @param param * @param param
* @return * @return
*/ */
ClientInfoVo getClientInfo(ActionRequest request, ClientInfoParam param); ClientInfoVo getClientInfo(ClientInfoParam param);
boolean updateNickname(ActionRequest request, ImClientNicknameAdd imClientNicknameAdd) throws Exception; boolean updateNickname(ImClientNicknameAdd imClientNicknameAdd) throws Exception;
/** /**
* 保存 * 保存
...@@ -95,7 +95,7 @@ public interface ImClientService extends BaseService<ImClient> { ...@@ -95,7 +95,7 @@ public interface ImClientService extends BaseService<ImClient> {
* @param param * @param param
* @return * @return
*/ */
boolean logout(ActionRequest request, LogoutParam param); boolean logout(LogoutParam param);
/** /**
...@@ -123,7 +123,7 @@ public interface ImClientService extends BaseService<ImClient> { ...@@ -123,7 +123,7 @@ public interface ImClientService extends BaseService<ImClient> {
* @return * @return
* @throws Exception * @throws Exception
*/ */
Paging<ImClientQueryVo> getImClientPageList(ActionRequest request, ImClientPageParam imClientPageParam) throws Exception; Paging<ImClientQueryVo> getImClientPageList(ImClientPageParam imClientPageParam) throws Exception;
/** /**
......
package com.wecloud.im.service; package com.wecloud.im.service;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.service.BaseService;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import java.util.List;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.wecloud.im.entity.ImConversation; import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.param.DisbandConversationParam; import com.wecloud.im.param.DisbandConversationParam;
...@@ -16,14 +22,8 @@ import com.wecloud.im.param.add.ImConversationAttrUpdate; ...@@ -16,14 +22,8 @@ import com.wecloud.im.param.add.ImConversationAttrUpdate;
import com.wecloud.im.param.add.ImConversationCreate; import com.wecloud.im.param.add.ImConversationCreate;
import com.wecloud.im.param.add.ImConversationDisplayUpdate; import com.wecloud.im.param.add.ImConversationDisplayUpdate;
import com.wecloud.im.param.add.ImConversationNameUpdate; import com.wecloud.im.param.add.ImConversationNameUpdate;
import com.wecloud.im.vo.ImConversationCreateVo;
import com.wecloud.im.vo.ConversationVo; import com.wecloud.im.vo.ConversationVo;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import com.wecloud.im.vo.ImConversationCreateVo;
import io.geekidea.springbootplus.framework.common.service.BaseService;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
/** /**
* 会话表 服务类 * 会话表 服务类
...@@ -49,7 +49,7 @@ public interface ImConversationService extends BaseService<ImConversation> { ...@@ -49,7 +49,7 @@ public interface ImConversationService extends BaseService<ImConversation> {
* @param imConversationCreate * @param imConversationCreate
* @return * @return
*/ */
ApiResult<ImConversationCreateVo> createImConversation(ImConversationCreate imConversationCreate); ImConversationCreateVo createImConversation(ImConversationCreate imConversationCreate);
/** /**
...@@ -59,7 +59,7 @@ public interface ImConversationService extends BaseService<ImConversation> { ...@@ -59,7 +59,7 @@ public interface ImConversationService extends BaseService<ImConversation> {
* @return * @return
* @throws JsonProcessingException * @throws JsonProcessingException
*/ */
ApiResult<Boolean> addClientToConversation(ImClientToConversation imClientToConversation); Boolean addClientToConversation(ImClientToConversation imClientToConversation);
/** /**
* 将client从会话移除 * 将client从会话移除
...@@ -67,7 +67,7 @@ public interface ImConversationService extends BaseService<ImConversation> { ...@@ -67,7 +67,7 @@ public interface ImConversationService extends BaseService<ImConversation> {
* @param imClientToConversation * @param imClientToConversation
* @return * @return
*/ */
ApiResult<Boolean> delClientToConversation(ImClientToConversation imClientToConversation) throws Exception; Boolean delClientToConversation(ImClientToConversation imClientToConversation) throws Exception;
/** /**
* 解散群聊 * 解散群聊
...@@ -79,35 +79,35 @@ public interface ImConversationService extends BaseService<ImConversation> { ...@@ -79,35 +79,35 @@ public interface ImConversationService extends BaseService<ImConversation> {
/** /**
* client退出会话 * client退出会话
*/ */
ApiResult<Boolean> leaveConversation(ImClientLeaveConversation imClientToConversation); Boolean leaveConversation(ImClientLeaveConversation imClientToConversation);
/** /**
* 群主转让 * 群主转让
* @param param * @param param
* @return * @return
*/ */
Boolean transferOwner(@RequestBody TransferOwnerParam param); Boolean transferOwner(TransferOwnerParam param);
/** /**
* 设置管理员 * 设置管理员
* @param param * @param param
* @return * @return
*/ */
Boolean setAdmins(@RequestBody SetAdminsParam param); Boolean setAdmins(SetAdminsParam param);
/** /**
* 群禁言 * 群禁言
* @param param * @param param
* @return * @return
*/ */
Boolean mutedGroup(@RequestBody MutedGroupParam param); Boolean mutedGroup(MutedGroupParam param);
/** /**
* 选择禁言 * 选择禁言
* @param param * @param param
* @return * @return
*/ */
Boolean mutedGroupMember(@RequestBody MutedGroupMemberParam param); Boolean mutedGroupMember(MutedGroupMemberParam param);
/** /**
* 判断当前操作人是否为指定角色成员 * 判断当前操作人是否为指定角色成员
......
...@@ -7,6 +7,7 @@ import org.springframework.context.annotation.Lazy; ...@@ -7,6 +7,7 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.wecloud.dispatch.extend.ActionRequest; import com.wecloud.dispatch.extend.ActionRequest;
import com.wecloud.dispatch.util.ActionRequestHolder;
import com.wecloud.im.entity.ImApplication; import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient; import com.wecloud.im.entity.ImClient;
import com.wecloud.im.service.ContextService; import com.wecloud.im.service.ContextService;
...@@ -31,11 +32,12 @@ public class ContextServiceImpl implements ContextService { ...@@ -31,11 +32,12 @@ public class ContextServiceImpl implements ContextService {
private ImApplicationService imApplicationService; private ImApplicationService imApplicationService;
@Override @Override
public ImClient getImClientIfNotNullOrThrow(ActionRequest request) { public ImClient getImClientIfNotNullOrThrow() {
ImClient currentClient; ImClient currentClient;
if (request != null) { if (ActionRequestHolder.getActionRequest() != null) {
ActionRequest request = ActionRequestHolder.getActionRequest();
currentClient = imClientService.getCacheImClient(request.getSenderClientId()); currentClient = imClientService.getCacheImClient(request.getSenderClientId());
} else { } else {
currentClient = imClientService.getCurrentClient(); currentClient = imClientService.getCurrentClient();
......
...@@ -15,7 +15,6 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -15,7 +15,6 @@ import org.springframework.transaction.annotation.Transactional;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wecloud.dispatch.extend.ActionRequest;
import com.wecloud.im.entity.ImClient; import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImClientBlacklist; import com.wecloud.im.entity.ImClientBlacklist;
import com.wecloud.im.mapper.ImClientBlacklistMapper; import com.wecloud.im.mapper.ImClientBlacklistMapper;
...@@ -57,8 +56,8 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl ...@@ -57,8 +56,8 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean addImClientBlacklist(ActionRequest request, ImClientBlacklistUpdate imClientBlacklistUpdate) { public Boolean addImClientBlacklist(ImClientBlacklistUpdate imClientBlacklistUpdate) {
ImClient currentClient = contextService.getImClientIfNotNullOrThrow(request); ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
ImClient beBlacker = imClientService.getOne(new QueryWrapper<ImClient>().lambda() ImClient beBlacker = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, currentClient.getFkAppid()) .eq(ImClient::getFkAppid, currentClient.getFkAppid())
.eq(ImClient::getClientId, imClientBlacklistUpdate.getClientIdBePrevent())); .eq(ImClient::getClientId, imClientBlacklistUpdate.getClientIdBePrevent()));
...@@ -78,9 +77,9 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl ...@@ -78,9 +77,9 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean removeImClientBlacklist(ActionRequest request, ImClientBlacklistUpdate imClientBlacklistUpdate) { public Boolean removeImClientBlacklist(ImClientBlacklistUpdate imClientBlacklistUpdate) {
// 操作者 // 操作者
ImClient currentClient = contextService.getImClientIfNotNullOrThrow(request); ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
// 被拉黑者 // 被拉黑者
ImClient beBlacker = imClientService.getOne(new QueryWrapper<ImClient>().lambda() ImClient beBlacker = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, currentClient.getFkAppid()) .eq(ImClient::getFkAppid, currentClient.getFkAppid())
...@@ -96,9 +95,9 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl ...@@ -96,9 +95,9 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl
} }
@Override @Override
public Paging<ImClientBlacklistQueryVo> getImClientBlacklistPageList(ActionRequest request, ImClientBlacklistPageParam imClientBlacklistPageParam) { public Paging<ImClientBlacklistQueryVo> getImClientBlacklistPageList(ImClientBlacklistPageParam imClientBlacklistPageParam) {
Page<ImClientBlacklistQueryVo> page = new PageInfo<>(imClientBlacklistPageParam); Page<ImClientBlacklistQueryVo> page = new PageInfo<>(imClientBlacklistPageParam);
ImClient currentClient = contextService.getImClientIfNotNullOrThrow(request); ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
IPage<ImClientBlacklistQueryVo> imClientBlacklistPageList = imClientBlacklistMapper.getImClientBlacklistPageList(page, currentClient.getClientId()); IPage<ImClientBlacklistQueryVo> imClientBlacklistPageList = imClientBlacklistMapper.getImClientBlacklistPageList(page, currentClient.getClientId());
Paging<ImClientBlacklistQueryVo> imClientBlacklistQueryVoPaging = new Paging<>(imClientBlacklistPageList); Paging<ImClientBlacklistQueryVo> imClientBlacklistQueryVoPaging = new Paging<>(imClientBlacklistPageList);
return imClientBlacklistQueryVoPaging; return imClientBlacklistQueryVoPaging;
......
package com.wecloud.im.service.impl; package com.wecloud.im.service.impl;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.exception.BusinessException; import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo; import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
...@@ -28,6 +27,7 @@ import com.baomidou.mybatisplus.core.metadata.OrderItem; ...@@ -28,6 +27,7 @@ import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.wecloud.dispatch.extend.ActionRequest; import com.wecloud.dispatch.extend.ActionRequest;
import com.wecloud.dispatch.util.ActionRequestHolder;
import com.wecloud.im.entity.ImApplication; import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient; import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImClientDevice; import com.wecloud.im.entity.ImClientDevice;
...@@ -87,8 +87,8 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien ...@@ -87,8 +87,8 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
private ContextService contextService; private ContextService contextService;
@Override @Override
public MyInfoVo getMyInfo(ActionRequest request) { public MyInfoVo getMyInfo() {
ImClient currentClient = contextService.getImClientIfNotNullOrThrow(request); ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
MyInfoVo myInfoVo = new MyInfoVo(); MyInfoVo myInfoVo = new MyInfoVo();
BeanUtils.copyProperties(currentClient, myInfoVo); BeanUtils.copyProperties(currentClient, myInfoVo);
return myInfoVo; return myInfoVo;
...@@ -96,8 +96,8 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien ...@@ -96,8 +96,8 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean updateHeadPortrait(ActionRequest request, ImClientHeadPortraitAdd imClientHeadPortraitAdd) { public boolean updateHeadPortrait(ImClientHeadPortraitAdd imClientHeadPortraitAdd) {
ImClient curentClient = contextService.getImClientIfNotNullOrThrow(request); ImClient curentClient = contextService.getImClientIfNotNullOrThrow();
curentClient.setHeadPortrait(imClientHeadPortraitAdd.getHeadPortrait()); curentClient.setHeadPortrait(imClientHeadPortraitAdd.getHeadPortrait());
imClientMapper.updateById(curentClient); imClientMapper.updateById(curentClient);
...@@ -108,8 +108,8 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien ...@@ -108,8 +108,8 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
} }
@Override @Override
public boolean updateNickname(ActionRequest request, ImClientNicknameUpdate imClientNicknameUpdate) { public boolean updateNickname(ImClientNicknameUpdate imClientNicknameUpdate) {
ImClient curentClient = contextService.getImClientIfNotNullOrThrow(request); ImClient curentClient = contextService.getImClientIfNotNullOrThrow();
curentClient.setNickname(imClientNicknameUpdate.getNickname()); curentClient.setNickname(imClientNicknameUpdate.getNickname());
imClientMapper.updateById(curentClient); imClientMapper.updateById(curentClient);
...@@ -120,8 +120,8 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien ...@@ -120,8 +120,8 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
} }
@Override @Override
public boolean updateHeadAndNickname(ActionRequest request, ImClientHeadPortraitAndNicknameUpdate imClientHeadPortraitAndNicknameUpdate) { public boolean updateHeadAndNickname(ImClientHeadPortraitAndNicknameUpdate imClientHeadPortraitAndNicknameUpdate) {
ImClient curentClient = contextService.getImClientIfNotNullOrThrow(request); ImClient curentClient = contextService.getImClientIfNotNullOrThrow();
curentClient.setHeadPortrait(imClientHeadPortraitAndNicknameUpdate.getHeadPortrait()); curentClient.setHeadPortrait(imClientHeadPortraitAndNicknameUpdate.getHeadPortrait());
curentClient.setNickname(imClientHeadPortraitAndNicknameUpdate.getNickname()); curentClient.setNickname(imClientHeadPortraitAndNicknameUpdate.getNickname());
imClientMapper.updateById(curentClient); imClientMapper.updateById(curentClient);
...@@ -133,8 +133,8 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien ...@@ -133,8 +133,8 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
} }
@Override @Override
public List<GetInfoListVo> getInfoList(ActionRequest request, GetClientInfoParam getClientInfoParam) throws Exception { public List<GetInfoListVo> getInfoList(GetClientInfoParam getClientInfoParam) throws Exception {
ImClient curentClient = contextService.getImClientIfNotNullOrThrow(request); ImClient curentClient = contextService.getImClientIfNotNullOrThrow();
if (getClientInfoParam.getClientIds() == null || getClientInfoParam.getClientIds().isEmpty()) { if (getClientInfoParam.getClientIds() == null || getClientInfoParam.getClientIds().isEmpty()) {
throw new BusinessException("getClientInfoParam.getClientIds() == null"); throw new BusinessException("getClientInfoParam.getClientIds() == null");
...@@ -162,8 +162,8 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien ...@@ -162,8 +162,8 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
} }
@Override @Override
public ClientInfoVo getClientInfo(ActionRequest request, ClientInfoParam param) { public ClientInfoVo getClientInfo(ClientInfoParam param) {
ImClient currentClient = contextService.getImClientIfNotNullOrThrow(request); ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
if (currentClient == null) { if (currentClient == null) {
throw new BusinessException("当前用户登录信息失效"); throw new BusinessException("当前用户登录信息失效");
} }
...@@ -194,8 +194,8 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien ...@@ -194,8 +194,8 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean updateNickname(ActionRequest request, ImClientNicknameAdd imClientNicknameAdd) throws Exception { public boolean updateNickname(ImClientNicknameAdd imClientNicknameAdd) throws Exception {
ImClient curentClient = contextService.getImClientIfNotNullOrThrow(request); ImClient curentClient = contextService.getImClientIfNotNullOrThrow();
curentClient.setNickname(imClientNicknameAdd.getNickname()); curentClient.setNickname(imClientNicknameAdd.getNickname());
imClientMapper.updateById(curentClient); imClientMapper.updateById(curentClient);
...@@ -248,8 +248,8 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien ...@@ -248,8 +248,8 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
} }
@Override @Override
public boolean logout(ActionRequest request, LogoutParam param) { public boolean logout(LogoutParam param) {
ImClient currentClient = contextService.getImClientIfNotNullOrThrow(request); ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
// 清除设备token // 清除设备token
return imClientDeviceService.update(new UpdateWrapper<ImClientDevice>().lambda() return imClientDeviceService.update(new UpdateWrapper<ImClientDevice>().lambda()
.eq(ImClientDevice::getFkAppid, currentClient.getFkAppid()) .eq(ImClientDevice::getFkAppid, currentClient.getFkAppid())
...@@ -270,7 +270,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien ...@@ -270,7 +270,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
} }
@Override @Override
public Paging<ImClientQueryVo> getImClientPageList(ActionRequest request, ImClientPageParam imClientPageParam) throws Exception { public Paging<ImClientQueryVo> getImClientPageList(ImClientPageParam imClientPageParam) throws Exception {
Page<ImClientQueryVo> page = new PageInfo<>(imClientPageParam, OrderItem.desc(getLambdaColumn(ImClient::getCreateTime))); Page<ImClientQueryVo> page = new PageInfo<>(imClientPageParam, OrderItem.desc(getLambdaColumn(ImClient::getCreateTime)));
IPage<ImClientQueryVo> iPage = imClientMapper.getImClientPageList(page, imClientPageParam); IPage<ImClientQueryVo> iPage = imClientMapper.getImClientPageList(page, imClientPageParam);
return new Paging<>(iPage); return new Paging<>(iPage);
...@@ -278,12 +278,19 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien ...@@ -278,12 +278,19 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Override @Override
public ImClient getCurrentClient() { public ImClient getCurrentClient() {
ImClient imClient = null;
// shiro线程中获取当前token // modify by luozh 2022/04/03 增加是否存在ActionRequest的判断,如果是则说明请求来源于ws 否则是HTTP请求
JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken(); if (ActionRequestHolder.getActionRequest() != null) {
// 根据appKey查询appid ActionRequest request = ActionRequestHolder.getActionRequest();
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey()); imClient = getCacheImClient(request.getSenderClientId());
return getCacheImClient(imApplication.getId(), curentJwtToken.getClientId()); } else {
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken();
// 根据appKey查询appid
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey());
imClient = getCacheImClient(imApplication.getId(), curentJwtToken.getClientId());
}
return imClient;
} }
@Override @Override
......
package com.wecloud.im.service.impl; package com.wecloud.im.service.impl;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.enums.BaseEnum;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import io.geekidea.springbootplus.framework.shiro.jwt.JwtToken;
import io.geekidea.springbootplus.framework.shiro.util.JwtUtil;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
...@@ -34,6 +59,7 @@ import com.wecloud.im.param.add.ImConversationAttrUpdate; ...@@ -34,6 +59,7 @@ import com.wecloud.im.param.add.ImConversationAttrUpdate;
import com.wecloud.im.param.add.ImConversationCreate; import com.wecloud.im.param.add.ImConversationCreate;
import com.wecloud.im.param.add.ImConversationDisplayUpdate; import com.wecloud.im.param.add.ImConversationDisplayUpdate;
import com.wecloud.im.param.add.ImConversationNameUpdate; import com.wecloud.im.param.add.ImConversationNameUpdate;
import com.wecloud.im.service.ContextService;
import com.wecloud.im.service.ImApplicationService; import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientService; import com.wecloud.im.service.ImClientService;
import com.wecloud.im.service.ImConversationMembersService; import com.wecloud.im.service.ImConversationMembersService;
...@@ -49,29 +75,6 @@ import com.wecloud.im.ws.model.WsResponse; ...@@ -49,29 +75,6 @@ import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.sender.ChannelSender; import com.wecloud.im.ws.sender.ChannelSender;
import com.wecloud.utils.JsonUtils; import com.wecloud.utils.JsonUtils;
import com.wecloud.utils.SnowflakeUtil; import com.wecloud.utils.SnowflakeUtil;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.enums.BaseEnum;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import io.geekidea.springbootplus.framework.shiro.jwt.JwtToken;
import io.geekidea.springbootplus.framework.shiro.util.JwtUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/** /**
* 会话表 服务实现类 * 会话表 服务实现类
...@@ -105,6 +108,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -105,6 +108,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Autowired @Autowired
private ImMessageService imMessageService; private ImMessageService imMessageService;
@Autowired
private ContextService contextService;
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public boolean saveImConversation(ImConversation imConversation) { public boolean saveImConversation(ImConversation imConversation) {
...@@ -113,15 +119,15 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -113,15 +119,15 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public ApiResult<ImConversationCreateVo> createImConversation(ImConversationCreate imConversationCreate) { public ImConversationCreateVo createImConversation(ImConversationCreate imConversationCreate) {
ImClient createClient = imClientService.getCurrentClient(); ImClient createClient = contextService.getImClientIfNotNullOrThrow();
if (CollectionUtils.isEmpty(imConversationCreate.getClientIds())) { if (CollectionUtils.isEmpty(imConversationCreate.getClientIds())) {
log.info("未找到群成员信息"); log.info("未找到群成员信息");
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); throw new BusinessException(ApiCode.PARAMETER_EXCEPTION);
} }
if (BaseEnum.valueOf(ChatTypeEnum.class, imConversationCreate.getChatType()) == null) { if (BaseEnum.valueOf(ChatTypeEnum.class, imConversationCreate.getChatType()) == null) {
log.info("会话类型不存在"); log.info("会话类型不存在");
return ApiResult.result(ApiCode.PARAMETER_EXCEPTION, null); throw new BusinessException(ApiCode.PARAMETER_EXCEPTION);
} }
// 成员不存在,不能创建会话 // 成员不存在,不能创建会话
for (String clientId : imConversationCreate.getClientIds()) { for (String clientId : imConversationCreate.getClientIds()) {
...@@ -131,14 +137,12 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -131,14 +137,12 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
.eq(ImClient::getClientId, clientId)); .eq(ImClient::getClientId, clientId));
if (imClient == null) { if (imClient == null) {
log.info("成员不存在,不能创建会话 clientId:{}", clientId); log.info("成员不存在,不能创建会话 clientId:{}", clientId);
return ApiResult.result(ApiCode.CLIENT_NOT_FOUNT, null); throw new BusinessException(ApiCode.CLIENT_NOT_FOUNT);
} }
} }
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken();
// 根据appKey查询application // 根据appKey查询application
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey()); ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(createClient.getFkAppid());
// 该应用 是否允许创建重复单聊类型会话 0不允许 1允许 // 该应用 是否允许创建重复单聊类型会话 0不允许 1允许
if (imApplication.getRepeatSessionStatus() != null && imApplication.getRepeatSessionStatus() == 0) { if (imApplication.getRepeatSessionStatus() != null && imApplication.getRepeatSessionStatus() == 0) {
...@@ -156,7 +160,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -156,7 +160,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 返回已存在的单聊类型会话id // 返回已存在的单聊类型会话id
ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo(); ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo();
imConversationCreateVo.setId(repetitionConversationInfo.getId()); imConversationCreateVo.setId(repetitionConversationInfo.getId());
return ApiResult.ok(imConversationCreateVo); return imConversationCreateVo;
} }
} }
} else { } else {
...@@ -179,7 +183,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -179,7 +183,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo(); ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo();
imConversationCreateVo.setId(repetitionConversation); imConversationCreateVo.setId(repetitionConversation);
// 为重复 // 为重复
return ApiResult.ok(imConversationCreateVo); return imConversationCreateVo;
} }
} }
} }
...@@ -261,17 +265,17 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -261,17 +265,17 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo(); ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo();
imConversationCreateVo.setId(imConversationId); imConversationCreateVo.setId(imConversationId);
return ApiResult.ok(imConversationCreateVo); return imConversationCreateVo;
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> addClientToConversation(ImClientToConversation imClientToConversation) { public Boolean addClientToConversation(ImClientToConversation imClientToConversation) {
// shiro线程中获取当前token // 获取当前client
JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken(); ImClient createClient = contextService.getImClientIfNotNullOrThrow();
// 根据appKey查询application // 根据appId查询application
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey()); ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(createClient.getFkAppid());
ImClient imClientSender = imClientService.getCurrentClient(); ImClient imClientSender = imClientService.getCurrentClient();
...@@ -285,7 +289,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -285,7 +289,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
); );
if (membersList.isEmpty()) { if (membersList.isEmpty()) {
log.info("membersList为空,toConversationId:" + imClientToConversation.getConversationId()); log.info("membersList为空,toConversationId:" + imClientToConversation.getConversationId());
return ApiResult.fail(); throw new BusinessException("没有成员");
} }
int needAddCount = 0; int needAddCount = 0;
...@@ -296,7 +300,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -296,7 +300,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
.eq(ImClient::getFkAppid, imApplication.getId()) .eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getClientId, id)); .eq(ImClient::getClientId, id));
if (clientToConversation == null) { if (clientToConversation == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null); throw new BusinessException(ApiCode.CLIENT_NOT_FOUNT);
} }
// 判断用户是否已经在该会话 // 判断用户是否已经在该会话
ImConversationMembers members = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda() ImConversationMembers members = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda()
...@@ -366,7 +370,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -366,7 +370,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imConversationMapper.upgradeToThousandChat(imApplication.getId(), imClientToConversation.getConversationId()); imConversationMapper.upgradeToThousandChat(imApplication.getId(), imClientToConversation.getConversationId());
} }
return ApiResult.ok(); return true;
} }
...@@ -404,11 +408,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -404,11 +408,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> delClientToConversation(ImClientToConversation imClientToConversation) throws Exception { public Boolean delClientToConversation(ImClientToConversation imClientToConversation) throws Exception {
// shiro线程中获取当前token // 获取当前client
JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken(); ImClient createClient = contextService.getImClientIfNotNullOrThrow();
// 根据appKey查询application // 根据appId查询application
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey()); ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(createClient.getFkAppid());
ImClient imClientSender = imClientService.getCurrentClient(); ImClient imClientSender = imClientService.getCurrentClient();
// 判断是否为群主 // 判断是否为群主
ImConversationMembers conversationMember = imConversationMembersService.getOne( ImConversationMembers conversationMember = imConversationMembersService.getOne(
...@@ -417,7 +421,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -417,7 +421,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
.eq(ImConversationMembers::getFkClientId, imClientSender.getId()) .eq(ImConversationMembers::getFkClientId, imClientSender.getId())
); );
if (conversationMember == null || !GroupRoleEnum.OWNER.getCode().equals(conversationMember.getRole())) { if (conversationMember == null || !GroupRoleEnum.OWNER.getCode().equals(conversationMember.getRole())) {
return ApiResult.result(false); return false;
} }
// 查询该会话所有成员 // 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list( List<ImConversationMembers> membersList = imConversationMembersService.list(
...@@ -428,7 +432,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -428,7 +432,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
); );
if (membersList.isEmpty()) { if (membersList.isEmpty()) {
log.info("membersList为空,toConversationId:" + imClientToConversation.getConversationId()); log.info("membersList为空,toConversationId:" + imClientToConversation.getConversationId());
return ApiResult.fail(); throw new BusinessException("没有成员");
} }
int needAddCount = 0; int needAddCount = 0;
...@@ -508,12 +512,13 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -508,12 +512,13 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 将群成员数量减 // 将群成员数量减
imConversationMapper.addMemberCount(imApplication.getId(), imClientToConversation.getConversationId(), needAddCount); imConversationMapper.addMemberCount(imApplication.getId(), imClientToConversation.getConversationId(), needAddCount);
return ApiResult.ok(); return true;
} }
@Override @Override
public void disband(DisbandConversationParam param) { public void disband(DisbandConversationParam param) {
ImClient currentClient = imClientService.getCurrentClient(); // 获取当前client
ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
// 判断是否为群主 // 判断是否为群主
ImConversationMembers conversationMember = imConversationMembersService.getOne( ImConversationMembers conversationMember = imConversationMembersService.getOne(
new QueryWrapper<ImConversationMembers>().lambda() new QueryWrapper<ImConversationMembers>().lambda()
...@@ -591,8 +596,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -591,8 +596,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> leaveConversation(ImClientLeaveConversation imClientToConversation) { public Boolean leaveConversation(ImClientLeaveConversation imClientToConversation) {
ImClient currentClient = imClientService.getCurrentClient(); // 获取当前client
ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
ImConversation imConversation = imConversationService.getById(imClientToConversation.getConversationId()); ImConversation imConversation = imConversationService.getById(imClientToConversation.getConversationId());
if (imConversation == null) { if (imConversation == null) {
...@@ -691,7 +697,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -691,7 +697,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 群主转移给下一个人 // 群主转移给下一个人
imConversationMembersService.updateById(conversationMember); imConversationMembersService.updateById(conversationMember);
} }
return ApiResult.ok(); return true;
} }
...@@ -704,10 +710,10 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -704,10 +710,10 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean transferOwner(TransferOwnerParam param) { public Boolean transferOwner(TransferOwnerParam param) {
// shiro线程中获取当前token // 获取当前client
JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken(); ImClient createClient = contextService.getImClientIfNotNullOrThrow();
// 根据appKey查询application // 根据appId查询application
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey()); ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(createClient.getFkAppid());
ImClient imClientSender = imClientService.getCurrentClient(); ImClient imClientSender = imClientService.getCurrentClient();
// 判断操作人是否为群主 // 判断操作人是否为群主
...@@ -742,7 +748,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -742,7 +748,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
*/ */
@Override @Override
public Boolean setAdmins(SetAdminsParam param) { public Boolean setAdmins(SetAdminsParam param) {
ImClient currentClient = imClientService.getCurrentClient(); // 获取当前client
ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
// 判断操作人是否为群主 // 判断操作人是否为群主
ImConversationMembers currentMember = imConversationMembersService.getOne( ImConversationMembers currentMember = imConversationMembersService.getOne(
new QueryWrapper<ImConversationMembers>().lambda() new QueryWrapper<ImConversationMembers>().lambda()
...@@ -758,7 +765,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -758,7 +765,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
} }
List<Long> fkClientIds = simpleClients.stream() List<Long> fkClientIds = simpleClients.stream()
.filter(s -> !currentMember.getId().equals(s.getId())) .filter(s -> !currentMember.getId().equals(s.getId()))
.map(s -> s.getId()).collect(Collectors.toList()); .map(ImClientSimpleDto::getId).collect(Collectors.toList());
imConversationMembersService.setAdminsForConversation(param, fkClientIds); imConversationMembersService.setAdminsForConversation(param, fkClientIds);
return true; return true;
} }
...@@ -771,7 +778,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -771,7 +778,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
*/ */
@Override @Override
public Boolean mutedGroup(MutedGroupParam param) { public Boolean mutedGroup(MutedGroupParam param) {
ImClient currentClient = imClientService.getCurrentClient(); // 获取当前client
ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
if (!imConversationService.isBelongToRole(currentClient.getClientId(), param.getConversationId(), if (!imConversationService.isBelongToRole(currentClient.getClientId(), param.getConversationId(),
Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) { Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) {
// 当前操作人不属于群主或管理人员 // 当前操作人不属于群主或管理人员
...@@ -855,7 +863,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -855,7 +863,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override @Override
public Boolean mutedGroupMember(MutedGroupMemberParam param) { public Boolean mutedGroupMember(MutedGroupMemberParam param) {
ImClient currentClient = imClientService.getCurrentClient(); // 获取当前client
ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
if (!imConversationService.isBelongToRole(currentClient.getClientId(), param.getConversationId(), if (!imConversationService.isBelongToRole(currentClient.getClientId(), param.getConversationId(),
Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) { Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) {
// 当前操作人不属于群主或管理人员 // 当前操作人不属于群主或管理人员
...@@ -906,7 +915,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -906,7 +915,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> saveOrUpdateName(ImConversationNameUpdate param) { public ApiResult<Boolean> saveOrUpdateName(ImConversationNameUpdate param) {
ImClient currentClient = imClientService.getCurrentClient(); // 获取当前client
ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
ImConversation imConversationById = imConversationService.getById(param.getConversationId()); ImConversation imConversationById = imConversationService.getById(param.getConversationId());
if (!this.isBelongToRole(currentClient.getClientId(), param.getConversationId(), if (!this.isBelongToRole(currentClient.getClientId(), param.getConversationId(),
Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) { Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) {
...@@ -1059,7 +1069,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1059,7 +1069,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public boolean updateDisplayConversation(ImConversationDisplayUpdate imConversationDisplayUpdate) { public boolean updateDisplayConversation(ImConversationDisplayUpdate imConversationDisplayUpdate) {
ImClient curentClient = imClientService.getCurrentClient(); // 获取当前client
ImClient curentClient = contextService.getImClientIfNotNullOrThrow();
for (Long id : imConversationDisplayUpdate.getConversationIds()) { for (Long id : imConversationDisplayUpdate.getConversationIds()) {
// 修改为删除隐藏状态 // 修改为删除隐藏状态
boolean update = imConversationMembersService.update(new UpdateWrapper<ImConversationMembers>() boolean update = imConversationMembersService.update(new UpdateWrapper<ImConversationMembers>()
...@@ -1093,7 +1104,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1093,7 +1104,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override @Override
public List<ConversationVo> getMyImConversationListAndMsgCount() { public List<ConversationVo> getMyImConversationListAndMsgCount() {
try { try {
ImClient currentClient = imClientService.getCurrentClient(); // 获取当前client
ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
// 查询用户加入的所有会话 与每个会话的未读条数 成员 // 查询用户加入的所有会话 与每个会话的未读条数 成员
List<ConversationVo> myImConversationListAndMsgCount = imConversationMapper.getMyImConversationListAndMsgCount(currentClient.getId(), currentClient.getClientId(), null); List<ConversationVo> myImConversationListAndMsgCount = imConversationMapper.getMyImConversationListAndMsgCount(currentClient.getId(), currentClient.getClientId(), null);
...@@ -1126,7 +1138,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1126,7 +1138,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override @Override
public ConversationVo infoImConversationAndMsgCount(ImConversationQueryParam param) { public ConversationVo infoImConversationAndMsgCount(ImConversationQueryParam param) {
try { try {
ImClient client = imClientService.getCurrentClient(); // 获取当前client
ImClient client = contextService.getImClientIfNotNullOrThrow();
// 查询用户加入的所有会话 与每个会话的未读条数 成员 // 查询用户加入的所有会话 与每个会话的未读条数 成员
List<ConversationVo> conversationList = imConversationMapper.getMyImConversationListAndMsgCount(client.getId(), client.getClientId(), param.getId()); List<ConversationVo> conversationList = imConversationMapper.getMyImConversationListAndMsgCount(client.getId(), client.getClientId(), param.getId());
if (CollectionUtils.isEmpty(conversationList)) { if (CollectionUtils.isEmpty(conversationList)) {
......
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