Skip to content

Commit 5c7fd81

Browse files
junggyo1020sh0723
andauthored
feat : 반례게시판 이슈 해결 및 정렬을 위한 분기 param 추가 (#404)
Co-authored-by: sh0723 <pshpark12345@naver.com>
1 parent 6d8abe3 commit 5c7fd81

File tree

7 files changed

+201
-37
lines changed

7 files changed

+201
-37
lines changed

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

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.gamzabat.algohub.feature.edgecase.controller;
22

3-
import org.springframework.http.MediaType;
43
import org.springframework.http.ResponseEntity;
4+
import org.springframework.validation.Errors;
55
import org.springframework.web.bind.annotation.DeleteMapping;
66
import org.springframework.web.bind.annotation.GetMapping;
77
import org.springframework.web.bind.annotation.PatchMapping;
@@ -14,14 +14,13 @@
1414

1515
import com.gamzabat.algohub.common.annotation.AuthedUser;
1616
import com.gamzabat.algohub.exception.RequestException;
17-
import com.gamzabat.algohub.feature.edgecase.domain.EdgeCaseLike;
17+
import com.gamzabat.algohub.feature.edgecase.domain.EdgeCaseSortType;
1818
import com.gamzabat.algohub.feature.edgecase.dto.CreateEdgeCaseRequest;
1919
import com.gamzabat.algohub.feature.edgecase.dto.GetEdgeCaseListResponse;
2020
import com.gamzabat.algohub.feature.edgecase.dto.TogleEdgeCaseResponse;
2121
import com.gamzabat.algohub.feature.edgecase.service.EdgeCaseService;
2222
import com.gamzabat.algohub.feature.user.domain.User;
2323

24-
import org.springframework.validation.Errors;
2524
import io.swagger.v3.oas.annotations.Operation;
2625
import io.swagger.v3.oas.annotations.tags.Tag;
2726
import jakarta.validation.Valid;
@@ -36,20 +35,24 @@ public class EdgeCaseController {
3635

3736
@PostMapping
3837
@Operation(summary = "반례 등록")
39-
public ResponseEntity<Void> createEdgeCase(@AuthedUser User user, @RequestBody @Valid CreateEdgeCaseRequest creatEdgeCaseRequest,
38+
public ResponseEntity<Void> createEdgeCase(@AuthedUser User user,
39+
@RequestBody @Valid CreateEdgeCaseRequest createEdgeCaseRequest,
4040
Errors errors) {
4141
if (errors.hasErrors())
4242
throw new RequestException("올바르지 않은 요청입니다.", errors);
4343

44-
edgeCaseService.createEdgeCase(user, creatEdgeCaseRequest);
44+
edgeCaseService.createEdgeCase(user, createEdgeCaseRequest);
4545

4646
return ResponseEntity.ok().build();
4747
}
4848

4949
@GetMapping("/list")
5050
@Operation(summary = "반례리스트 조회")
51-
public ResponseEntity<GetEdgeCaseListResponse> getEdgeCaseList(@AuthedUser User user, @RequestParam(required = false) Integer problemNumber) {
52-
GetEdgeCaseListResponse response = edgeCaseService.getEdgeCaseList(problemNumber);
51+
public ResponseEntity<GetEdgeCaseListResponse> getEdgeCaseList(
52+
@RequestParam(required = false) Integer problemNumber,
53+
@RequestParam(required = false, defaultValue = "RECENT") EdgeCaseSortType sort
54+
) {
55+
GetEdgeCaseListResponse response = edgeCaseService.getEdgeCaseList(problemNumber, sort);
5356

5457
return ResponseEntity.ok().body(response);
5558
}

src/main/java/com/gamzabat/algohub/feature/edgecase/domain/EdgeCase.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.gamzabat.algohub.feature.edgecase.domain;
22

33
import java.time.LocalDateTime;
4-
import java.util.ArrayList;
5-
import java.util.List;
64

75
import org.hibernate.annotations.SQLDelete;
86

@@ -16,8 +14,6 @@
1614
import jakarta.persistence.Id;
1715
import jakarta.persistence.JoinColumn;
1816
import jakarta.persistence.ManyToOne;
19-
import jakarta.persistence.OneToMany;
20-
import jakarta.persistence.OneToOne;
2117
import lombok.Builder;
2218
import lombok.Getter;
2319
import lombok.NoArgsConstructor;
@@ -40,7 +36,6 @@ public class EdgeCase {
4036
@Column(columnDefinition = "TEXT")
4137
private String output;
4238

43-
4439
@ManyToOne(fetch = FetchType.LAZY)
4540
@JoinColumn(name = "user_id")
4641
private User author;
@@ -52,14 +47,25 @@ public class EdgeCase {
5247
private int likeCount = 0;
5348

5449
@Builder
55-
public EdgeCase(Integer level, String link, Integer problemNumber, String title, String input, String output, User author) {
50+
public EdgeCase(Integer level, String link, Integer problemNumber, String title, String input, String output,
51+
User author) {
5652
this.level = level;
5753
this.link = link;
5854
this.problemNumber = problemNumber;
5955
this.title = title;
6056
this.input = input;
6157
this.output = output;
6258
this.author = author;
59+
this.createdAt = LocalDateTime.now();
60+
}
61+
62+
public void increaseLikeCount() {
63+
this.likeCount++;
6364
}
6465

66+
public void decreaseLikeCount() {
67+
if (this.likeCount > 0) {
68+
this.likeCount--;
69+
}
70+
}
6571
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.gamzabat.algohub.feature.edgecase.domain;
2+
3+
public enum EdgeCaseSortType {
4+
RECENT, // 최신순 (기본값)
5+
LIKE, // 좋아요순
6+
OLD // 오래된순
7+
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.gamzabat.algohub.feature.edgecase.repository;
22

3+
import java.util.List;
34
import java.util.Optional;
45

56
import org.springframework.data.jpa.repository.JpaRepository;
@@ -10,4 +11,5 @@
1011

1112
public interface EdgeCaseLikeRepository extends JpaRepository<EdgeCaseLike, Long> {
1213
Optional<EdgeCaseLike> findByEdgeCaseAndUser(EdgeCase edgeCase, User user);
14+
List<EdgeCaseLike> findAllByEdgeCase(EdgeCase edgeCase);
1315
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,18 @@
77
import com.gamzabat.algohub.feature.edgecase.domain.EdgeCase;
88

99
public interface EdgeCaseRepository extends JpaRepository<EdgeCase, Long> {
10+
// RECENT
1011
List<EdgeCase> findAllByProblemNumberOrderByCreatedAtDesc(Integer problemNumber);
12+
1113
List<EdgeCase> findAllByOrderByCreatedAtDesc();
14+
15+
// LIKE
16+
List<EdgeCase> findAllByProblemNumberOrderByLikeCountDesc(Integer problemNumber);
17+
18+
List<EdgeCase> findAllByOrderByLikeCountDesc();
19+
20+
// OLD
21+
List<EdgeCase> findAllByProblemNumberOrderByCreatedAtAsc(Integer problemNumber);
22+
23+
List<EdgeCase> findAllByOrderByCreatedAtAsc();
1224
}

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

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.fasterxml.jackson.databind.JsonNode;
1313
import com.gamzabat.algohub.feature.edgecase.domain.EdgeCase;
1414
import com.gamzabat.algohub.feature.edgecase.domain.EdgeCaseLike;
15+
import com.gamzabat.algohub.feature.edgecase.domain.EdgeCaseSortType;
1516
import com.gamzabat.algohub.feature.edgecase.dto.CreateEdgeCaseRequest;
1617
import com.gamzabat.algohub.feature.edgecase.dto.GetEdgeCaseListResponse;
1718
import com.gamzabat.algohub.feature.edgecase.dto.GetEdgeCaseResponse;
@@ -44,7 +45,7 @@ public void createEdgeCase(User user, CreateEdgeCaseRequest request) {
4445
int level = problemService.getProblemLevel(apiResult);
4546
String title = problemService.getProblemTitle(apiResult);
4647

47-
saveEdgeCase(author,request,level,title,Integer.parseInt(number));
48+
saveEdgeCase(author, request, level, title, Integer.parseInt(number));
4849
}
4950

5051
private void saveEdgeCase(User author, CreateEdgeCaseRequest request, int level, String title, int number) {
@@ -54,12 +55,35 @@ private void saveEdgeCase(User author, CreateEdgeCaseRequest request, int level,
5455
edgeCaseRepository.save(edgeCase);
5556
}
5657

57-
public GetEdgeCaseListResponse getEdgeCaseList(Integer problemNumber) {
58+
public GetEdgeCaseListResponse getEdgeCaseList(Integer problemNumber, EdgeCaseSortType sort) {
5859
List<EdgeCase> edgeCaseList;
59-
if (problemNumber == null)
60-
edgeCaseList = edgeCaseRepository.findAllByOrderByCreatedAtDesc();
61-
else
62-
edgeCaseList = edgeCaseRepository.findAllByProblemNumberOrderByCreatedAtDesc(problemNumber);
60+
if (problemNumber == null) {
61+
switch (sort) {
62+
case LIKE:
63+
edgeCaseList = edgeCaseRepository.findAllByOrderByLikeCountDesc();
64+
break;
65+
case OLD:
66+
edgeCaseList = edgeCaseRepository.findAllByOrderByCreatedAtAsc();
67+
break;
68+
case RECENT:
69+
default:
70+
edgeCaseList = edgeCaseRepository.findAllByOrderByCreatedAtDesc();
71+
break;
72+
}
73+
} else {
74+
switch (sort) {
75+
case LIKE:
76+
edgeCaseList = edgeCaseRepository.findAllByProblemNumberOrderByLikeCountDesc(problemNumber);
77+
break;
78+
case OLD:
79+
edgeCaseList = edgeCaseRepository.findAllByProblemNumberOrderByCreatedAtAsc(problemNumber);
80+
break;
81+
case RECENT:
82+
default:
83+
edgeCaseList = edgeCaseRepository.findAllByProblemNumberOrderByCreatedAtDesc(problemNumber);
84+
break;
85+
}
86+
}
6387

6488
List<GetEdgeCaseResponse> responseList = edgeCaseList.stream()
6589
.map(edgeCase -> new GetEdgeCaseResponse(
@@ -85,7 +109,8 @@ public void deleteEdgeCase(User user, Long edgeCaseId) {
85109

86110
if (!user.getId().equals(author.getId()))
87111
throw new NotAuthorizedUserException("반례를 삭제할 권한이 없습니다.", HttpStatus.FORBIDDEN);
88-
112+
List<EdgeCaseLike> likes = edgeCaseLikeRepository.findAllByEdgeCase(edgeCase);
113+
edgeCaseLikeRepository.deleteAll(likes);
89114
edgeCaseRepository.delete(edgeCase);
90115
}
91116

@@ -94,21 +119,21 @@ public TogleEdgeCaseResponse togleEdgeCaseLike(User user, Long edgeCaseId) {
94119
EdgeCase edgeCase = edgeCaseRepository.findById(edgeCaseId)
95120
.orElseThrow(() -> new CannotFoundEdgeCaseException("존재하지 않는 반례입니다.", HttpStatus.NOT_FOUND));
96121

97-
EdgeCaseLike edgeCaseLike = edgeCaseLikeRepository.findByEdgeCaseAndUser(edgeCase,user).orElse(null);
122+
EdgeCaseLike edgeCaseLike = edgeCaseLikeRepository.findByEdgeCaseAndUser(edgeCase, user).orElse(null);
98123
Boolean isLike = false;
99124
if (edgeCaseLike == null) {
100125
edgeCaseLike = EdgeCaseLike.builder().user(user).edgeCase(edgeCase).build();
101126
edgeCaseLikeRepository.save(edgeCaseLike);
102-
127+
edgeCase.increaseLikeCount();
103128
isLike = true;
104129
} else {
105130
edgeCaseLikeRepository.delete(edgeCaseLike);
131+
edgeCase.decreaseLikeCount();
106132
}
107133

108134
return new TogleEdgeCaseResponse(isLike);
109135
}
110136

111-
112137
private String getProblemId(String url) {
113138
String[] parts = url.split("/");
114139
if (parts.length < 3 || !parts[2].equals(BOJ_URL))

0 commit comments

Comments
 (0)