Skip to content

Commit a822b60

Browse files
authored
hotfix : 문제 카테고리를 db table 로 변경 작업 완료 (#109)
* test : 장착 도메인 서비스 테스트 코드 추가 * hotfix : 문제 카테고리를 db table 로 변경 작업 완료 # Conflicts: # src/main/java/org/ezcode/codetest/application/submission/service/SubmissionService.java # src/main/java/org/ezcode/codetest/domain/submission/service/SubmissionDomainService.java * hotfix : 문제 카테고리를 db table 로 변경 작업 완료 * hotfix : 문제 카테고리를 db table 로 변경 작업 완료 * hotfix : 오타수정
1 parent 60499a2 commit a822b60

File tree

53 files changed

+1021
-550
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+1021
-550
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::getKorName).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::getKorName).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: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
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;
12+
import org.ezcode.codetest.domain.game.model.character.CategoryStat;
13+
import org.ezcode.codetest.domain.game.util.StatUpdateUtil;
714
import org.ezcode.codetest.domain.problem.model.ProblemSearchCondition;
15+
import org.ezcode.codetest.domain.problem.model.entity.Category;
816
import org.ezcode.codetest.domain.problem.model.entity.Problem;
17+
import org.ezcode.codetest.domain.problem.model.entity.ProblemCategory;
918
import org.ezcode.codetest.domain.problem.service.ProblemDomainService;
1019
import org.ezcode.codetest.domain.user.model.entity.AuthUser;
1120
import org.ezcode.codetest.domain.user.model.entity.User;
@@ -15,6 +24,7 @@
1524
import org.ezcode.codetest.infrastructure.s3.exception.S3Exception;
1625
import org.ezcode.codetest.infrastructure.s3.exception.code.S3ExceptionCode;
1726
import org.springframework.data.domain.Page;
27+
import org.springframework.data.domain.PageImpl;
1828
import org.springframework.data.domain.Pageable;
1929
import org.springframework.stereotype.Service;
2030
import org.springframework.transaction.annotation.Transactional;
@@ -30,32 +40,53 @@ public class ProblemService {
3040

3141
private final ProblemDomainService problemDomainService;
3242
private final UserDomainService userDomainService;
43+
private final StatUpdateUtil statUpdateUtil;
3344
private final S3Uploader s3Uploader;
3445

46+
@Transactional
47+
public void createCategory(CategoryCreateRequest requestDto) {
48+
49+
Category category =problemDomainService.createCategory(requestDto.toCategory());
50+
51+
statUpdateUtil.save(new CategoryStat(category));
52+
}
53+
3554
// 문제 생성 ( 관리자 )
3655
@Transactional
37-
public ProblemDetailResponse createProblem(ProblemCreateRequest requestDto, MultipartFile image, AuthUser authUser) {
56+
public void createProblem(ProblemCreateRequest requestDto, MultipartFile image, AuthUser authUser) {
3857

3958
User user = userDomainService.getUserById(authUser.getId());
4059

41-
Problem problem = ProblemCreateRequest.toEntity(requestDto, user);
42-
Problem savedProblem = problemDomainService.createProblem(problem);
60+
Problem problem = ProblemCreateRequest.toProblem(requestDto, user);
61+
Problem savedProblem = problemDomainService.createProblem(problem, requestDto.categories());
4362

4463
// 문제 이미지 있다면?
4564
if (image != null && !image.isEmpty()) {
4665
String imageUrl = uploadImageAfterTransaction(image, savedProblem.getId());
4766
updateProblemWithImage(savedProblem.getId(), imageUrl);
4867
}
4968

50-
return ProblemDetailResponse.from(savedProblem);
5169
}
5270

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

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

6192
// 문제 상세 조회
@@ -64,18 +95,19 @@ public ProblemDetailResponse getProblem(Long problemId) {
6495

6596
Problem findProblem = problemDomainService.getProblem(problemId);
6697

67-
return ProblemDetailResponse.from(findProblem);
98+
List<Category> categoryList = problemDomainService.getProblemCategoryList(findProblem);
99+
100+
return ProblemDetailResponse.from(findProblem, categoryList);
68101
}
69102

70103
// 문제 수정 ( 관리자 )
71104
@Transactional
72-
public ProblemDetailResponse modifyProblem(Long problemId, ProblemUpdateRequest request) {
105+
public void modifyProblem(Long problemId, ProblemUpdateRequest request) {
73106

74107
Problem findProblem = problemDomainService.getProblem(problemId);
75108

76109
findProblem.update(
77110
findProblem.getCreator(),
78-
request.categories(),
79111
request.title(),
80112
request.description(),
81113
request.difficulty(),
@@ -84,7 +116,8 @@ public ProblemDetailResponse modifyProblem(Long problemId, ProblemUpdateRequest
84116
request.reference()
85117
);
86118

87-
return ProblemDetailResponse.from(findProblem);
119+
problemDomainService.updateCategoryAndSearchEngine(findProblem, request.categories());
120+
88121
}
89122

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

0 commit comments

Comments
 (0)