Skip to content

Commit 76a6c05

Browse files
sh0723junggyo1020s-hwan
authored
Refactor : 반례리스트 조회 (#406)
Co-authored-by: Willie <150939763+junggyo1020@users.noreply.github.com> Co-authored-by: shshwn <87060472+s-hwan@users.noreply.github.com>
1 parent e10e5a8 commit 76a6c05

File tree

7 files changed

+77
-15
lines changed

7 files changed

+77
-15
lines changed

src/main/java/com/gamzabat/algohub/common/annotation/AuthedUser.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@
1111
@Retention(RetentionPolicy.RUNTIME)
1212
@Hidden
1313
public @interface AuthedUser {
14+
boolean required() default true;
1415
}

src/main/java/com/gamzabat/algohub/common/annotation/AuthedUserResolver.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,19 @@ public boolean supportsParameter(MethodParameter parameter) {
2929
@Override
3030
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
3131
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
32+
AuthedUser authedUser = parameter.getParameterAnnotation(AuthedUser.class);
33+
boolean required = authedUser.required();
34+
3235
String jwt = webRequest.getHeader("Authorization");
33-
if (jwt != null)
34-
return userRepository.findByEmail(tokenProvider.getUserEmail(jwt))
35-
.orElseThrow(() -> new UserValidationException("없는 사용자 입니다."));
36-
else
37-
throw new UserValidationException("로그인 되지 않았습니다.");
36+
37+
if (jwt == null || jwt.isBlank()) {
38+
if (required) {
39+
throw new UserValidationException("로그인되지 않았습니다.");
40+
} else {
41+
return null;
42+
}
43+
}
44+
return userRepository.findByEmail(tokenProvider.getUserEmail(jwt))
45+
.orElseThrow(() -> new UserValidationException("없는 사용자입니다."));
3846
}
3947
}

src/main/java/com/gamzabat/algohub/feature/edgecase/controller/EdgeCaseController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,11 @@ public ResponseEntity<Void> createEdgeCase(@AuthedUser User user,
4949
@GetMapping("/list")
5050
@Operation(summary = "반례리스트 조회")
5151
public ResponseEntity<GetEdgeCaseListResponse> getEdgeCaseList(
52+
@AuthedUser(required = false) User user,
5253
@RequestParam(required = false) Integer problemNumber,
5354
@RequestParam(required = false, defaultValue = "RECENT") EdgeCaseSortType sort
5455
) {
55-
GetEdgeCaseListResponse response = edgeCaseService.getEdgeCaseList(problemNumber, sort);
56+
GetEdgeCaseListResponse response = edgeCaseService.getEdgeCaseList(user, problemNumber, sort);
5657

5758
return ResponseEntity.ok().body(response);
5859
}

src/main/java/com/gamzabat/algohub/feature/edgecase/dto/GetEdgeCaseResponse.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ public record GetEdgeCaseResponse(
1010
String title,
1111
String input,
1212
String output,
13-
Integer like) {
13+
Integer like,
14+
Boolean isLiked) {
1415
}

src/main/java/com/gamzabat/algohub/feature/edgecase/repository/EdgeCaseLikeRepository.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@
1212
public interface EdgeCaseLikeRepository extends JpaRepository<EdgeCaseLike, Long> {
1313
Optional<EdgeCaseLike> findByEdgeCaseAndUser(EdgeCase edgeCase, User user);
1414
List<EdgeCaseLike> findAllByEdgeCase(EdgeCase edgeCase);
15+
List<EdgeCaseLike> findByUserAndEdgeCaseIn(User user, List<EdgeCase> edgeCases);
1516
}

src/main/java/com/gamzabat/algohub/feature/edgecase/service/EdgeCaseService.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import static com.gamzabat.algohub.constants.ApiConstants.*;
44

5+
import java.util.Collections;
56
import java.util.List;
7+
import java.util.Set;
68
import java.util.stream.Collectors;
79

810
import org.springframework.http.HttpStatus;
@@ -55,8 +57,10 @@ private void saveEdgeCase(User author, CreateEdgeCaseRequest request, int level,
5557
edgeCaseRepository.save(edgeCase);
5658
}
5759

58-
public GetEdgeCaseListResponse getEdgeCaseList(Integer problemNumber, EdgeCaseSortType sort) {
60+
public GetEdgeCaseListResponse getEdgeCaseList(User user, Integer problemNumber, EdgeCaseSortType sort) {
5961
List<EdgeCase> edgeCaseList;
62+
Set<Long> likedEdgeCaseIds = Collections.emptySet();
63+
6064
if (problemNumber == null) {
6165
switch (sort) {
6266
case LIKE:
@@ -85,6 +89,17 @@ public GetEdgeCaseListResponse getEdgeCaseList(Integer problemNumber, EdgeCaseSo
8589
}
8690
}
8791

92+
if (user != null && !edgeCaseList.isEmpty()) {
93+
List<EdgeCaseLike> myLikes =
94+
edgeCaseLikeRepository.findByUserAndEdgeCaseIn(user, edgeCaseList);
95+
96+
likedEdgeCaseIds = myLikes.stream()
97+
.map(like -> like.getEdgeCase().getId())
98+
.collect(Collectors.toSet());
99+
}
100+
101+
final Set<Long> likedIds = likedEdgeCaseIds;
102+
88103
List<GetEdgeCaseResponse> responseList = edgeCaseList.stream()
89104
.map(edgeCase -> new GetEdgeCaseResponse(
90105
edgeCase.getId().intValue(),
@@ -93,7 +108,8 @@ public GetEdgeCaseListResponse getEdgeCaseList(Integer problemNumber, EdgeCaseSo
93108
edgeCase.getTitle(),
94109
edgeCase.getInput(),
95110
edgeCase.getOutput(),
96-
edgeCase.getLikeCount()
111+
edgeCase.getLikeCount(),
112+
likedIds.contains(edgeCase.getId())
97113
))
98114
.collect(Collectors.toList());
99115

src/test/java/com/gamzabat/algohub/service/EdgeCaseServiceTest.java

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.lang.reflect.Field;
88
import java.time.LocalDateTime;
99
import java.util.Arrays;
10+
import java.util.Collections;
1011
import java.util.List;
1112
import java.util.Optional;
1213

@@ -175,7 +176,7 @@ void getEdgeCaseListSuccess_1() {
175176
.thenReturn(edgeCaseList);
176177

177178
//when
178-
GetEdgeCaseListResponse response = edgeCaseService.getEdgeCaseList(problemNumber, EdgeCaseSortType.RECENT);
179+
GetEdgeCaseListResponse response = edgeCaseService.getEdgeCaseList(null,problemNumber, EdgeCaseSortType.RECENT);
179180

180181
//then
181182
assertEquals(2, response.edgeCaseList().size());
@@ -205,7 +206,7 @@ void getEdgeCaseListSuccess_2() {
205206
.thenReturn(edgeCaseList);
206207

207208
// when
208-
GetEdgeCaseListResponse response = edgeCaseService.getEdgeCaseList(problemNumber, EdgeCaseSortType.RECENT);
209+
GetEdgeCaseListResponse response = edgeCaseService.getEdgeCaseList(null, problemNumber, EdgeCaseSortType.RECENT);
209210

210211
// then
211212
assertEquals(3, response.edgeCaseList().size());
@@ -242,7 +243,7 @@ void getEdgeCaseListSuccess_Like_WithProblemNumber() {
242243
.thenReturn(edgeCaseList);
243244

244245
//when
245-
GetEdgeCaseListResponse response = edgeCaseService.getEdgeCaseList(problemNumber, EdgeCaseSortType.LIKE);
246+
GetEdgeCaseListResponse response = edgeCaseService.getEdgeCaseList(null, problemNumber, EdgeCaseSortType.LIKE);
246247

247248
//then
248249
assertThat(response.edgeCaseList()).hasSize(2);
@@ -265,7 +266,7 @@ void getEdgeCaseListSuccess_Like_NoProblemNumber() {
265266
.thenReturn(edgeCaseList);
266267

267268
// when
268-
GetEdgeCaseListResponse response = edgeCaseService.getEdgeCaseList(problemNumber, EdgeCaseSortType.LIKE);
269+
GetEdgeCaseListResponse response = edgeCaseService.getEdgeCaseList(null,problemNumber, EdgeCaseSortType.LIKE);
269270

270271
// then
271272
assertThat(response.edgeCaseList()).hasSize(3);
@@ -289,7 +290,7 @@ void getEdgeCaseListSuccess_Old_WithProblemNumber() {
289290
.thenReturn(edgeCaseList);
290291

291292
//when
292-
GetEdgeCaseListResponse response = edgeCaseService.getEdgeCaseList(problemNumber, EdgeCaseSortType.OLD);
293+
GetEdgeCaseListResponse response = edgeCaseService.getEdgeCaseList(null, problemNumber, EdgeCaseSortType.OLD);
293294

294295
//then
295296
assertThat(response.edgeCaseList()).hasSize(2);
@@ -312,7 +313,7 @@ void getEdgeCaseListSuccess_Old_NoProblemNumber() {
312313
.thenReturn(edgeCaseList);
313314

314315
// when
315-
GetEdgeCaseListResponse response = edgeCaseService.getEdgeCaseList(problemNumber, EdgeCaseSortType.OLD);
316+
GetEdgeCaseListResponse response = edgeCaseService.getEdgeCaseList(null, problemNumber, EdgeCaseSortType.OLD);
316317

317318
// then
318319
assertThat(response.edgeCaseList()).hasSize(3);
@@ -325,6 +326,39 @@ void getEdgeCaseListSuccess_Old_NoProblemNumber() {
325326
);
326327
}
327328

329+
@Test
330+
@DisplayName("반례 리스트 조회 성공 // user가 있고 edgeCaseList가 비어있지 않은 경우")
331+
void getEdgeCaseListSuccess_whenUserExistsAndListNotEmpty() {
332+
// given
333+
List<EdgeCase> edgeCaseList = List.of(edgeCase1, edgeCase2);
334+
when(edgeCaseRepository.findAllByOrderByCreatedAtDesc())
335+
.thenReturn(edgeCaseList);
336+
when(edgeCaseLikeRepository.findByUserAndEdgeCaseIn(user, edgeCaseList))
337+
.thenReturn(Collections.emptyList());
338+
339+
// when
340+
edgeCaseService.getEdgeCaseList(user, null, EdgeCaseSortType.RECENT);
341+
342+
// then
343+
verify(edgeCaseLikeRepository, times(1))
344+
.findByUserAndEdgeCaseIn(user, edgeCaseList);
345+
}
346+
347+
@Test
348+
@DisplayName("반례 리스트 조회 성공 // user가 있고 edgeCaseList가 비어있는 경우")
349+
void getEdgeCaseListSuccess_whenUserExistsAndListEmpty() {
350+
// given
351+
when(edgeCaseRepository.findAllByOrderByCreatedAtDesc())
352+
.thenReturn(Collections.emptyList());
353+
354+
// when
355+
edgeCaseService.getEdgeCaseList(user, null, EdgeCaseSortType.RECENT);
356+
357+
// then
358+
verify(edgeCaseLikeRepository, never())
359+
.findByUserAndEdgeCaseIn(any(), any());
360+
}
361+
328362
@Test
329363
@DisplayName("반례 삭제 성공")
330364
void deleteEdgeCase_success() {

0 commit comments

Comments
 (0)