|
|
@@ -1,19 +1,31 @@
|
|
|
package com.bx.implatform.service.impl;
|
|
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.bx.imclient.IMClient;
|
|
|
+import com.bx.imcommon.enums.IMTerminalType;
|
|
|
+import com.bx.imcommon.model.IMPrivateMessage;
|
|
|
+import com.bx.imcommon.model.IMUserInfo;
|
|
|
import com.bx.implatform.contant.RedisKey;
|
|
|
import com.bx.implatform.entity.Friend;
|
|
|
+import com.bx.implatform.entity.PrivateMessage;
|
|
|
import com.bx.implatform.entity.User;
|
|
|
+import com.bx.implatform.enums.MessageStatus;
|
|
|
+import com.bx.implatform.enums.MessageType;
|
|
|
import com.bx.implatform.exception.GlobalException;
|
|
|
import com.bx.implatform.mapper.FriendMapper;
|
|
|
+import com.bx.implatform.mapper.PrivateMessageMapper;
|
|
|
import com.bx.implatform.mapper.UserMapper;
|
|
|
import com.bx.implatform.service.FriendService;
|
|
|
import com.bx.implatform.session.SessionContext;
|
|
|
import com.bx.implatform.session.UserSession;
|
|
|
+import com.bx.implatform.util.BeanUtils;
|
|
|
import com.bx.implatform.vo.FriendVO;
|
|
|
+import com.bx.implatform.vo.PrivateMessageVO;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.aop.framework.AopContext;
|
|
|
@@ -23,8 +35,10 @@ import org.springframework.cache.annotation.Cacheable;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
+import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import java.util.Objects;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
@Slf4j
|
|
|
@Service
|
|
|
@@ -32,15 +46,33 @@ import java.util.Objects;
|
|
|
@CacheConfig(cacheNames = RedisKey.IM_CACHE_FRIEND)
|
|
|
public class FriendServiceImpl extends ServiceImpl<FriendMapper, Friend> implements FriendService {
|
|
|
|
|
|
+ private final PrivateMessageMapper privateMessageMapper;
|
|
|
private final UserMapper userMapper;
|
|
|
+ private final IMClient imClient;
|
|
|
|
|
|
@Override
|
|
|
- public List<Friend> findFriendByUserId(Long userId) {
|
|
|
- LambdaQueryWrapper<Friend> queryWrapper = Wrappers.lambdaQuery();
|
|
|
- queryWrapper.eq(Friend::getUserId, userId);
|
|
|
- return this.list(queryWrapper);
|
|
|
+ public List<Friend> findAllFriends() {
|
|
|
+ Long userId = SessionContext.getSession().getUserId();
|
|
|
+ LambdaQueryWrapper<Friend> wrapper = Wrappers.lambdaQuery();
|
|
|
+ wrapper.eq(Friend::getUserId, userId);
|
|
|
+ return this.list(wrapper);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public List<Friend> findByFriendIds(List<Long> friendIds) {
|
|
|
+ Long userId = SessionContext.getSession().getUserId();
|
|
|
+ LambdaQueryWrapper<Friend> wrapper = Wrappers.lambdaQuery();
|
|
|
+ wrapper.eq(Friend::getUserId, userId);
|
|
|
+ wrapper.in(Friend::getFriendId, friendIds);
|
|
|
+ wrapper.eq(Friend::getDeleted,false);
|
|
|
+ return this.list(wrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<FriendVO> findFriends() {
|
|
|
+ List<Friend> friends = this.findAllFriends();
|
|
|
+ return friends.stream().map(this::conver).collect(Collectors.toList());
|
|
|
+ }
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@Override
|
|
|
@@ -50,53 +82,37 @@ public class FriendServiceImpl extends ServiceImpl<FriendMapper, Friend> impleme
|
|
|
throw new GlobalException("不允许添加自己为好友");
|
|
|
}
|
|
|
// 互相绑定好友关系
|
|
|
- FriendServiceImpl proxy = (FriendServiceImpl) AopContext.currentProxy();
|
|
|
+ FriendServiceImpl proxy = (FriendServiceImpl)AopContext.currentProxy();
|
|
|
proxy.bindFriend(userId, friendId);
|
|
|
proxy.bindFriend(friendId, userId);
|
|
|
+ // 推送添加好友提示
|
|
|
+ sendAddTipMessage(friendId);
|
|
|
log.info("添加好友,用户id:{},好友id:{}", userId, friendId);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@Override
|
|
|
public void delFriend(Long friendId) {
|
|
|
- long userId = SessionContext.getSession().getUserId();
|
|
|
+ Long userId = SessionContext.getSession().getUserId();
|
|
|
// 互相解除好友关系,走代理清理缓存
|
|
|
- FriendServiceImpl proxy = (FriendServiceImpl) AopContext.currentProxy();
|
|
|
+ FriendServiceImpl proxy = (FriendServiceImpl)AopContext.currentProxy();
|
|
|
proxy.unbindFriend(userId, friendId);
|
|
|
proxy.unbindFriend(friendId, userId);
|
|
|
+ // 推送解除好友提示
|
|
|
+ sendDelTipMessage(friendId);
|
|
|
log.info("删除好友,用户id:{},好友id:{}", userId, friendId);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
@Cacheable(key = "#userId1+':'+#userId2")
|
|
|
@Override
|
|
|
public Boolean isFriend(Long userId1, Long userId2) {
|
|
|
- QueryWrapper<Friend> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda()
|
|
|
- .eq(Friend::getUserId, userId1)
|
|
|
- .eq(Friend::getFriendId, userId2);
|
|
|
- return this.count(queryWrapper) > 0;
|
|
|
+ LambdaQueryWrapper<Friend> wrapper = Wrappers.lambdaQuery();
|
|
|
+ wrapper.eq(Friend::getUserId, userId1);
|
|
|
+ wrapper.eq(Friend::getFriendId, userId2);
|
|
|
+ wrapper.eq(Friend::getDeleted,false);
|
|
|
+ return this.exists(wrapper);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- @Override
|
|
|
- public void update(FriendVO vo) {
|
|
|
- long userId = SessionContext.getSession().getUserId();
|
|
|
- QueryWrapper<Friend> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda()
|
|
|
- .eq(Friend::getUserId, userId)
|
|
|
- .eq(Friend::getFriendId, vo.getId());
|
|
|
- Friend f = this.getOne(queryWrapper);
|
|
|
- if (Objects.isNull(f)) {
|
|
|
- throw new GlobalException("对方不是您的好友");
|
|
|
- }
|
|
|
- f.setFriendHeadImage(vo.getHeadImage());
|
|
|
- f.setFriendNickName(vo.getNickName());
|
|
|
- this.updateById(f);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
/**
|
|
|
* 单向绑定好友关系
|
|
|
*
|
|
|
@@ -105,22 +121,23 @@ public class FriendServiceImpl extends ServiceImpl<FriendMapper, Friend> impleme
|
|
|
*/
|
|
|
@CacheEvict(key = "#userId+':'+#friendId")
|
|
|
public void bindFriend(Long userId, Long friendId) {
|
|
|
- QueryWrapper<Friend> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda()
|
|
|
- .eq(Friend::getUserId, userId)
|
|
|
- .eq(Friend::getFriendId, friendId);
|
|
|
- if (this.count(queryWrapper) == 0) {
|
|
|
- Friend friend = new Friend();
|
|
|
- friend.setUserId(userId);
|
|
|
- friend.setFriendId(friendId);
|
|
|
- User friendInfo = userMapper.selectById(friendId);
|
|
|
- friend.setFriendHeadImage(friendInfo.getHeadImage());
|
|
|
- friend.setFriendNickName(friendInfo.getNickName());
|
|
|
- this.save(friend);
|
|
|
+ QueryWrapper<Friend> wrapper = new QueryWrapper<>();
|
|
|
+ wrapper.lambda().eq(Friend::getUserId, userId).eq(Friend::getFriendId, friendId);
|
|
|
+ Friend friend = this.getOne(wrapper);
|
|
|
+ if (Objects.isNull(friend)) {
|
|
|
+ friend = new Friend();
|
|
|
}
|
|
|
+ friend.setUserId(userId);
|
|
|
+ friend.setFriendId(friendId);
|
|
|
+ User friendInfo = userMapper.selectById(friendId);
|
|
|
+ friend.setFriendHeadImage(friendInfo.getHeadImage());
|
|
|
+ friend.setFriendNickName(friendInfo.getNickName());
|
|
|
+ friend.setDeleted(false);
|
|
|
+ this.saveOrUpdate(friend);
|
|
|
+ // 推送好友变化信息s
|
|
|
+ sendAddFriendMessage(userId, friendId, friend);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
* 单向解除好友关系
|
|
|
*
|
|
|
@@ -129,30 +146,112 @@ public class FriendServiceImpl extends ServiceImpl<FriendMapper, Friend> impleme
|
|
|
*/
|
|
|
@CacheEvict(key = "#userId+':'+#friendId")
|
|
|
public void unbindFriend(Long userId, Long friendId) {
|
|
|
- QueryWrapper<Friend> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda()
|
|
|
- .eq(Friend::getUserId, userId)
|
|
|
- .eq(Friend::getFriendId, friendId);
|
|
|
- List<Friend> friends = this.list(queryWrapper);
|
|
|
- friends.forEach(friend -> this.removeById(friend.getId()));
|
|
|
+ // 逻辑删除
|
|
|
+ LambdaUpdateWrapper<Friend> wrapper = Wrappers.lambdaUpdate();
|
|
|
+ wrapper.eq(Friend::getUserId, userId);
|
|
|
+ wrapper.eq(Friend::getFriendId, friendId);
|
|
|
+ wrapper.set(Friend::getDeleted,true);
|
|
|
+ this.update(wrapper);
|
|
|
+ // 推送好友变化信息
|
|
|
+ sendDelFriendMessage(userId, friendId);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
@Override
|
|
|
public FriendVO findFriend(Long friendId) {
|
|
|
UserSession session = SessionContext.getSession();
|
|
|
- QueryWrapper<Friend> wrapper = new QueryWrapper<>();
|
|
|
- wrapper.lambda()
|
|
|
- .eq(Friend::getUserId, session.getUserId())
|
|
|
- .eq(Friend::getFriendId, friendId);
|
|
|
+ LambdaQueryWrapper<Friend> wrapper = Wrappers.lambdaQuery();
|
|
|
+ wrapper.eq(Friend::getUserId, session.getUserId());
|
|
|
+ wrapper.eq(Friend::getFriendId, friendId);
|
|
|
Friend friend = this.getOne(wrapper);
|
|
|
if (Objects.isNull(friend)) {
|
|
|
throw new GlobalException("对方不是您的好友");
|
|
|
}
|
|
|
+ return conver(friend);
|
|
|
+ }
|
|
|
+
|
|
|
+ private FriendVO conver(Friend f) {
|
|
|
FriendVO vo = new FriendVO();
|
|
|
- vo.setId(friend.getFriendId());
|
|
|
- vo.setHeadImage(friend.getFriendHeadImage());
|
|
|
- vo.setNickName(friend.getFriendNickName());
|
|
|
+ vo.setId(f.getFriendId());
|
|
|
+ vo.setHeadImage(f.getFriendHeadImage());
|
|
|
+ vo.setNickName(f.getFriendNickName());
|
|
|
+ vo.setDeleted(f.getDeleted());
|
|
|
return vo;
|
|
|
}
|
|
|
+
|
|
|
+ void sendAddFriendMessage(Long userId, Long friendId, Friend friend) {
|
|
|
+ // 推送好友状态信息
|
|
|
+ PrivateMessageVO msgInfo = new PrivateMessageVO();
|
|
|
+ msgInfo.setSendId(friendId);
|
|
|
+ msgInfo.setRecvId(userId);
|
|
|
+ msgInfo.setSendTime(new Date());
|
|
|
+ msgInfo.setType(MessageType.FRIEND_NEW.code());
|
|
|
+ FriendVO vo = conver(friend);
|
|
|
+ msgInfo.setContent(JSON.toJSONString(vo));
|
|
|
+ IMPrivateMessage<PrivateMessageVO> sendMessage = new IMPrivateMessage<>();
|
|
|
+ sendMessage.setSender(new IMUserInfo(friendId, IMTerminalType.UNKNOW.code()));
|
|
|
+ sendMessage.setRecvId(userId);
|
|
|
+ sendMessage.setData(msgInfo);
|
|
|
+ sendMessage.setSendToSelf(false);
|
|
|
+ sendMessage.setSendResult(false);
|
|
|
+ imClient.sendPrivateMessage(sendMessage);
|
|
|
+ }
|
|
|
+
|
|
|
+ void sendDelFriendMessage(Long userId, Long friendId) {
|
|
|
+ // 推送好友状态信息
|
|
|
+ PrivateMessageVO msgInfo = new PrivateMessageVO();
|
|
|
+ msgInfo.setSendId(friendId);
|
|
|
+ msgInfo.setRecvId(userId);
|
|
|
+ msgInfo.setSendTime(new Date());
|
|
|
+ msgInfo.setType(MessageType.FRIEND_DEL.code());
|
|
|
+ IMPrivateMessage<PrivateMessageVO> sendMessage = new IMPrivateMessage<>();
|
|
|
+ sendMessage.setSender(new IMUserInfo(friendId, IMTerminalType.UNKNOW.code()));
|
|
|
+ sendMessage.setRecvId(userId);
|
|
|
+ sendMessage.setData(msgInfo);
|
|
|
+ sendMessage.setSendToSelf(false);
|
|
|
+ sendMessage.setSendResult(false);
|
|
|
+ imClient.sendPrivateMessage(sendMessage);
|
|
|
+ }
|
|
|
+
|
|
|
+ void sendAddTipMessage(Long friendId) {
|
|
|
+ UserSession session = SessionContext.getSession();
|
|
|
+ PrivateMessage msg = new PrivateMessage();
|
|
|
+ msg.setSendId(session.getUserId());
|
|
|
+ msg.setRecvId(friendId);
|
|
|
+ msg.setContent("你们已成为好友,现在可以开始聊天了");
|
|
|
+ msg.setSendTime(new Date());
|
|
|
+ msg.setStatus(MessageStatus.UNSEND.code());
|
|
|
+ msg.setType(MessageType.TIP_TEXT.code());
|
|
|
+ privateMessageMapper.insert(msg);
|
|
|
+ // 推给对方
|
|
|
+ PrivateMessageVO messageInfo = BeanUtils.copyProperties(msg, PrivateMessageVO.class);
|
|
|
+ IMPrivateMessage<PrivateMessageVO> sendMessage = new IMPrivateMessage<>();
|
|
|
+ sendMessage.setSender(new IMUserInfo(session.getUserId(), session.getTerminal()));
|
|
|
+ sendMessage.setRecvId(friendId);
|
|
|
+ sendMessage.setSendToSelf(false);
|
|
|
+ sendMessage.setData(messageInfo);
|
|
|
+ imClient.sendPrivateMessage(sendMessage);
|
|
|
+ // 推给自己
|
|
|
+ sendMessage.setRecvId(session.getUserId());
|
|
|
+ imClient.sendPrivateMessage(sendMessage);
|
|
|
+ }
|
|
|
+
|
|
|
+ void sendDelTipMessage(Long friendId){
|
|
|
+ UserSession session = SessionContext.getSession();
|
|
|
+ // 推送好友状态信息
|
|
|
+ PrivateMessage msg = new PrivateMessage();
|
|
|
+ msg.setSendId(session.getUserId());
|
|
|
+ msg.setRecvId(friendId);
|
|
|
+ msg.setSendTime(new Date());
|
|
|
+ msg.setType(MessageType.TIP_TEXT.code());
|
|
|
+ msg.setStatus(MessageStatus.UNSEND.code());
|
|
|
+ msg.setContent("你们的好友关系已被解除");
|
|
|
+ privateMessageMapper.insert(msg);
|
|
|
+ // 推送
|
|
|
+ PrivateMessageVO messageInfo = BeanUtils.copyProperties(msg, PrivateMessageVO.class);
|
|
|
+ IMPrivateMessage<PrivateMessageVO> sendMessage = new IMPrivateMessage<>();
|
|
|
+ sendMessage.setSender(new IMUserInfo(friendId, IMTerminalType.UNKNOW.code()));
|
|
|
+ sendMessage.setRecvId(friendId);
|
|
|
+ sendMessage.setData(messageInfo);
|
|
|
+ imClient.sendPrivateMessage(sendMessage);
|
|
|
+ }
|
|
|
}
|