Skip to content

Commit 839667e

Browse files
committed
Merge remote-tracking branch 'origin/develop' into fix/#36
2 parents b929a23 + 7189a70 commit 839667e

23 files changed

+618
-25
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ build/
55
!**/src/main/**/build/
66
!**/src/test/**/build/
77
.env
8+
local.env
89

910
### STS ###
1011
.apt_generated

src/main/java/com/moplus/moplus_server/domain/concept/repository/ConceptTagRepository.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,13 @@ default void existsByIdElseThrow(Set<Long> ids) {
1818
throw new NotFoundException(ErrorCode.CONCEPT_TAG_NOT_FOUND_IN_LIST);
1919
}
2020
}
21+
22+
23+
default List<ConceptTag> findAllByIdsElseThrow(Set<Long> ids) {
24+
List<ConceptTag> conceptTags = findAllById(ids);
25+
if (conceptTags.size() != ids.size()) {
26+
throw new NotFoundException(ErrorCode.CONCEPT_TAG_NOT_FOUND_IN_LIST);
27+
}
28+
return conceptTags;
29+
}
2130
}

src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44
import com.moplus.moplus_server.domain.problemset.dto.request.ProblemReorderRequest;
55
import com.moplus.moplus_server.domain.problemset.dto.request.ProblemSetPostRequest;
66
import com.moplus.moplus_server.domain.problemset.dto.request.ProblemSetUpdateRequest;
7+
import com.moplus.moplus_server.domain.problemset.dto.response.ProblemSetGetResponse;
78
import com.moplus.moplus_server.domain.problemset.service.ProblemSetDeleteService;
9+
import com.moplus.moplus_server.domain.problemset.service.ProblemSetGetService;
810
import com.moplus.moplus_server.domain.problemset.service.ProblemSetSaveService;
911
import com.moplus.moplus_server.domain.problemset.service.ProblemSetUpdateService;
12+
import io.swagger.v3.oas.annotations.Hidden;
1013
import io.swagger.v3.oas.annotations.Operation;
1114
import lombok.RequiredArgsConstructor;
1215
import org.springframework.http.ResponseEntity;
1316
import org.springframework.web.bind.annotation.DeleteMapping;
17+
import org.springframework.web.bind.annotation.GetMapping;
1418
import org.springframework.web.bind.annotation.PathVariable;
1519
import org.springframework.web.bind.annotation.PostMapping;
1620
import org.springframework.web.bind.annotation.PutMapping;
@@ -26,6 +30,7 @@ public class ProblemSetController {
2630
private final ProblemSetSaveService problemSetSaveService;
2731
private final ProblemSetUpdateService problemSetUpdateService;
2832
private final ProblemSetDeleteService problemSetDeleteService;
33+
private final ProblemSetGetService problemSetGetService;
2934

3035
@PostMapping("")
3136
@Operation(summary = "문항세트 생성", description = "문항세트를 생성합니다. 문항은 요청 순서대로 저장합니다.")
@@ -35,6 +40,7 @@ public ResponseEntity<Long> createProblemSet(
3540
return ResponseEntity.ok(problemSetSaveService.createProblemSet(request));
3641
}
3742

43+
@Hidden
3844
@PutMapping("/{problemSetId}/sequence")
3945
@Operation(summary = "세트 문항순서 변경", description = "문항세트 내의 문항 리스트의 순서를 변경합니다.")
4046
public ResponseEntity<Void> reorderProblems(
@@ -65,7 +71,17 @@ public ResponseEntity<Void> deleteProblemSet(
6571

6672
@PutMapping("/{problemSetId}/confirm")
6773
@Operation(summary = "문항세트 컨펌 토글", description = "문항세트의 컨펌 상태를 토글합니다.")
68-
public ResponseEntity<ProblemSetConfirmStatus> toggleConfirmProblemSet(@PathVariable Long problemSetId) {
74+
public ResponseEntity<ProblemSetConfirmStatus> toggleConfirmProblemSet(
75+
@PathVariable Long problemSetId
76+
) {
6977
return ResponseEntity.ok(problemSetUpdateService.toggleConfirmProblemSet(problemSetId));
7078
}
71-
}
79+
80+
@GetMapping("/{problemSetId}")
81+
@Operation(summary = "문항세트 개별 조회", description = "문항세트를 조회합니다.")
82+
public ResponseEntity<ProblemSetGetResponse> getProblemSet(
83+
@PathVariable Long problemSetId
84+
) {
85+
return ResponseEntity.ok(problemSetGetService.getProblemSet(problemSetId));
86+
}
87+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.moplus.moplus_server.domain.problemset.controller;
2+
3+
4+
import com.moplus.moplus_server.domain.problemset.dto.response.ProblemSetSearchGetResponse;
5+
import com.moplus.moplus_server.domain.problemset.repository.ProblemSetSearchRepositoryCustom;
6+
import io.swagger.v3.oas.annotations.Operation;
7+
import java.util.List;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.http.ResponseEntity;
10+
import org.springframework.web.bind.annotation.GetMapping;
11+
import org.springframework.web.bind.annotation.RequestMapping;
12+
import org.springframework.web.bind.annotation.RequestParam;
13+
import org.springframework.web.bind.annotation.RestController;
14+
15+
@RestController
16+
@RequestMapping("/api/v1/problemSet")
17+
@RequiredArgsConstructor
18+
public class ProblemSetSearchController {
19+
20+
private final ProblemSetSearchRepositoryCustom problemSetSearchRepository;
21+
22+
@GetMapping("/search")
23+
@Operation(
24+
summary = "문항세트 검색",
25+
description = "문항세트 타이틀, 문항세트 내 포함된 개념태그, 문항세트 내 포함된 문항 타이틀로 검색합니다."
26+
)
27+
public ResponseEntity<List<ProblemSetSearchGetResponse>> search(
28+
@RequestParam(value = "problemSetTitle", required = false) String problemSetTitle,
29+
@RequestParam(value = "problemTitle", required = false) String problemTitle,
30+
@RequestParam(value = "conceptTagNames", required = false) List<String> conceptTagNames
31+
) {
32+
List<ProblemSetSearchGetResponse> problemSets = problemSetSearchRepository.search(problemSetTitle, problemTitle, conceptTagNames);
33+
return ResponseEntity.ok(problemSets);
34+
}
35+
}

src/main/java/com/moplus/moplus_server/domain/problemset/domain/ProblemSet.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import jakarta.persistence.CollectionTable;
99
import jakarta.persistence.Column;
1010
import jakarta.persistence.ElementCollection;
11+
import jakarta.persistence.Embedded;
1112
import jakarta.persistence.Entity;
1213
import jakarta.persistence.EnumType;
1314
import jakarta.persistence.Enumerated;
@@ -33,7 +34,8 @@ public class ProblemSet extends BaseEntity {
3334
@Column(name = "problem_set_id")
3435
Long id;
3536

36-
private String name;
37+
@Embedded
38+
private Title title;
3739
private boolean isDeleted;
3840

3941
@Enumerated(EnumType.STRING)
@@ -46,8 +48,8 @@ public class ProblemSet extends BaseEntity {
4648
private List<ProblemId> problemIds = new ArrayList<>();
4749

4850
@Builder
49-
public ProblemSet(String name, List<ProblemId> problemIds) {
50-
this.name = name;
51+
public ProblemSet(String title, List<ProblemId> problemIds) {
52+
this.title = new Title(title);
5153
this.isDeleted = false;
5254
this.confirmStatus = ProblemSetConfirmStatus.NOT_CONFIRMED;
5355
this.problemIds = problemIds;
@@ -73,8 +75,8 @@ public void toggleConfirm(List<Problem> problems) {
7375
this.confirmStatus = this.confirmStatus.toggle();
7476
}
7577

76-
public void updateProblemSet(String name, List<ProblemId> newProblems) {
77-
this.name = name;
78+
public void updateProblemSet(String title, List<ProblemId> newProblems) {
79+
this.title = new Title(title);
7880
this.problemIds = newProblems;
7981
}
8082
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.moplus.moplus_server.domain.problemset.domain;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.Embeddable;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
@Getter
9+
@Embeddable
10+
@NoArgsConstructor
11+
public class Title {
12+
13+
private static final String DEFAULT_TITLE = "제목 없음";
14+
15+
@Column(name = "title", nullable = false)
16+
private String value;
17+
18+
public Title(String title) {
19+
this.value = verifyTitle(title);
20+
}
21+
22+
private static String verifyTitle(String title) {
23+
return (title == null || title.trim().isEmpty()) ? DEFAULT_TITLE : title;
24+
}
25+
}

src/main/java/com/moplus/moplus_server/domain/problemset/dto/request/ProblemSetPostRequest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
import java.util.List;
66

77
public record ProblemSetPostRequest(
8-
String problemSetName,
8+
String problemSetTitle,
99
List<String> problems
1010
) {
1111
public ProblemSet toEntity(List<ProblemId> problemIdList) {
1212
return ProblemSet.builder()
13-
.name(this.problemSetName)
13+
.title(this.problemSetTitle)
1414
.problemIds(problemIdList)
1515
.build();
1616
}

src/main/java/com/moplus/moplus_server/domain/problemset/dto/request/ProblemSetUpdateRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import java.util.List;
44

55
public record ProblemSetUpdateRequest(
6-
String problemSetName,
6+
String problemSetTitle,
77
List<String> problems
88
) {
99
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.moplus.moplus_server.domain.problemset.dto.response;
2+
3+
import com.moplus.moplus_server.domain.problemset.domain.ProblemSet;
4+
import com.moplus.moplus_server.domain.problemset.domain.ProblemSetConfirmStatus;
5+
import java.util.List;
6+
import lombok.Builder;
7+
8+
@Builder
9+
public record ProblemSetGetResponse(
10+
Long id,
11+
String title,
12+
ProblemSetConfirmStatus confirmStatus,
13+
List<ProblemSummaryResponse> problemSummaries
14+
) {
15+
public static ProblemSetGetResponse of(ProblemSet problemSet, List<ProblemSummaryResponse> problemSummaries) {
16+
17+
return ProblemSetGetResponse.builder()
18+
.id(problemSet.getId())
19+
.title(problemSet.getTitle().getValue())
20+
.confirmStatus(problemSet.getConfirmStatus())
21+
.problemSummaries(problemSummaries)
22+
.build();
23+
}
24+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.moplus.moplus_server.domain.problemset.dto.response;
2+
3+
import java.util.List;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
7+
@Getter
8+
@NoArgsConstructor
9+
public class ProblemSetSearchGetResponse {
10+
private String problemSetTitle;
11+
private List<ProblemThumbnailResponse> problemThumbnailResponses;
12+
13+
public ProblemSetSearchGetResponse(
14+
String problemSetTitle, List<ProblemThumbnailResponse> problemThumbnailResponses
15+
) {
16+
this.problemSetTitle = problemSetTitle;
17+
this.problemThumbnailResponses = problemThumbnailResponses;
18+
}
19+
}

0 commit comments

Comments
 (0)