diff --git a/src/main/java/com/mangkyu/employment/interview/app/category/controller/GetQuizCategoryController.java b/src/main/java/com/mangkyu/employment/interview/app/category/controller/GetQuizCategoryController.java new file mode 100644 index 0000000..55bf4ae --- /dev/null +++ b/src/main/java/com/mangkyu/employment/interview/app/category/controller/GetQuizCategoryController.java @@ -0,0 +1,39 @@ +package com.mangkyu.employment.interview.app.category.controller; + +import com.mangkyu.employment.interview.app.category.service.GetQuizCategoryService; +import com.mangkyu.employment.interview.enums.common.EnumMapperValue; +import com.mangkyu.employment.interview.enums.value.QuizCategory; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@RestController +@RequiredArgsConstructor +class GetQuizCategoryController { + + private final GetQuizCategoryService quizService; + + @GetMapping("/quizzes/categories") + public ResponseEntity>> getQuizCategoryList() { + List categoryList = quizService.getQuizCategoryList() + .stream() + .map(this::convertToQuizCategoryResponse) + .collect(Collectors.toList()); + return ResponseEntity.ok(Map.of("categoryList", categoryList)); + } + + private QuizCategoryResponse convertToQuizCategoryResponse(final EnumMapperValue enumMapperValue) { + return QuizCategoryResponse.builder() + .count(quizService.getCount(QuizCategory.valueOf(enumMapperValue.name()))) + .code(enumMapperValue.getCode()) + .title(enumMapperValue.getTitle()) + .desc(enumMapperValue.getDesc()) + .build(); + } + +} \ No newline at end of file diff --git a/src/main/java/com/mangkyu/employment/interview/app/quiz/controller/QuizCategoryResponse.java b/src/main/java/com/mangkyu/employment/interview/app/category/controller/QuizCategoryResponse.java similarity index 81% rename from src/main/java/com/mangkyu/employment/interview/app/quiz/controller/QuizCategoryResponse.java rename to src/main/java/com/mangkyu/employment/interview/app/category/controller/QuizCategoryResponse.java index f14c14d..2fcfc45 100644 --- a/src/main/java/com/mangkyu/employment/interview/app/quiz/controller/QuizCategoryResponse.java +++ b/src/main/java/com/mangkyu/employment/interview/app/category/controller/QuizCategoryResponse.java @@ -1,4 +1,4 @@ -package com.mangkyu.employment.interview.app.quiz.controller; +package com.mangkyu.employment.interview.app.category.controller; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/com/mangkyu/employment/interview/app/category/service/GetQuizCategoryService.java b/src/main/java/com/mangkyu/employment/interview/app/category/service/GetQuizCategoryService.java new file mode 100644 index 0000000..5c916fe --- /dev/null +++ b/src/main/java/com/mangkyu/employment/interview/app/category/service/GetQuizCategoryService.java @@ -0,0 +1,33 @@ +package com.mangkyu.employment.interview.app.category.service; + +import com.mangkyu.employment.interview.app.quiz.repository.QuizRepository; +import com.mangkyu.employment.interview.enums.common.EnumMapperKey; +import com.mangkyu.employment.interview.enums.common.EnumMapperValue; +import com.mangkyu.employment.interview.enums.factory.EnumMapperFactory; +import com.mangkyu.employment.interview.enums.value.QuizCategory; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class GetQuizCategoryService { + + private final EnumMapperFactory enumMapperFactory; + private final QuizRepository quizRepository; + + public List getQuizCategoryList() { + return enumMapperFactory.get(EnumMapperKey.QUIZ_CATEGORY) + .stream() + .filter(EnumMapperValue::isExpose) + .collect(Collectors.toList()); + } + + public long getCount(final QuizCategory category) { + return quizRepository.countByQuizCategoryAndIsEnableTrue(category); + } +} diff --git a/src/main/java/com/mangkyu/employment/interview/app/quiz/controller/GetQuizCategoryController.java b/src/main/java/com/mangkyu/employment/interview/app/quiz/controller/GetQuizCategoryController.java deleted file mode 100644 index b214161..0000000 --- a/src/main/java/com/mangkyu/employment/interview/app/quiz/controller/GetQuizCategoryController.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.mangkyu.employment.interview.app.quiz.controller; - -import com.mangkyu.employment.interview.app.quiz.service.GetQuizService; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; -import java.util.Map; - -@RestController -@RequiredArgsConstructor -class GetQuizCategoryController { - - private final GetQuizService quizService; - - @GetMapping("/quizzes/categories") - public ResponseEntity>> getQuizCategoryList() { - return ResponseEntity.ok(Map.of("categoryList", quizService.getQuizCategoryList())); - } - -} \ No newline at end of file diff --git a/src/main/java/com/mangkyu/employment/interview/app/quiz/service/GetQuizService.java b/src/main/java/com/mangkyu/employment/interview/app/quiz/service/GetQuizService.java index 9dcb406..a0b4516 100644 --- a/src/main/java/com/mangkyu/employment/interview/app/quiz/service/GetQuizService.java +++ b/src/main/java/com/mangkyu/employment/interview/app/quiz/service/GetQuizService.java @@ -7,7 +7,6 @@ import com.mangkyu.employment.interview.app.quiz.entity.Quizzes; import com.mangkyu.employment.interview.app.quiz.repository.QuizRepository; import com.mangkyu.employment.interview.app.solvedquiz.repository.SolvedQuizRepository; import com.mangkyu.employment.interview.enums.common.EnumMapperKey; -import com.mangkyu.employment.interview.enums.common.EnumMapperValue; import com.mangkyu.employment.interview.enums.factory.EnumMapperFactory; import com.mangkyu.employment.interview.enums.value.QuizCategory; import com.mangkyu.employment.interview.enums.value.QuizLevel; @@ -39,6 +38,17 @@ public class GetQuizService { .orElseThrow(() -> new RestApiException(CommonErrorCode.RESOURCE_NOT_FOUND)); } + public Quizzes getUnsolvedQuizList(final Long userId, final QuizLevel quizLevel, final Set quizCategorySet) { + final Set solvedQuizIdList = solvedQuizRepository.findAllByMember_Id(userId) + .stream() + .map(v -> v.getQuiz().getId()) + .collect(Collectors.toSet()); + + return new Quizzes(quizRepository.customFindByIdNotInAndQuizCategoryInAndQuizLevel(solvedQuizIdList, quizCategorySet, quizLevel)); + } + + // TODO: do not use GetQuizResponseHolder in service layer + public GetQuizResponseHolder getQuizList(final GetQuizRequest getQuizRequest) { final PageRequest pageRequest = PageRequest.of(getQuizRequest.getPage(), getQuizRequest.getSize()); final Page quizPage = quizRepository.findByQuizCategoryIsAndIsEnableTrue(getQuizRequest.getCategory(), pageRequest); @@ -57,31 +67,6 @@ public class GetQuizService { .build(); } - public Quizzes getUnsolvedQuizList(final Long userId, final QuizLevel quizLevel, final Set quizCategorySet) { - final Set solvedQuizIdList = solvedQuizRepository.findAllByMember_Id(userId) - .stream() - .map(v -> v.getQuiz().getId()) - .collect(Collectors.toSet()); - - return new Quizzes(quizRepository.customFindByIdNotInAndQuizCategoryInAndQuizLevel(solvedQuizIdList, quizCategorySet, quizLevel)); - } - - public List getQuizCategoryList() { - final List enumMapperValueList = enumMapperFactory.get(EnumMapperKey.QUIZ_CATEGORY).stream().filter(EnumMapperValue::isExpose).collect(Collectors.toList()); - return enumMapperValueList.stream() - .map(this::convertToQuizCategoryResponse) - .collect(Collectors.toList()); - } - - private QuizCategoryResponse convertToQuizCategoryResponse(final EnumMapperValue enumMapperValue) { - return QuizCategoryResponse.builder() - .count(quizRepository.countByQuizCategoryAndIsEnableTrue(QuizCategory.valueOf(enumMapperValue.name()))) - .code(enumMapperValue.getCode()) - .title(enumMapperValue.getTitle()) - .desc(enumMapperValue.getDesc()) - .build(); - } - public GetQuizResponseHolder searchQuizList(final SearchQuizListRequest searchRequest) { final QuizSearchCondition condition = modelMapper.map(searchRequest, QuizSearchCondition.class); final PageRequest pageRequest = PageRequest.of(searchRequest.getPage(), searchRequest.getSize()); diff --git a/src/test/java/com/mangkyu/employment/interview/app/quiz/controller/GetQuizCategoryControllerTest.java b/src/test/java/com/mangkyu/employment/interview/app/category/controller/GetQuizCategoryControllerTest.java similarity index 74% rename from src/test/java/com/mangkyu/employment/interview/app/quiz/controller/GetQuizCategoryControllerTest.java rename to src/test/java/com/mangkyu/employment/interview/app/category/controller/GetQuizCategoryControllerTest.java index d50980a..d24125c 100644 --- a/src/test/java/com/mangkyu/employment/interview/app/quiz/controller/GetQuizCategoryControllerTest.java +++ b/src/test/java/com/mangkyu/employment/interview/app/category/controller/GetQuizCategoryControllerTest.java @@ -1,6 +1,7 @@ -package com.mangkyu.employment.interview.app.quiz.controller; +package com.mangkyu.employment.interview.app.category.controller; -import com.mangkyu.employment.interview.app.quiz.service.GetQuizService; +import com.mangkyu.employment.interview.app.category.service.GetQuizCategoryService; +import com.mangkyu.employment.interview.enums.common.EnumMapperValue; import com.mangkyu.employment.interview.enums.value.QuizCategory; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -21,19 +22,19 @@ class GetQuizCategoryControllerTest { private MockMvc mockMvc; @Autowired - private GetQuizService quizService; + private GetQuizCategoryService quizService; @Test void getCategory() throws Exception { // given - final QuizCategoryResponse quizCategoryResponse = QuizCategoryResponse.builder() - .count(15L) + final EnumMapperValue enumMapperValue = EnumMapperValue.builder() .code(QuizCategory.JAVA.name()) .title(QuizCategory.JAVA.getTitle()) .desc(QuizCategory.JAVA.getDesc()) + .expose(false) .build(); - doReturn(List.of(quizCategoryResponse)) + doReturn(List.of(enumMapperValue)) .when(quizService) .getQuizCategoryList(); diff --git a/src/test/java/com/mangkyu/employment/interview/app/category/service/GetQuizCategoryServiceTest.java b/src/test/java/com/mangkyu/employment/interview/app/category/service/GetQuizCategoryServiceTest.java new file mode 100644 index 0000000..2207f2c --- /dev/null +++ b/src/test/java/com/mangkyu/employment/interview/app/category/service/GetQuizCategoryServiceTest.java @@ -0,0 +1,68 @@ +package com.mangkyu.employment.interview.app.category.service; + +import com.mangkyu.employment.interview.app.quiz.repository.QuizRepository; +import com.mangkyu.employment.interview.enums.common.EnumMapperKey; +import com.mangkyu.employment.interview.enums.common.EnumMapperValue; +import com.mangkyu.employment.interview.enums.factory.EnumMapperFactory; +import com.mangkyu.employment.interview.enums.value.QuizCategory; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.doReturn; + +@ExtendWith(MockitoExtension.class) +class GetQuizCategoryServiceTest { + + @InjectMocks + private GetQuizCategoryService quizService; + + @Mock + private QuizRepository quizRepository; + @Mock + private EnumMapperFactory enumMapperFactory; + + @Test + void getCategoryList() { + // given + final EnumMapperValue enumMapperValue1 = EnumMapperValue.builder() + .expose(true) + .build(); + + final EnumMapperValue enumMapperValue2 = EnumMapperValue.builder() + .expose(false) + .build(); + + doReturn(List.of(enumMapperValue1, enumMapperValue2)) + .when(enumMapperFactory) + .get(EnumMapperKey.QUIZ_CATEGORY); + + // when + final List result = quizService.getQuizCategoryList(); + + // then + assertThat(result.size()).isEqualTo(1); + } + + @Test + void getCount() { + // given + final long count = 15; + final QuizCategory category = QuizCategory.JAVA; + + doReturn(count) + .when(quizRepository) + .countByQuizCategoryAndIsEnableTrue(category); + + // when + long result = quizService.getCount(category); + + // then + assertThat(result).isEqualTo(count); + } +} \ No newline at end of file diff --git a/src/test/java/com/mangkyu/employment/interview/app/quiz/service/GetQuizServiceTest.java b/src/test/java/com/mangkyu/employment/interview/app/quiz/service/GetQuizServiceTest.java index 8fac844..6a2094a 100644 --- a/src/test/java/com/mangkyu/employment/interview/app/quiz/service/GetQuizServiceTest.java +++ b/src/test/java/com/mangkyu/employment/interview/app/quiz/service/GetQuizServiceTest.java @@ -198,33 +198,6 @@ class GetQuizServiceTest { assertThat(result.getQuizList().size()).isEqualTo(unsolvedQuizList.size()); } - @Test - public void getQuizCategoryResponseList() { - // given - final long count = 15; - final QuizCategory quizCategory = QuizCategory.JAVA; - - final EnumMapperValue enumMapperValue = EnumMapperValue.builder() - .code(quizCategory.name()) - .title(quizCategory.getTitle()) - .desc(quizCategory.getDesc()) - .expose(true) - .build(); - - doReturn(Collections.singletonList(enumMapperValue)) - .when(enumMapperFactory) - .get(EnumMapperKey.QUIZ_CATEGORY); - doReturn(count) - .when(quizRepository) - .countByQuizCategoryAndIsEnableTrue(quizCategory); - - // when - final List result = quizService.getQuizCategoryList(); - - // then - assertThat(result.size()).isEqualTo(1); - assertThat(result.get(0).getCount()).isEqualTo(count); - } private List quizList() { final List unsolvedQuizList = new ArrayList<>();