diff --git a/src/main/java/ku_rum/backend/domain/alarm/application/AlarmService.java b/src/main/java/ku_rum/backend/domain/alarm/application/AlarmService.java index 9652936b..d45924ef 100644 --- a/src/main/java/ku_rum/backend/domain/alarm/application/AlarmService.java +++ b/src/main/java/ku_rum/backend/domain/alarm/application/AlarmService.java @@ -167,6 +167,13 @@ public GetAlarmDisableResponse findDisableAlarm(CustomUserDetails userDetails) { return GetAlarmDisableResponse.from(userDisabledAlarms); } + @Transactional + public void patchAllUserAlarm(CustomUserDetails userDetails) { + User user = userService.getUser(); + userAnnouncementRepository.markCheckedByUser(user); + alarmRepository.markCheckedByUser(user); + } + private PatchAlarmResponse patchAlarm(Long userId, Long alarmId) { Alarm alarm = findAlarmById(alarmId); diff --git a/src/main/java/ku_rum/backend/domain/alarm/domain/repository/AlarmRepository.java b/src/main/java/ku_rum/backend/domain/alarm/domain/repository/AlarmRepository.java index 2c54c7e6..049a7eab 100644 --- a/src/main/java/ku_rum/backend/domain/alarm/domain/repository/AlarmRepository.java +++ b/src/main/java/ku_rum/backend/domain/alarm/domain/repository/AlarmRepository.java @@ -6,6 +6,7 @@ import ku_rum.backend.domain.user.domain.User; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -24,4 +25,8 @@ public interface AlarmRepository extends JpaRepository { Optional findById(Long AlarmId); long countByUserAndIsCheckedFalse(User user); + + @Modifying + @Query("UPDATE Alarm alarm SET alarm.isChecked = true WHERE alarm.user = :user AND alarm.isChecked = false") + int markCheckedByUser(@Param("user") User user); } diff --git a/src/main/java/ku_rum/backend/domain/alarm/domain/repository/UserAnnouncementRepository.java b/src/main/java/ku_rum/backend/domain/alarm/domain/repository/UserAnnouncementRepository.java index 188a434b..8c27c553 100644 --- a/src/main/java/ku_rum/backend/domain/alarm/domain/repository/UserAnnouncementRepository.java +++ b/src/main/java/ku_rum/backend/domain/alarm/domain/repository/UserAnnouncementRepository.java @@ -5,6 +5,7 @@ import ku_rum.backend.domain.user.domain.User; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -24,4 +25,8 @@ List findUserAnnouncement(@Param("user") User user, @Param("la Pageable pageable); long countByUserAndIsCheckedFalse(User user); + + @Modifying + @Query("UPDATE UserAnnouncement ua SET ua.isChecked = true WHERE ua.user = :user AND ua.isChecked = false") + int markCheckedByUser(@Param("user") User user); } diff --git a/src/main/java/ku_rum/backend/domain/alarm/presentation/AlarmController.java b/src/main/java/ku_rum/backend/domain/alarm/presentation/AlarmController.java index 46b5a26c..af4c8494 100644 --- a/src/main/java/ku_rum/backend/domain/alarm/presentation/AlarmController.java +++ b/src/main/java/ku_rum/backend/domain/alarm/presentation/AlarmController.java @@ -51,6 +51,12 @@ public BaseResponse patchAlarm( return BaseResponse.ok(response); } + @PatchMapping("/read-all") + public BaseResponse patchAllAlarm(@AuthenticationPrincipal final CustomUserDetails userDetails) { + alarmService.patchAllUserAlarm(userDetails); + return BaseResponse.ok(); + } + @PostMapping("/direct") public BaseResponse sendFcmMessage(@RequestBody DirectNotificationRequest request) { FcmDirectDto fcmDirectDto = new FcmDirectDto(request.title(), request.body(), request.userIds()); diff --git a/src/main/resources/config b/src/main/resources/config index b9a38aae..963495c4 160000 --- a/src/main/resources/config +++ b/src/main/resources/config @@ -1 +1 @@ -Subproject commit b9a38aae3b125092669fc3d9216c47acd765d8ea +Subproject commit 963495c41dce741c660957ec16da3727c9f41935 diff --git a/src/test/java/ku_rum/backend/domain/alarm/presentation/AlarmControllerTest.java b/src/test/java/ku_rum/backend/domain/alarm/presentation/AlarmControllerTest.java index 565189fa..94c9f1f7 100644 --- a/src/test/java/ku_rum/backend/domain/alarm/presentation/AlarmControllerTest.java +++ b/src/test/java/ku_rum/backend/domain/alarm/presentation/AlarmControllerTest.java @@ -4,6 +4,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.doNothing; import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.patch; @@ -277,4 +278,33 @@ void getDisableAlarm() throws Exception { .build() ))); } + + @DisplayName("알림을 전부 읽는다") + @Test + void patchAllAlarm() throws Exception { + // given + + doNothing().when(alarmService).patchAllUserAlarm(any()); + + // when + mockMvc.perform(patch("/api/v1/alarm/read-all") + .header("Authorization", "Bearer test-access-token")) + // then + .andDo(print()) + .andExpect(status().isOk()) + .andDo(restDocs.document(resource( + ResourceSnippetParameters.builder() + .tag("알림 조회 API") + .description("알림을 전부 확인한다") + .requestHeaders( + headerWithName("Authorization").description("발급 받은 액세스 토큰입니다.") + ) + .responseFields( + fieldWithPath("code").description("응답 코드"), + fieldWithPath("status").description("응답 상태"), + fieldWithPath("message").description("응답 메시지") + ) + .build() + ))); + } }