Skip to content

Commit 0955852

Browse files
authored
Merge pull request #168 from SEMOSAN/fix/#167-withdraw-fk-constraint
[Fix] 회원탈퇴 시 course_difficulty_feedbacks FK 제약 위반 500 에러 수정
2 parents 0f3ad92 + ace46a3 commit 0955852

3 files changed

Lines changed: 31 additions & 0 deletions

File tree

src/main/java/com/semosan/api/domain/hiking/repository/CourseDifficultyFeedbackRepository.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,21 @@
22

33
import com.semosan.api.domain.hiking.entity.CourseDifficultyFeedback;
44
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.data.jpa.repository.Modifying;
6+
import org.springframework.data.jpa.repository.Query;
7+
import org.springframework.data.repository.query.Param;
8+
9+
import java.util.List;
510

611
public interface CourseDifficultyFeedbackRepository extends JpaRepository<CourseDifficultyFeedback, Long> {
712

813
boolean existsByHikingRecord_Id(Long hikingRecordId);
14+
15+
@Modifying(clearAutomatically = true)
16+
@Query("DELETE FROM CourseDifficultyFeedback cdf WHERE cdf.user.id = :userId")
17+
void deleteByUserId(@Param("userId") Long userId);
18+
19+
@Modifying(clearAutomatically = true)
20+
@Query("DELETE FROM CourseDifficultyFeedback cdf WHERE cdf.hikingRecord.id IN :hikingRecordIds")
21+
void deleteByHikingRecordIdIn(@Param("hikingRecordIds") List<Long> hikingRecordIds);
922
}

src/main/java/com/semosan/api/domain/user/service/UserService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.semosan.api.common.exception.GeneralException;
44
import com.semosan.api.common.status.ErrorStatus;
5+
import com.semosan.api.domain.hiking.repository.CourseDifficultyFeedbackRepository;
56
import com.semosan.api.domain.hiking.repository.HikingMemberRepository;
67
import com.semosan.api.domain.hiking.repository.HikingRecordRepository;
78
import com.semosan.api.domain.mountain.repository.CourseLikeRepository;
@@ -38,6 +39,7 @@ public class UserService {
3839
private final ReviewRepository reviewRepository;
3940
private final HikingMemberRepository hikingMemberRepository;
4041
private final HikingRecordRepository hikingRecordRepository;
42+
private final CourseDifficultyFeedbackRepository courseDifficultyFeedbackRepository;
4143
private final NotificationRepository notificationRepository;
4244
private final DefaultNicknameGenerator defaultNicknameGenerator;
4345
private final NicknamePolicy nicknamePolicy;
@@ -147,9 +149,11 @@ private void deleteUserChildRecords(Long userId) {
147149
mountainLikeRepository.deleteByUser_Id(userId);
148150
courseLikeRepository.deleteByUser_Id(userId);
149151
reviewRepository.deleteByUser_Id(userId);
152+
courseDifficultyFeedbackRepository.deleteByUserId(userId);
150153
List<Long> recordIdsToDelete = hikingRecordRepository.findRecordIdsOnlyParticipatedByUser(userId);
151154
hikingMemberRepository.deleteByUser_Id(userId);
152155
if (!recordIdsToDelete.isEmpty()) {
156+
courseDifficultyFeedbackRepository.deleteByHikingRecordIdIn(recordIdsToDelete);
153157
hikingRecordRepository.deleteAllByIdInBatch(recordIdsToDelete);
154158
}
155159
notificationRepository.deleteAllByUserId(userId);

src/test/java/com/semosan/api/domain/user/service/UserServiceTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.semosan.api.domain.user.service;
22

3+
import com.semosan.api.domain.hiking.repository.CourseDifficultyFeedbackRepository;
34
import com.semosan.api.domain.hiking.repository.HikingMemberRepository;
45
import com.semosan.api.domain.hiking.repository.HikingRecordRepository;
56
import com.semosan.api.domain.mountain.repository.CourseLikeRepository;
@@ -17,6 +18,7 @@
1718
import com.semosan.api.domain.user.repository.UserRepository;
1819
import org.junit.jupiter.api.Test;
1920
import org.junit.jupiter.api.extension.ExtendWith;
21+
import org.mockito.InOrder;
2022
import org.mockito.InjectMocks;
2123
import org.mockito.Mock;
2224
import org.mockito.junit.jupiter.MockitoExtension;
@@ -27,6 +29,7 @@
2729

2830
import static org.assertj.core.api.Assertions.assertThat;
2931
import static org.mockito.ArgumentMatchers.any;
32+
import static org.mockito.Mockito.inOrder;
3033
import static org.mockito.Mockito.verify;
3134
import static org.mockito.Mockito.when;
3235

@@ -57,6 +60,9 @@ class UserServiceTest {
5760
@Mock
5861
private HikingRecordRepository hikingRecordRepository;
5962

63+
@Mock
64+
private CourseDifficultyFeedbackRepository courseDifficultyFeedbackRepository;
65+
6066
@Mock
6167
private NotificationRepository notificationRepository;
6268

@@ -173,8 +179,10 @@ void withdrawUserDeletesUserChildRecordsAndSoftDeletesUser() {
173179

174180
verify(mountainLikeRepository).deleteByUser_Id(1L);
175181
verify(reviewRepository).deleteByUser_Id(1L);
182+
verify(courseDifficultyFeedbackRepository).deleteByUserId(1L);
176183
verify(hikingRecordRepository).findRecordIdsOnlyParticipatedByUser(1L);
177184
verify(hikingMemberRepository).deleteByUser_Id(1L);
185+
verify(courseDifficultyFeedbackRepository).deleteByHikingRecordIdIn(List.of(10L, 11L));
178186
verify(hikingRecordRepository).deleteAllByIdInBatch(List.of(10L, 11L));
179187
verify(notificationRepository).deleteAllByUserId(1L);
180188
verify(userOnboardingRepository).deleteByUser_Id(1L);
@@ -187,5 +195,11 @@ void withdrawUserDeletesUserChildRecordsAndSoftDeletesUser() {
187195
assertThat(user.getNickname()).isNull();
188196
assertThat(user.getOauthId()).isEqualTo("WITHDRAWN:1:TEST");
189197
assertThat(user.getOnboardingStatus()).isEqualTo(OnboardingStatus.INCOMPLETE);
198+
199+
InOrder deleteOrder = inOrder(courseDifficultyFeedbackRepository, hikingRecordRepository);
200+
deleteOrder.verify(courseDifficultyFeedbackRepository).deleteByUserId(1L);
201+
deleteOrder.verify(hikingRecordRepository).findRecordIdsOnlyParticipatedByUser(1L);
202+
deleteOrder.verify(courseDifficultyFeedbackRepository).deleteByHikingRecordIdIn(List.of(10L, 11L));
203+
deleteOrder.verify(hikingRecordRepository).deleteAllByIdInBatch(List.of(10L, 11L));
190204
}
191205
}

0 commit comments

Comments
 (0)