From 6fe1b802b891afe2c9bc68ca367e496c81f14cde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=B6=A9=EB=A0=AC=28=ED=8A=B8=EB=A0=88=29?= <37261785+takoyakimchi@users.noreply.github.com> Date: Mon, 9 Sep 2024 15:08:28 +0900 Subject: [PATCH] =?UTF-8?q?[BE]=20fix:=20=EC=B1=84=ED=8C=85=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=20=EA=B8=B0=EA=B8=B0=20=ED=86=A0=ED=81=B0=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80,=20=EC=9E=90=EC=8B=A0=EC=97=90=EA=B2=8C=EB=8A=94=20?= =?UTF-8?q?=EC=B1=84=ED=8C=85=20=EC=95=8C=EB=A6=BC=EC=9D=84=20=EC=A0=84?= =?UTF-8?q?=EC=86=A1=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20(#527)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/DeviceTokenRepository.java | 5 ++-- .../service/FcmNotificationService.java | 11 ++++++--- .../repository/DeviceTokenRepositoryTest.java | 24 +++++++++++-------- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/backend/src/main/java/com/happy/friendogly/notification/repository/DeviceTokenRepository.java b/backend/src/main/java/com/happy/friendogly/notification/repository/DeviceTokenRepository.java index 7d12ae7b5..771598b24 100644 --- a/backend/src/main/java/com/happy/friendogly/notification/repository/DeviceTokenRepository.java +++ b/backend/src/main/java/com/happy/friendogly/notification/repository/DeviceTokenRepository.java @@ -20,9 +20,10 @@ default DeviceToken getByMemberId(Long memberId) { SELECT dt.deviceToken FROM DeviceToken dt INNER JOIN ChatRoomMember chatRoomMember ON dt.member.id = chatRoomMember.member.id - WHERE chatRoomMember.chatRoom.id = :chatRoomId + WHERE chatRoomMember.chatRoom.id = :chatRoomId AND dt.member.id != :myMemberId """) - List findAllByChatRoomId(@Param("chatRoomId") Long chatRoomId); + List findAllByChatRoomIdWithoutMine( + @Param("chatRoomId") Long chatRoomId, @Param("myMemberId") Long myMemberId); void deleteByMemberId(Long memberId); } diff --git a/backend/src/main/java/com/happy/friendogly/notification/service/FcmNotificationService.java b/backend/src/main/java/com/happy/friendogly/notification/service/FcmNotificationService.java index 139a2cc03..954bd51c3 100644 --- a/backend/src/main/java/com/happy/friendogly/notification/service/FcmNotificationService.java +++ b/backend/src/main/java/com/happy/friendogly/notification/service/FcmNotificationService.java @@ -2,6 +2,7 @@ import static com.happy.friendogly.notification.domain.NotificationType.CHAT; import static com.happy.friendogly.notification.domain.NotificationType.FOOTPRINT; +import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; import com.google.firebase.FirebaseApp; import com.google.firebase.messaging.FirebaseMessaging; @@ -15,7 +16,6 @@ import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Profile; -import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -55,7 +55,12 @@ public void sendFootprintNotification(String title, String content, List @Override public void sendChatNotification(Long chatRoomId, ChatMessageResponse response) { - List receiverTokens = deviceTokenRepository.findAllByChatRoomId(chatRoomId); + List receiverTokens = deviceTokenRepository + .findAllByChatRoomIdWithoutMine(chatRoomId, response.senderMemberId()); + + if (receiverTokens.isEmpty()) { + throw new FriendoglyException("기기 토큰이 비어 있어 알림을 전송할 수 없습니다.", INTERNAL_SERVER_ERROR); + } Map data = Map.of( "chatRoomId", chatRoomId.toString(), @@ -88,7 +93,7 @@ private void sendNotificationWithType( firebaseMessaging.sendEachForMulticast(message); } catch (FirebaseMessagingException e) { throw new FriendoglyException("FCM을 통해 사용자에게 알림을 보내는 과정에서 에러가 발생했습니다.", - HttpStatus.INTERNAL_SERVER_ERROR); + INTERNAL_SERVER_ERROR); } } } diff --git a/backend/src/test/java/com/happy/friendogly/notification/repository/DeviceTokenRepositoryTest.java b/backend/src/test/java/com/happy/friendogly/notification/repository/DeviceTokenRepositoryTest.java index 7fb214ba9..97619204f 100644 --- a/backend/src/test/java/com/happy/friendogly/notification/repository/DeviceTokenRepositoryTest.java +++ b/backend/src/test/java/com/happy/friendogly/notification/repository/DeviceTokenRepositoryTest.java @@ -24,23 +24,27 @@ class DeviceTokenRepositoryTest { @Autowired private ChatRoomRepository chatRoomRepository; - @DisplayName("채팅방 ID로부터 device token을 가져올 수 있다.") + @DisplayName("채팅방 ID로부터 자기 자신을 제외한 device token들을 가져올 수 있다.") @Test void findAllByChatRoomId() { // given - Member member1 = memberRepository.save(new Member("name1", "tag1", "https://test.com/test.jpg")); - Member member2 = memberRepository.save(new Member("name2", "tag2", "https://test.com/test.jpg")); - Member member3 = memberRepository.save(new Member("name3", "tag3", "https://test.com/test.jpg")); + Member me = memberRepository.save(new Member("name1", "tag1", "https://test.com/test.jpg")); + Member other1 = memberRepository.save(new Member("name2", "tag2", "https://test.com/test.jpg")); + Member other2 = memberRepository.save(new Member("name3", "tag3", "https://test.com/test.jpg")); + Member notInChatRoom = memberRepository.save(new Member("name4", "tag4", "https://test.com/test.jpg")); - deviceTokenRepository.save(new DeviceToken(member1, "token1")); - deviceTokenRepository.save(new DeviceToken(member2, "token2")); - deviceTokenRepository.save(new DeviceToken(member3, "token3")); + deviceTokenRepository.save(new DeviceToken(me, "token1")); + deviceTokenRepository.save(new DeviceToken(other1, "token2")); + deviceTokenRepository.save(new DeviceToken(other2, "token3")); + deviceTokenRepository.save(new DeviceToken(notInChatRoom, "token4")); ChatRoom chatRoom = chatRoomRepository.save(ChatRoom.createGroup(5)); - chatRoom.addMember(member1); - chatRoom.addMember(member2); + chatRoom.addMember(me); + chatRoom.addMember(other1); + chatRoom.addMember(other2); // when - then - assertThat(deviceTokenRepository.findAllByChatRoomId(chatRoom.getId())).containsExactly("token1", "token2"); + assertThat(deviceTokenRepository.findAllByChatRoomIdWithoutMine(chatRoom.getId(), me.getId())) + .containsExactly("token2", "token3"); } }