Skip to content

Commit 27f7410

Browse files
committed
fix: 코스 좋아요 토글 응답 단순화
1 parent 4d22886 commit 27f7410

6 files changed

Lines changed: 3 additions & 30 deletions

File tree

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.semosan.api.domain.mountain.dto.response;
22

33
public record CourseLikeToggleResponse(
4-
boolean liked,
5-
long count
4+
boolean liked
65
) {
76
}

src/main/java/com/semosan/api/domain/mountain/repository/CourseLikeRepository.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ public interface CourseLikeRepository extends JpaRepository<CourseLike, Long> {
1414

1515
Optional<CourseLike> findByUser_IdAndCourse_Id(Long userId, Long courseId);
1616

17-
long countByCourse_Id(Long courseId);
18-
1917
@Modifying(clearAutomatically = true)
2018
@Query("DELETE FROM CourseLike cl WHERE cl.user.id = :userId")
2119
void deleteByUser_Id(@Param("userId") Long userId);

src/main/java/com/semosan/api/domain/mountain/service/CourseLikeService.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ public class CourseLikeService {
2727
@Transactional(noRollbackFor = DataIntegrityViolationException.class)
2828
public CourseLikeToggleResponse toggleCourseLike(Long userId, Long courseId) {
2929
boolean liked = toggle(userId, courseId);
30-
long count = courseLikeRepository.countByCourse_Id(courseId);
31-
return new CourseLikeToggleResponse(liked, count);
30+
return new CourseLikeToggleResponse(liked);
3231
}
3332

3433
private boolean toggle(Long userId, Long courseId) {

src/main/java/com/semosan/api/domain/mountain/service/CourseService.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import com.semosan.api.domain.mountain.repository.CourseLikeRepository;
77
import com.semosan.api.domain.mountain.repository.CourseRepository;
88
import com.semosan.api.domain.mountain.repository.projection.CourseDetailProjection;
9-
import com.semosan.api.domain.user.service.UserReader;
109
import lombok.RequiredArgsConstructor;
1110
import org.springframework.stereotype.Service;
1211
import org.springframework.transaction.annotation.Transactional;
@@ -18,13 +17,11 @@ public class CourseService {
1817

1918
private final CourseRepository courseRepository;
2019
private final CourseLikeRepository courseLikeRepository;
21-
private final UserReader userReader;
2220

2321
public CourseDetailResponse getCourseDetail(Long userId, Long courseId) {
24-
userReader.findCompletedOnboardingUserById(userId);
2522
CourseDetailProjection course = courseRepository.findCourseDetailById(courseId)
2623
.orElseThrow(() -> new GeneralException(ErrorStatus.COURSE_NOT_FOUND));
27-
boolean likedByMe = courseLikeRepository.existsByUser_IdAndCourse_Id(userId, courseId);
24+
boolean likedByMe = userId != null && courseLikeRepository.existsByUser_IdAndCourse_Id(userId, courseId);
2825
return CourseDetailResponse.from(course, likedByMe);
2926
}
3027
}

src/test/java/com/semosan/api/domain/mountain/service/CourseLikeServiceTest.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,10 @@ void toggleCourseLikeCreatesLikeWhenNotLiked() throws Exception {
4747
when(userReader.findCompletedOnboardingUserById(1L)).thenReturn(user);
4848
when(courseRepository.findById(10L)).thenReturn(Optional.of(course));
4949
when(courseLikeRepository.findByUser_IdAndCourse_Id(1L, 10L)).thenReturn(Optional.empty());
50-
when(courseLikeRepository.countByCourse_Id(10L)).thenReturn(1L);
5150

5251
CourseLikeToggleResponse response = courseLikeService.toggleCourseLike(1L, 10L);
5352

5453
assertThat(response.liked()).isTrue();
55-
assertThat(response.count()).isEqualTo(1L);
5654
verify(courseLikeRepository).save(any(CourseLike.class));
5755
}
5856

@@ -65,12 +63,10 @@ void toggleCourseLikeDeletesLikeWhenAlreadyLiked() throws Exception {
6563
when(userReader.findCompletedOnboardingUserById(1L)).thenReturn(user);
6664
when(courseRepository.findById(10L)).thenReturn(Optional.of(course));
6765
when(courseLikeRepository.findByUser_IdAndCourse_Id(1L, 10L)).thenReturn(Optional.of(courseLike));
68-
when(courseLikeRepository.countByCourse_Id(10L)).thenReturn(0L);
6966

7067
CourseLikeToggleResponse response = courseLikeService.toggleCourseLike(1L, 10L);
7168

7269
assertThat(response.liked()).isFalse();
73-
assertThat(response.count()).isZero();
7470
verify(courseLikeRepository).delete(courseLike);
7571
}
7672

@@ -83,12 +79,10 @@ void toggleCourseLikeReturnsLikedWhenConcurrentDuplicateDetected() throws Except
8379
when(courseRepository.findById(10L)).thenReturn(Optional.of(course));
8480
when(courseLikeRepository.findByUser_IdAndCourse_Id(1L, 10L)).thenReturn(Optional.empty());
8581
when(courseLikeRepository.save(any(CourseLike.class))).thenThrow(new DataIntegrityViolationException("duplicate"));
86-
when(courseLikeRepository.countByCourse_Id(10L)).thenReturn(1L);
8782

8883
CourseLikeToggleResponse response = courseLikeService.toggleCourseLike(1L, 10L);
8984

9085
assertThat(response.liked()).isTrue();
91-
assertThat(response.count()).isEqualTo(1L);
9286
}
9387

9488
private User user(Long id) {

src/test/java/com/semosan/api/domain/mountain/service/CourseServiceTest.java

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,11 @@
66
import com.semosan.api.domain.mountain.repository.CourseLikeRepository;
77
import com.semosan.api.domain.mountain.repository.CourseRepository;
88
import com.semosan.api.domain.mountain.repository.projection.CourseDetailProjection;
9-
import com.semosan.api.domain.user.entity.User;
10-
import com.semosan.api.domain.user.enums.user.DeviceType;
11-
import com.semosan.api.domain.user.service.UserReader;
129
import org.junit.jupiter.api.Test;
1310
import org.junit.jupiter.api.extension.ExtendWith;
1411
import org.mockito.InjectMocks;
1512
import org.mockito.Mock;
1613
import org.mockito.junit.jupiter.MockitoExtension;
17-
import org.springframework.test.util.ReflectionTestUtils;
1814

1915
import java.util.Optional;
2016

@@ -31,9 +27,6 @@ class CourseServiceTest {
3127
@Mock
3228
private CourseLikeRepository courseLikeRepository;
3329

34-
@Mock
35-
private UserReader userReader;
36-
3730
@Mock
3831
private CourseDetailProjection projection;
3932

@@ -42,7 +35,6 @@ class CourseServiceTest {
4235

4336
@Test
4437
void getCourseDetailIncludesLikedByMe() {
45-
when(userReader.findCompletedOnboardingUserById(1L)).thenReturn(user(1L));
4638
when(courseRepository.findCourseDetailById(10L)).thenReturn(Optional.of(projection));
4739
when(courseLikeRepository.existsByUser_IdAndCourse_Id(1L, 10L)).thenReturn(true);
4840
stubProjection();
@@ -56,7 +48,6 @@ void getCourseDetailIncludesLikedByMe() {
5648

5749
@Test
5850
void getCourseDetailThrowsWhenCourseNotFound() {
59-
when(userReader.findCompletedOnboardingUserById(1L)).thenReturn(user(1L));
6051
when(courseRepository.findCourseDetailById(10L)).thenReturn(Optional.empty());
6152

6253
assertThatThrownBy(() -> courseService.getCourseDetail(1L, 10L))
@@ -80,9 +71,4 @@ private void stubProjection() {
8071
when(projection.getAltitudes()).thenReturn(null);
8172
}
8273

83-
private User user(Long id) {
84-
User user = User.createTestUser("user-" + id, DeviceType.IOS);
85-
ReflectionTestUtils.setField(user, "id", id);
86-
return user;
87-
}
8874
}

0 commit comments

Comments
 (0)