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 incoming(String appId, String userId) { return requestRepository.findByAppIdAndToUserId(appId, userId); } public List 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); } }