Skip to content

Commit 189e2d7

Browse files
committed
hotfix : 문제 카테고리를 db table 로 변경 작업 완료
1 parent 1cacd1e commit 189e2d7

37 files changed

+660
-507
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.ezcode.codetest.application.problem.dto.request;
2+
3+
import org.ezcode.codetest.domain.problem.model.entity.Category;
4+
5+
public record CategoryCreateRequest(
6+
7+
String categoryCode,
8+
9+
String categoryName
10+
11+
) {
12+
public Category toCategory() {
13+
14+
return new Category(categoryCode, categoryName);
15+
}
16+
}

src/main/java/org/ezcode/codetest/application/problem/dto/request/ProblemCreateRequest.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package org.ezcode.codetest.application.problem.dto.request;
22

3-
import java.util.List;
3+
import java.util.Map;
44

55
import org.ezcode.codetest.domain.problem.model.entity.Problem;
6-
import org.ezcode.codetest.domain.problem.model.enums.Category;
76
import org.ezcode.codetest.domain.problem.model.enums.Difficulty;
87
import org.ezcode.codetest.domain.problem.model.enums.Reference;
98
import org.ezcode.codetest.domain.user.model.entity.User;
@@ -14,9 +13,9 @@
1413

1514
public record ProblemCreateRequest(
1615

17-
@NotNull(message = "카테고리를 설정해야 합니다.")
18-
@Schema(description = "카테고리", example = "FOR_BEGINNER")
19-
List<Category> categories,
16+
@NotNull(message = "카테고리 이름를 설정해야 합니다.")
17+
@Schema(description = "카테고리 코드 식별자(영어) / 한글 이름", example = "FOR_BEGINNER : 입문자용")
18+
Map<String, String> categories,
2019

2120
@NotBlank(message = "문제 제목을 입력하세요.")
2221
@Schema(description = "제목", example = "A+B")
@@ -27,7 +26,7 @@ public record ProblemCreateRequest(
2726
String description,
2827

2928
@NotNull(message = "난이도를 설정해야 합니다.")
30-
@Schema(description = "난이도", example = "BRONZE")
29+
@Schema(description = "난이도", example = "LV1")
3130
Difficulty difficulty,
3231

3332
@NotNull(message = "메모리 제한을 설정해야 합니다.")
@@ -45,11 +44,10 @@ public record ProblemCreateRequest(
4544
) {
4645

4746
// Dto -> Entity 변환
48-
public static Problem toEntity(ProblemCreateRequest request, User user) {
47+
public static Problem toProblem(ProblemCreateRequest request, User user) {
4948

5049
return Problem.builder()
5150
.creator(user)
52-
.categories(request.categories)
5351
.title(request.title)
5452
.description(request.description)
5553
.difficulty(request.difficulty)

src/main/java/org/ezcode/codetest/application/problem/dto/request/ProblemUpdateRequest.java

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

55
import org.ezcode.codetest.domain.problem.model.entity.Problem;
6-
import org.ezcode.codetest.domain.problem.model.enums.Category;
76
import org.ezcode.codetest.domain.problem.model.enums.Difficulty;
87
import org.ezcode.codetest.domain.problem.model.enums.Reference;
98
import org.ezcode.codetest.domain.user.model.entity.User;
@@ -13,7 +12,7 @@
1312
public record ProblemUpdateRequest(
1413

1514
@Schema(description = "카테고리", example = "FOR_BEGINNER")
16-
List<Category> categories,
15+
List<String> categories,
1716

1817
@Schema(description = "제목", example = "A+B")
1918
String title,
@@ -39,7 +38,6 @@ public static Problem from(ProblemUpdateRequest request, User user) {
3938

4039
return Problem.builder()
4140
.creator(user)
42-
.categories(request.categories)
4341
.title(request.title)
4442
.description(request.description)
4543
.difficulty(request.difficulty)

src/main/java/org/ezcode/codetest/application/problem/dto/response/ProblemDetailResponse.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import java.time.LocalDateTime;
44
import java.util.List;
55

6+
import org.ezcode.codetest.domain.problem.model.entity.Category;
67
import org.ezcode.codetest.domain.problem.model.entity.Problem;
7-
import org.ezcode.codetest.domain.problem.model.enums.Category;
88
import org.ezcode.codetest.domain.problem.model.enums.Difficulty;
99
import org.ezcode.codetest.domain.problem.model.enums.Reference;
1010

@@ -21,7 +21,7 @@ public record ProblemDetailResponse(
2121
String creator,
2222

2323
@Schema(description = "카테고리", example = "FOR_BEGINNER")
24-
List<Category> categories,
24+
List<String> categories,
2525

2626
@Schema(description = "제목", example = "A+B")
2727
String title,
@@ -52,14 +52,14 @@ public record ProblemDetailResponse(
5252

5353
) {
5454

55-
public static ProblemDetailResponse from(Problem problem) {
55+
public static ProblemDetailResponse from(Problem problem, List<Category> categories) {
5656

5757
return ProblemDetailResponse.builder()
5858
.id(problem.getId())
5959
.creator(problem.getCreator().getNickname())
60-
.categories(problem.getCategories())
6160
.title(problem.getTitle())
6261
.description(problem.getDescription())
62+
.categories(categories.stream().map(Category::getCategoryKorName).toList())
6363
.score(problem.getScore())
6464
.difficulty(problem.getDifficulty())
6565
.memoryLimit(problem.getMemoryLimit())

src/main/java/org/ezcode/codetest/application/problem/dto/response/ProblemResponse.java

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

33
import java.util.List;
44

5+
import org.ezcode.codetest.domain.problem.model.entity.Category;
56
import org.ezcode.codetest.domain.problem.model.entity.Problem;
6-
import org.ezcode.codetest.domain.problem.model.enums.Category;
77
import org.ezcode.codetest.domain.problem.model.enums.Difficulty;
88
import org.ezcode.codetest.domain.problem.model.enums.Reference;
99

@@ -20,7 +20,7 @@ public record ProblemResponse(
2020
String creator,
2121

2222
@Schema(description = "카테고리", example = "FOR_BEGINNER")
23-
List<Category> categories,
23+
List<String> categories,
2424

2525
@Schema(description = "제목", example = "A+B")
2626
String title,
@@ -36,7 +36,7 @@ public record ProblemResponse(
3636

3737
) {
3838

39-
public static ProblemResponse from(Problem problem) {
39+
public static ProblemResponse from(Problem problem, List<Category> categories) {
4040

4141
if (problem == null) {
4242
throw new IllegalArgumentException("문제는 null 값이 아니어야 합니다.");
@@ -45,7 +45,7 @@ public static ProblemResponse from(Problem problem) {
4545
return ProblemResponse.builder()
4646
.id(problem.getId())
4747
.creator(problem.getCreator() != null ? problem.getCreator().getNickname() : "존재하지 않는 이름.")
48-
.categories(problem.getCategories())
48+
.categories(categories.stream().map(Category::getCategoryKorName).toList())
4949
.title(problem.getTitle())
5050
.score(problem.getScore())
5151
.difficulty(problem.getDifficulty())

src/main/java/org/ezcode/codetest/application/problem/dto/response/ProblemSearchResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public static ProblemSearchResponse from(ProblemSearchDocument document) {
2929
return ProblemSearchResponse.builder()
3030
.id(document.getId())
3131
.title(document.getTitle())
32-
.category(document.getCategories().stream().map(Enum::toString).toList())
32+
.category(document.getCategories())
3333
.difficulty(document.getDifficulty())
3434
.reference(document.getReference().toString())
3535
.description(document.getDescription())

src/main/java/org/ezcode/codetest/application/problem/service/ProblemSearchService.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ public Set<String> getProblemSuggestions(String keyword) {
4545
Optional.ofNullable(doc.getCategories())
4646
.stream()
4747
.flatMap(Collection::stream)
48-
.map(Enum::toString)
4948
.forEach(searchedKeyword::add);
5049

5150
Optional.ofNullable(doc.getCategoriesKor())

src/main/java/org/ezcode/codetest/application/problem/service/ProblemService.java

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
package org.ezcode.codetest.application.problem.service;
22

3+
import java.util.List;
4+
import java.util.Map;
5+
import java.util.stream.Collectors;
6+
7+
import org.ezcode.codetest.application.problem.dto.request.CategoryCreateRequest;
38
import org.ezcode.codetest.application.problem.dto.request.ProblemCreateRequest;
49
import org.ezcode.codetest.application.problem.dto.request.ProblemUpdateRequest;
510
import org.ezcode.codetest.application.problem.dto.response.ProblemDetailResponse;
611
import org.ezcode.codetest.application.problem.dto.response.ProblemResponse;
712
import org.ezcode.codetest.domain.problem.model.ProblemSearchCondition;
13+
import org.ezcode.codetest.domain.problem.model.entity.Category;
814
import org.ezcode.codetest.domain.problem.model.entity.Problem;
15+
import org.ezcode.codetest.domain.problem.model.entity.ProblemCategory;
916
import org.ezcode.codetest.domain.problem.service.ProblemDomainService;
1017
import org.ezcode.codetest.domain.user.model.entity.AuthUser;
1118
import org.ezcode.codetest.domain.user.model.entity.User;
@@ -15,6 +22,7 @@
1522
import org.ezcode.codetest.infrastructure.s3.exception.S3Exception;
1623
import org.ezcode.codetest.infrastructure.s3.exception.code.S3ExceptionCode;
1724
import org.springframework.data.domain.Page;
25+
import org.springframework.data.domain.PageImpl;
1826
import org.springframework.data.domain.Pageable;
1927
import org.springframework.stereotype.Service;
2028
import org.springframework.transaction.annotation.Transactional;
@@ -32,30 +40,48 @@ public class ProblemService {
3240
private final UserDomainService userDomainService;
3341
private final S3Uploader s3Uploader;
3442

43+
@Transactional
44+
public void createCategory(CategoryCreateRequest requestDto) {
45+
46+
problemDomainService.createCategory(requestDto.toCategory());
47+
}
48+
3549
// 문제 생성 ( 관리자 )
3650
@Transactional
37-
public ProblemDetailResponse createProblem(ProblemCreateRequest requestDto, MultipartFile image, AuthUser authUser) {
51+
public void createProblem(ProblemCreateRequest requestDto, MultipartFile image, AuthUser authUser) {
3852

3953
User user = userDomainService.getUserById(authUser.getId());
4054

41-
Problem problem = ProblemCreateRequest.toEntity(requestDto, user);
42-
Problem savedProblem = problemDomainService.createProblem(problem);
55+
Problem problem = ProblemCreateRequest.toProblem(requestDto, user);
56+
Problem savedProblem = problemDomainService.createProblem(problem, requestDto.categories());
4357

4458
// 문제 이미지 있다면?
4559
if (image != null && !image.isEmpty()) {
4660
String imageUrl = uploadImageAfterTransaction(image, savedProblem.getId());
4761
updateProblemWithImage(savedProblem.getId(), imageUrl);
4862
}
4963

50-
return ProblemDetailResponse.from(savedProblem);
5164
}
5265

5366
// 문제 전체 조회
5467
@Transactional(readOnly = true)
5568
public Page<ProblemResponse> getProblemsList(Pageable pageable, ProblemSearchCondition searchCondition) {
56-
Page<Problem> problems = problemDomainService.getProblemBySearchCondition(pageable, searchCondition);
5769

58-
return problems.map(ProblemResponse::from); // Entity → DTO 변환
70+
Page<Problem> problemPage = problemDomainService.getProblemBySearchCondition(pageable, searchCondition);
71+
List<Problem> problems = problemPage.getContent();
72+
List<ProblemCategory> categories = problemDomainService.getProblemsCategoryList(problems);
73+
74+
Map<Problem, List<Category>> maps = categories.stream()
75+
.collect(Collectors.groupingBy(
76+
ProblemCategory::getProblem,
77+
Collectors.mapping(ProblemCategory::getCategory, Collectors.toList())
78+
));
79+
80+
List<ProblemResponse> responses = problems.stream()
81+
.map(p -> ProblemResponse.from(p, maps.getOrDefault(p, List.of())))
82+
.collect(Collectors.toList());
83+
84+
return new PageImpl<>(responses, pageable, problemPage.getTotalElements());
5985
}
6086

6187
// 문제 상세 조회
@@ -64,27 +90,28 @@ public ProblemDetailResponse getProblem(Long problemId) {
6490

6591
Problem findProblem = problemDomainService.getProblem(problemId);
6692

67-
return ProblemDetailResponse.from(findProblem);
93+
List<Category> categoryList = problemDomainService.getProblemCategoryList(findProblem);
94+
95+
return ProblemDetailResponse.from(findProblem, categoryList);
6896
}
6997

7098
// 문제 수정 ( 관리자 )
7199
@Transactional
72-
public ProblemDetailResponse modifyProblem(Long problemId, ProblemUpdateRequest request) {
100+
public void modifyProblem(Long problemId, ProblemUpdateRequest request) {
73101

74102
Problem findProblem = problemDomainService.getProblem(problemId);
75103

104+
problemDomainService.updateProblemCategory(findProblem, request.categories());
105+
76106
findProblem.update(
77107
findProblem.getCreator(),
78-
request.categories(),
79108
request.title(),
80109
request.description(),
81110
request.difficulty(),
82111
request.memoryLimit(),
83112
request.timeLimit(),
84113
request.reference()
85114
);
86-
87-
return ProblemDetailResponse.from(findProblem);
88115
}
89116

90117
// 문제 삭제 ( 관리자 )

0 commit comments

Comments
 (0)