package cn.iocoder.yudao.module.im.dal.mysql.friend; import cn.hutool.core.date.LocalDateTimeUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.im.controller.admin.manager.friend.vo.ImFriendManagerPageReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.friend.ImFriendDO; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.apache.ibatis.annotations.Mapper; import java.time.LocalDateTime; import java.util.Collection; import java.util.List; /** * IM 好友关系 Mapper * * @author 芋道源码 */ @Mapper public interface ImFriendMapper extends BaseMapperX { default ImFriendDO selectByUserIdAndFriendUserId(Long userId, Long friendUserId) { return selectOne(new LambdaQueryWrapperX() .eq(ImFriendDO::getUserId, userId) .eq(ImFriendDO::getFriendUserId, friendUserId)); } default List selectListByUserId(Long userId) { return selectList(new LambdaQueryWrapperX() .eq(ImFriendDO::getUserId, userId) .orderByDesc(ImFriendDO::getId)); } /** * 增量拉取当前用户的好友关系(含已删除,按 update_time + id 正向游标) * * @param userId 当前用户编号 * @param lastUpdateTime 上次拉取到的更新时间;首次拉取传 null * @param lastId 上次拉取到的记录编号;首次拉取传 null * @param limit 拉取数量 * @return 好友关系列表 */ default List selectPullListByUserId(Long userId, Long lastUpdateTime, Long lastId, Integer limit) { LambdaQueryWrapperX query = new LambdaQueryWrapperX() .eq(ImFriendDO::getUserId, userId); if (lastUpdateTime != null && lastId != null) { LocalDateTime lastTime = LocalDateTimeUtil.of(lastUpdateTime); query.and(w -> w.gt(ImFriendDO::getUpdateTime, lastTime) .or(n -> n.eq(ImFriendDO::getUpdateTime, lastTime).gt(ImFriendDO::getId, lastId))); } return selectList(query.orderByAsc(ImFriendDO::getUpdateTime).orderByAsc(ImFriendDO::getId) .last("LIMIT " + limit)); } default List selectListByUserIdAndStatus(Long userId, Integer status) { return selectList(new LambdaQueryWrapperX() .eq(ImFriendDO::getUserId, userId) .eq(ImFriendDO::getStatus, status) .orderByDesc(ImFriendDO::getId)); } default List selectListByUserIdAndFriendUserIdsAndStatus(Long userId, Collection friendUserIds, Integer status) { return selectList(new LambdaQueryWrapperX() .eq(ImFriendDO::getUserId, userId) .in(ImFriendDO::getFriendUserId, friendUserIds) .eq(ImFriendDO::getStatus, status)); } default List selectListByUserIdsAndFriendUserIdAndStatus(Collection userIds, Long friendUserId, Integer status) { return selectList(new LambdaQueryWrapperX() .in(ImFriendDO::getUserId, userIds) .eq(ImFriendDO::getFriendUserId, friendUserId) .eq(ImFriendDO::getStatus, status)); } default PageResult selectPage(ImFriendManagerPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(ImFriendDO::getUserId, reqVO.getUserId()) .eqIfPresent(ImFriendDO::getFriendUserId, reqVO.getFriendUserId()) .eqIfPresent(ImFriendDO::getStatus, reqVO.getStatus()) .eqIfPresent(ImFriendDO::getSilent, reqVO.getSilent()) .betweenIfPresent(ImFriendDO::getAddTime, reqVO.getAddTime()) .orderByDesc(ImFriendDO::getId)); } @SuppressWarnings("UnusedReturnValue") default int updateReAddFields(Long id, Integer status, LocalDateTime addTime, LocalDateTime updateTime, Boolean silent, Boolean pinned, Boolean blocked, String displayName, Integer addSource) { return update(null, Wrappers.lambdaUpdate() .eq(ImFriendDO::getId, id) .set(ImFriendDO::getStatus, status) .set(ImFriendDO::getAddTime, addTime) .set(ImFriendDO::getUpdateTime, updateTime) .set(ImFriendDO::getSilent, silent) .set(ImFriendDO::getPinned, pinned) .set(ImFriendDO::getBlocked, blocked) .set(ImFriendDO::getDisplayName, displayName) .set(ImFriendDO::getAddSource, addSource) .set(ImFriendDO::getDeleteTime, null)); } }