diff --git a/src/main/java/com/ject/studytrip/member/application/facade/MemberFacade.java b/src/main/java/com/ject/studytrip/member/application/facade/MemberFacade.java index f1edfbf..976c3c8 100644 --- a/src/main/java/com/ject/studytrip/member/application/facade/MemberFacade.java +++ b/src/main/java/com/ject/studytrip/member/application/facade/MemberFacade.java @@ -102,6 +102,9 @@ public PresignedProfileImageInfo issuePresignedUrl( return PresignedProfileImageInfo.of(member.getId(), info.tmpKey(), info.presignedUrl()); } + @CacheEvict( + cacheNames = MEMBER, + key = "T(com.ject.studytrip.global.common.factory.CacheKeyFactory).member(#memberId)") @Transactional public void confirmImage(Long memberId, ConfirmProfileImageRequest request) { Member member = memberQueryService.getValidMember(memberId); diff --git a/src/main/java/com/ject/studytrip/mission/application/service/MissionQueryService.java b/src/main/java/com/ject/studytrip/mission/application/service/MissionQueryService.java index d7c7bec..82eaaf5 100644 --- a/src/main/java/com/ject/studytrip/mission/application/service/MissionQueryService.java +++ b/src/main/java/com/ject/studytrip/mission/application/service/MissionQueryService.java @@ -24,6 +24,7 @@ public Mission getValidMission(Long stampId, Long missionId) { MissionPolicy.validateMissionBelongsToStamp(stampId, mission); MissionPolicy.validateNotDeleted(mission); + MissionPolicy.validateCompleted(mission); return mission; } diff --git a/src/main/java/com/ject/studytrip/stamp/application/service/StampQueryService.java b/src/main/java/com/ject/studytrip/stamp/application/service/StampQueryService.java index 71b0588..e2a22d4 100644 --- a/src/main/java/com/ject/studytrip/stamp/application/service/StampQueryService.java +++ b/src/main/java/com/ject/studytrip/stamp/application/service/StampQueryService.java @@ -30,6 +30,7 @@ public Stamp getValidStamp(Long tripId, Long stampId) { StampPolicy.validateStampBelongsToTrip(tripId, stamp); StampPolicy.validateNotDeleted(stamp); + StampPolicy.validateCompleted(stamp); return stamp; } diff --git a/src/main/java/com/ject/studytrip/studylog/application/facade/StudyLogFacade.java b/src/main/java/com/ject/studytrip/studylog/application/facade/StudyLogFacade.java index 338d489..4b0f660 100644 --- a/src/main/java/com/ject/studytrip/studylog/application/facade/StudyLogFacade.java +++ b/src/main/java/com/ject/studytrip/studylog/application/facade/StudyLogFacade.java @@ -119,6 +119,7 @@ public PresignedStudyLogImageInfo issuePresignedUrl( return PresignedStudyLogImageInfo.of(studyLog.getId(), info.tmpKey(), info.presignedUrl()); } + @CacheEvict(cacheNames = STUDY_LOGS, allEntries = true) @Transactional public void confirmImage(Long studyLogId, ConfirmStudyLogImageRequest request) { StudyLog studyLog = studyLogQueryService.getValidStudyLog(studyLogId); diff --git a/src/main/java/com/ject/studytrip/trip/application/service/TripQueryService.java b/src/main/java/com/ject/studytrip/trip/application/service/TripQueryService.java index caaaf83..841ac34 100644 --- a/src/main/java/com/ject/studytrip/trip/application/service/TripQueryService.java +++ b/src/main/java/com/ject/studytrip/trip/application/service/TripQueryService.java @@ -33,6 +33,7 @@ public Trip getValidTrip(Long memberId, Long tripId) { TripPolicy.validateOwner(memberId, trip); TripPolicy.validateNotDeleted(trip); + TripPolicy.validateCompleted(trip); return trip; } diff --git a/src/test/java/com/ject/studytrip/mission/application/service/MissionQueryServiceTest.java b/src/test/java/com/ject/studytrip/mission/application/service/MissionQueryServiceTest.java index d8b036c..17b9d71 100644 --- a/src/test/java/com/ject/studytrip/mission/application/service/MissionQueryServiceTest.java +++ b/src/test/java/com/ject/studytrip/mission/application/service/MissionQueryServiceTest.java @@ -99,6 +99,21 @@ void shouldThrowExceptionWhenMissionIsDeleted() { .hasMessage(MissionErrorCode.MISSION_ALREADY_DELETED.getMessage()); } + @Test + @DisplayName("미션이 이미 완료된 경우 예외가 발생한다.") + void shouldThrowExceptionWhenMissionIsCompleted() { + // given + exploreMission1.updateCompleted(); + Long stampId = exploreStamp.getId(); + Long missionId = exploreMission1.getId(); + given(missionRepository.findById(missionId)).willReturn(Optional.of(exploreMission1)); + + // when & then + assertThatThrownBy(() -> missionQueryService.getValidMission(stampId, missionId)) + .isInstanceOf(CustomException.class) + .hasMessage(MissionErrorCode.MISSION_ALREADY_COMPLETED.getMessage()); + } + @Test @DisplayName("특정 스탬프에 속하고 삭제되지 않은 미션이 존재하면, 해당 미션을 반환한다.") void shouldReturnValidMission() { diff --git a/src/test/java/com/ject/studytrip/stamp/application/service/StampQueryServiceTest.java b/src/test/java/com/ject/studytrip/stamp/application/service/StampQueryServiceTest.java index 07dfc42..ef6dbf3 100644 --- a/src/test/java/com/ject/studytrip/stamp/application/service/StampQueryServiceTest.java +++ b/src/test/java/com/ject/studytrip/stamp/application/service/StampQueryServiceTest.java @@ -85,17 +85,31 @@ void shouldThrowExceptionWhenStampDoesNotBelongToTrip() { void shouldThrowExceptionWhenStampAlreadyDeleted() { // given courseStamp1.updateDeletedAt(); - given(stampRepository.findById(any())).willReturn(Optional.ofNullable(courseStamp1)); + Long tripId = courseTrip.getId(); + Long stampId = courseStamp1.getId(); + given(stampRepository.findById(stampId)).willReturn(Optional.ofNullable(courseStamp1)); // when & then - assertThatThrownBy( - () -> - stampQueryService.getValidStamp( - courseStamp1.getId(), courseStamp1.getId())) + assertThatThrownBy(() -> stampQueryService.getValidStamp(tripId, stampId)) .isInstanceOf(CustomException.class) .hasMessage(StampErrorCode.STAMP_ALREADY_DELETED.getMessage()); } + @Test + @DisplayName("완료된 스탬프일 경우 예외가 발생한다.") + void shouldThrowExceptionWhenStampAlreadyCompleted() { + // given + courseStamp1.updateCompleted(); + Long tripId = courseTrip.getId(); + Long stampId = courseStamp1.getId(); + given(stampRepository.findById(stampId)).willReturn(Optional.ofNullable(courseStamp1)); + + // when & then + assertThatThrownBy(() -> stampQueryService.getValidStamp(tripId, stampId)) + .isInstanceOf(CustomException.class) + .hasMessage(StampErrorCode.STAMP_ALREADY_COMPLETED.getMessage()); + } + @Test @DisplayName("스탬프 ID로 스탬프를 조회하고, 여행 소속 및 삭제 여부를 검증하고 반환한다") void shouldGetStampReturnValidStamp() { diff --git a/src/test/java/com/ject/studytrip/trip/application/service/TripQueryServiceTest.java b/src/test/java/com/ject/studytrip/trip/application/service/TripQueryServiceTest.java index e80c3d7..6785706 100644 --- a/src/test/java/com/ject/studytrip/trip/application/service/TripQueryServiceTest.java +++ b/src/test/java/com/ject/studytrip/trip/application/service/TripQueryServiceTest.java @@ -112,6 +112,20 @@ void shouldThrowExceptionWhenAlreadyTrip() { .hasMessage(TripErrorCode.TRIP_ALREADY_DELETED.getMessage()); } + @Test + @DisplayName("이미 완료된 여행일 경우 예외가 발생한다") + void shouldThrowExceptionWhenTripAlreadyCompleted() { + // given + trip.updateCompleted(); + Long tripId = trip.getId(); + given(tripRepository.findById(tripId)).willReturn(Optional.of(trip)); + + // when & then + assertThatThrownBy(() -> tripQueryService.getValidTrip(member.getId(), tripId)) + .isInstanceOf(CustomException.class) + .hasMessage(TripErrorCode.TRIP_ALREADY_COMPLETED.getMessage()); + } + @Test @DisplayName("특정 여행 ID로 DB에서 조회한 후 유효한 여행을 반환한다") void shouldGetTripByTripIdReturnValidTrip() {