- 实现了本地IM缓存功能,支持会话、消息历史和草稿的存储 - 开发了聊天界面UI组件,包含消息列表、输入框和搜索功能 - 创建了聊天相关的ViewModel,处理消息收发和状态管理 - 构建了会话列表界面,支持置顶、免打扰和删除操作 - 集成了群组功能,实现群聊管理和群设置界面 - 添加了实时消息推送和会话状态同步机制
90 行
3.9 KiB
Java
90 行
3.9 KiB
Java
package com.xuqm.im.service;
|
|
|
|
import com.xuqm.common.exception.BusinessException;
|
|
import com.xuqm.im.entity.ImFriendRequestEntity;
|
|
import com.xuqm.im.repository.ImFriendRequestRepository;
|
|
import com.xuqm.im.repository.ImFriendRepository;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
import java.time.LocalDateTime;
|
|
import java.util.List;
|
|
import java.util.UUID;
|
|
|
|
@Service
|
|
public class FriendRequestService {
|
|
|
|
private final ImFriendRequestRepository requestRepository;
|
|
private final ImFriendRepository friendRepository;
|
|
|
|
public FriendRequestService(ImFriendRequestRepository requestRepository,
|
|
ImFriendRepository friendRepository) {
|
|
this.requestRepository = requestRepository;
|
|
this.friendRepository = friendRepository;
|
|
}
|
|
|
|
@Transactional
|
|
public ImFriendRequestEntity send(String appId, String fromUserId, String toUserId, String remark) {
|
|
return requestRepository.findByAppIdAndFromUserIdAndToUserId(appId, fromUserId, toUserId)
|
|
.orElseGet(() -> {
|
|
ImFriendRequestEntity entity = new ImFriendRequestEntity();
|
|
entity.setId(UUID.randomUUID().toString());
|
|
entity.setAppId(appId);
|
|
entity.setFromUserId(fromUserId);
|
|
entity.setToUserId(toUserId);
|
|
entity.setRemark(remark);
|
|
entity.setStatus(ImFriendRequestEntity.Status.PENDING.name());
|
|
entity.setCreatedAt(LocalDateTime.now());
|
|
return requestRepository.save(entity);
|
|
});
|
|
}
|
|
|
|
@Transactional
|
|
public ImFriendRequestEntity accept(String appId, String requestId, String operatorId) {
|
|
ImFriendRequestEntity request = getRequest(appId, requestId, operatorId);
|
|
request.setStatus(ImFriendRequestEntity.Status.ACCEPTED.name());
|
|
request.setReviewedAt(LocalDateTime.now());
|
|
requestRepository.save(request);
|
|
friendRepository
|
|
.findByAppIdAndUserIdAndFriendId(appId, request.getFromUserId(), request.getToUserId())
|
|
.orElseGet(() -> friendEntity(appId, request.getFromUserId(), request.getToUserId()));
|
|
friendRepository
|
|
.findByAppIdAndUserIdAndFriendId(appId, request.getToUserId(), request.getFromUserId())
|
|
.orElseGet(() -> friendEntity(appId, request.getToUserId(), request.getFromUserId()));
|
|
return request;
|
|
}
|
|
|
|
@Transactional
|
|
public ImFriendRequestEntity reject(String appId, String requestId, String operatorId) {
|
|
ImFriendRequestEntity request = getRequest(appId, requestId, operatorId);
|
|
request.setStatus(ImFriendRequestEntity.Status.REJECTED.name());
|
|
request.setReviewedAt(LocalDateTime.now());
|
|
return requestRepository.save(request);
|
|
}
|
|
|
|
public List<ImFriendRequestEntity> incoming(String appId, String userId) {
|
|
return requestRepository.findByAppIdAndToUserId(appId, userId);
|
|
}
|
|
|
|
public List<ImFriendRequestEntity> outgoing(String appId, String userId) {
|
|
return requestRepository.findByAppIdAndFromUserId(appId, userId);
|
|
}
|
|
|
|
private ImFriendRequestEntity getRequest(String appId, String requestId, String operatorId) {
|
|
ImFriendRequestEntity request = requestRepository.findById(requestId)
|
|
.orElseThrow(() -> new BusinessException(404, "好友申请不存在"));
|
|
if (!request.getAppId().equals(appId) || !request.getToUserId().equals(operatorId)) {
|
|
throw new BusinessException(403, "无权操作");
|
|
}
|
|
return request;
|
|
}
|
|
|
|
private com.xuqm.im.entity.ImFriendEntity friendEntity(String appId, String userId, String friendId) {
|
|
com.xuqm.im.entity.ImFriendEntity entity = new com.xuqm.im.entity.ImFriendEntity();
|
|
entity.setAppId(appId);
|
|
entity.setUserId(userId);
|
|
entity.setFriendId(friendId);
|
|
return friendRepository.save(entity);
|
|
}
|
|
}
|