diff --git a/backend/emm-sale/src/docs/asciidoc/index.adoc b/backend/emm-sale/src/docs/asciidoc/index.adoc index 9c5fb7637..8d1a83cd7 100644 --- a/backend/emm-sale/src/docs/asciidoc/index.adoc +++ b/backend/emm-sale/src/docs/asciidoc/index.adoc @@ -95,7 +95,6 @@ include::{snippets}/find-profile/http-response.adoc[] .HTTP response 설명 include::{snippets}/find-profile/response-fields.adoc[] - == Event === `GET` : 행사 상세정보 조회 @@ -257,3 +256,13 @@ include::{snippets}/find-notification/response-fields.adoc[] .HTTP response include::{snippets}/find-notification/http-response.adoc[] +=== `GET` : 사용자가 받은 모든 알림 목록 조회 + +.HTTP request +include::{snippets}/find-all-notifications/http-request.adoc[] + +.HTTP response 설명 +include::{snippets}/find-all-notifications/response-fields.adoc[] + +.HTTP response +include::{snippets}/find-all-notifications/http-response.adoc[] diff --git a/backend/emm-sale/src/main/java/com/emmsale/notification/api/NotificationApi.java b/backend/emm-sale/src/main/java/com/emmsale/notification/api/NotificationApi.java index 3bc8bdfa2..2c82c19f6 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/notification/api/NotificationApi.java +++ b/backend/emm-sale/src/main/java/com/emmsale/notification/api/NotificationApi.java @@ -1,11 +1,13 @@ package com.emmsale.notification.api; +import com.emmsale.member.domain.Member; import com.emmsale.notification.application.NotificationCommandService; import com.emmsale.notification.application.NotificationQueryService; import com.emmsale.notification.application.dto.FcmTokenRequest; import com.emmsale.notification.application.dto.NotificationModifyRequest; import com.emmsale.notification.application.dto.NotificationRequest; import com.emmsale.notification.application.dto.NotificationResponse; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.GetMapping; @@ -49,4 +51,10 @@ public NotificationResponse find( ) { return notificationQueryService.findNotificationBy(notificationId); } + + @GetMapping("/notifications") + @ResponseStatus(HttpStatus.OK) + public List findAll(final Member member) { + return notificationCommandService.findAllNotifications(member); + } } diff --git a/backend/emm-sale/src/main/java/com/emmsale/notification/application/NotificationCommandService.java b/backend/emm-sale/src/main/java/com/emmsale/notification/application/NotificationCommandService.java index 861002b10..532cd1d8f 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/notification/application/NotificationCommandService.java +++ b/backend/emm-sale/src/main/java/com/emmsale/notification/application/NotificationCommandService.java @@ -4,6 +4,7 @@ import static com.emmsale.notification.exception.NotificationExceptionType.BAD_REQUEST_MEMBER_ID; import static com.emmsale.notification.exception.NotificationExceptionType.NOT_FOUND_NOTIFICATION; +import com.emmsale.member.domain.Member; import com.emmsale.member.domain.MemberRepository; import com.emmsale.member.exception.MemberException; import com.emmsale.notification.application.dto.FcmTokenRequest; @@ -16,6 +17,7 @@ import com.emmsale.notification.domain.NotificationRepository; import com.emmsale.notification.exception.NotificationException; import java.util.List; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -95,4 +97,13 @@ public void modify( savedNotification.modifyStatus(notificationModifyRequest.getUpdatedStatus()); } + + public List findAllNotifications(final Member member) { + final List notifications = notificationRepository.findAllByReceiverId( + member.getId()); + + return notifications.stream() + .map(NotificationResponse::from) + .collect(Collectors.toList()); + } } diff --git a/backend/emm-sale/src/main/java/com/emmsale/notification/domain/NotificationRepository.java b/backend/emm-sale/src/main/java/com/emmsale/notification/domain/NotificationRepository.java index 5f5440697..9235bb85f 100644 --- a/backend/emm-sale/src/main/java/com/emmsale/notification/domain/NotificationRepository.java +++ b/backend/emm-sale/src/main/java/com/emmsale/notification/domain/NotificationRepository.java @@ -1,7 +1,9 @@ package com.emmsale.notification.domain; +import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; public interface NotificationRepository extends JpaRepository { + List findAllByReceiverId(Long memberId); } diff --git a/backend/emm-sale/src/test/java/com/emmsale/notification/api/NotificationApiTest.java b/backend/emm-sale/src/test/java/com/emmsale/notification/api/NotificationApiTest.java index 001527272..cff5a9647 100644 --- a/backend/emm-sale/src/test/java/com/emmsale/notification/api/NotificationApiTest.java +++ b/backend/emm-sale/src/test/java/com/emmsale/notification/api/NotificationApiTest.java @@ -24,6 +24,7 @@ import com.emmsale.notification.application.dto.NotificationRequest; import com.emmsale.notification.application.dto.NotificationResponse; import com.emmsale.notification.domain.NotificationStatus; +import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; @@ -184,4 +185,35 @@ void test_find() throws Exception { .andDo(print()) .andDo(document("find-notification", responseFields, pathParameters)); } + + @Test + @DisplayName("사용자가 받은 알림의 목록을 성공적으로 반환하면 200 OK를 반환한다.") + void test_findAll() throws Exception { + //given + final String accessToken = "Bearer access_token"; + + final long memberId = 1L; + + final List expectResponses = List.of( + new NotificationResponse(931L, 3342L, memberId, "같이 가요~", 312L), + new NotificationResponse(932L, 1345L, memberId, "소통해요~", 123L) + ); + + when(notificationCommandService.findAllNotifications(any())).thenReturn(expectResponses); + + final ResponseFieldsSnippet responseFields = responseFields( + fieldWithPath("[].notificationId").description("저장된 알림 ID"), + fieldWithPath("[].senderId").description("보내는 사람 ID"), + fieldWithPath("[].receiverId").description("받는 사람 ID"), + fieldWithPath("[].message").description("알림 보낼 때 메시지"), + fieldWithPath("[].eventId").description("행사 ID") + ); + + //when & then + mockMvc.perform(get("/notifications") + .header("Authorization", accessToken)) + .andExpect(status().isOk()) + .andDo(print()) + .andDo(document("find-all-notifications", responseFields)); + } } diff --git a/backend/emm-sale/src/test/java/com/emmsale/notification/application/NotificationCommandServiceTest.java b/backend/emm-sale/src/test/java/com/emmsale/notification/application/NotificationCommandServiceTest.java index 09ccdb30e..f00a9f6ff 100644 --- a/backend/emm-sale/src/test/java/com/emmsale/notification/application/NotificationCommandServiceTest.java +++ b/backend/emm-sale/src/test/java/com/emmsale/notification/application/NotificationCommandServiceTest.java @@ -7,6 +7,8 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import com.emmsale.helper.ServiceIntegrationTestHelper; +import com.emmsale.member.domain.Member; +import com.emmsale.member.domain.MemberRepository; import com.emmsale.notification.application.dto.FcmTokenRequest; import com.emmsale.notification.application.dto.NotificationModifyRequest; import com.emmsale.notification.application.dto.NotificationRequest; @@ -18,12 +20,15 @@ import com.emmsale.notification.domain.NotificationStatus; import com.emmsale.notification.exception.NotificationException; import com.emmsale.notification.exception.NotificationExceptionType; +import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.jdbc.Sql; +@Sql("/data-test.sql") class NotificationCommandServiceTest extends ServiceIntegrationTestHelper { @Autowired @@ -32,6 +37,8 @@ class NotificationCommandServiceTest extends ServiceIntegrationTestHelper { private FcmTokenRepository fcmTokenRepository; @Autowired private NotificationRepository notificationRepository; + @Autowired + private MemberRepository memberRepository; @Test @DisplayName("create() : 알림을 새로 생성할 수 있다.") @@ -157,4 +164,30 @@ void test_modify() throws Exception { //then assertEquals(request.getUpdatedStatus(), updatedNotification.getStatus()); } + + @Test + @DisplayName("Member가 받은 모든 알림 목록을 조회한다.") + void test_findAllNotifications() { + //given + final Member sender = memberRepository.findById(1L).get(); + final Member receiver = memberRepository.findById(2L).get(); + + final String message1 = "message123"; + final String message2 = "message321"; + + notificationRepository.save( + new Notification(sender.getId(), receiver.getId(), 123L, message1) + ); + notificationRepository.save( + new Notification(sender.getId(), receiver.getId(), 321L, message2) + ); + + //when + final List notifications = notificationCommandService.findAllNotifications( + receiver); + + //then + assertThat(notifications).extracting("message", String.class) + .containsExactly(message1, message2); + } } diff --git a/backend/emm-sale/src/test/resources/data-test.sql b/backend/emm-sale/src/test/resources/data-test.sql index dbff92e1a..22365ae5a 100644 --- a/backend/emm-sale/src/test/resources/data-test.sql +++ b/backend/emm-sale/src/test/resources/data-test.sql @@ -7,6 +7,7 @@ truncate table tag; truncate table event_tag; truncate table member_tag; truncate table event_member; +truncate table notification; insert into activity(id, type, name) values (1, 'CLUB', 'YAPP');