diff --git a/src/main/java/com/umc/yeogi_gal_lae/api/friendship/repository/FriendshipRepository.java b/src/main/java/com/umc/yeogi_gal_lae/api/friendship/repository/FriendshipRepository.java index 99347924..e1174f9a 100644 --- a/src/main/java/com/umc/yeogi_gal_lae/api/friendship/repository/FriendshipRepository.java +++ b/src/main/java/com/umc/yeogi_gal_lae/api/friendship/repository/FriendshipRepository.java @@ -11,7 +11,13 @@ public interface FriendshipRepository extends JpaRepository { Optional findById(Long id); List findByInviterIdOrInviteeId(Long inviterId, Long inviteeId); - Optional findByInviterIdAndInviteeId(Long inviterId, Long inviteeId); + + // inviterId와 inviteeId가 일치하는 Friendship 객체 조회 + @Query("SELECT f FROM Friendship f WHERE (f.inviter.id = :userId AND f.invitee.id = :friendId) OR (f.inviter.id = :friendId AND f.invitee.id = :userId)") + List findByInviterIdAndInviteeIdBothWays(@Param("userId") Long userId, @Param("friendId") Long friendId); + + // 친구 관계가 존재하는지 확인 (양방향) + boolean existsByInviterAndInvitee(User inviter, User invitee); void deleteByInviterOrInvitee(User inviter, User invitee); diff --git a/src/main/java/com/umc/yeogi_gal_lae/api/friendship/service/FriendshipService.java b/src/main/java/com/umc/yeogi_gal_lae/api/friendship/service/FriendshipService.java index 1b54a16e..f9b9e7fc 100644 --- a/src/main/java/com/umc/yeogi_gal_lae/api/friendship/service/FriendshipService.java +++ b/src/main/java/com/umc/yeogi_gal_lae/api/friendship/service/FriendshipService.java @@ -55,15 +55,27 @@ public void acceptInvite(String token, String inviteeEmail) { User invitee = userRepository.findByEmail(inviteeEmail) .orElseThrow(() -> new IllegalArgumentException("Invitee not found")); + // 자신이 자신을 초대하는 경우 방지 + if (invite.getInviter().getId().equals(invitee.getId())) { + throw new IllegalArgumentException("자신은 친구 추가할 수 없습니다."); + } + + // 이미 존재하는 친구 관계 확인 (양방향) + boolean isAlreadyFriend = friendshipRepository.existsByInviterAndInvitee(invite.getInviter(), invitee) + || friendshipRepository.existsByInviterAndInvitee(invitee, invite.getInviter()); + + if (isAlreadyFriend) { + throw new IllegalArgumentException("이미 친구 관계가 존재합니다."); + } + + // 새로운 친구 관계 저장 Friendship friendship = Friendship.builder() .inviter(invite.getInviter()) // User 객체 직접 설정 .invitee(invitee) // 초대받은 User 객체 직접 설정 .status(FriendshipStatus.ACCEPT) .build(); - - - friendshipRepository.save(friendship); // 새로운 친구 관계 저장 + friendshipRepository.save(friendship); // 초대 정보 삭제 friendshipInviteRepository.delete(invite); @@ -131,13 +143,15 @@ private List generateMockFriendList() { @Transactional public void deleteFriendship(Long userId, Long friendId) { - // 친구 관계 조회 (양방향 확인) - Friendship friendship = friendshipRepository.findByInviterIdAndInviteeId(userId, friendId) - .or(() -> friendshipRepository.findByInviterIdAndInviteeId(friendId, userId)) // 반대 방향도 확인 - .orElseThrow(() -> new IllegalArgumentException("친구 관계가 아닙니다. ")); + // 양방향 친구 관계를 모두 조회 + List friendships = friendshipRepository.findByInviterIdAndInviteeIdBothWays(userId, friendId); + + if (friendships.isEmpty()) { + throw new IllegalArgumentException("친구 관계가 아닙니다."); + } - // 친구 관계 삭제 - friendshipRepository.delete(friendship); + // 모든 친구 관계 삭제 + friendshipRepository.deleteAll(friendships); } } \ No newline at end of file