Divide QuizCategory domain
This commit is contained in:
@@ -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<Map<String, List<QuizCategoryResponse>>> getQuizCategoryList() {
|
||||||
|
List<QuizCategoryResponse> 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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.Builder;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@@ -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<EnumMapperValue> getQuizCategoryList() {
|
||||||
|
return enumMapperFactory.get(EnumMapperKey.QUIZ_CATEGORY)
|
||||||
|
.stream()
|
||||||
|
.filter(EnumMapperValue::isExpose)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getCount(final QuizCategory category) {
|
||||||
|
return quizRepository.countByQuizCategoryAndIsEnableTrue(category);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<Map<String, List<QuizCategoryResponse>>> getQuizCategoryList() {
|
|
||||||
return ResponseEntity.ok(Map.of("categoryList", quizService.getQuizCategoryList()));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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.quiz.repository.QuizRepository;
|
||||||
import com.mangkyu.employment.interview.app.solvedquiz.repository.SolvedQuizRepository;
|
import com.mangkyu.employment.interview.app.solvedquiz.repository.SolvedQuizRepository;
|
||||||
import com.mangkyu.employment.interview.enums.common.EnumMapperKey;
|
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.factory.EnumMapperFactory;
|
||||||
import com.mangkyu.employment.interview.enums.value.QuizCategory;
|
import com.mangkyu.employment.interview.enums.value.QuizCategory;
|
||||||
import com.mangkyu.employment.interview.enums.value.QuizLevel;
|
import com.mangkyu.employment.interview.enums.value.QuizLevel;
|
||||||
@@ -39,6 +38,17 @@ public class GetQuizService {
|
|||||||
.orElseThrow(() -> new RestApiException(CommonErrorCode.RESOURCE_NOT_FOUND));
|
.orElseThrow(() -> new RestApiException(CommonErrorCode.RESOURCE_NOT_FOUND));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Quizzes getUnsolvedQuizList(final Long userId, final QuizLevel quizLevel, final Set<QuizCategory> quizCategorySet) {
|
||||||
|
final Set<Long> 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) {
|
public GetQuizResponseHolder getQuizList(final GetQuizRequest getQuizRequest) {
|
||||||
final PageRequest pageRequest = PageRequest.of(getQuizRequest.getPage(), getQuizRequest.getSize());
|
final PageRequest pageRequest = PageRequest.of(getQuizRequest.getPage(), getQuizRequest.getSize());
|
||||||
final Page<Quiz> quizPage = quizRepository.findByQuizCategoryIsAndIsEnableTrue(getQuizRequest.getCategory(), pageRequest);
|
final Page<Quiz> quizPage = quizRepository.findByQuizCategoryIsAndIsEnableTrue(getQuizRequest.getCategory(), pageRequest);
|
||||||
@@ -57,31 +67,6 @@ public class GetQuizService {
|
|||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Quizzes getUnsolvedQuizList(final Long userId, final QuizLevel quizLevel, final Set<QuizCategory> quizCategorySet) {
|
|
||||||
final Set<Long> solvedQuizIdList = solvedQuizRepository.findAllByMember_Id(userId)
|
|
||||||
.stream()
|
|
||||||
.map(v -> v.getQuiz().getId())
|
|
||||||
.collect(Collectors.toSet());
|
|
||||||
|
|
||||||
return new Quizzes(quizRepository.customFindByIdNotInAndQuizCategoryInAndQuizLevel(solvedQuizIdList, quizCategorySet, quizLevel));
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<QuizCategoryResponse> getQuizCategoryList() {
|
|
||||||
final List<EnumMapperValue> 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) {
|
public GetQuizResponseHolder searchQuizList(final SearchQuizListRequest searchRequest) {
|
||||||
final QuizSearchCondition condition = modelMapper.map(searchRequest, QuizSearchCondition.class);
|
final QuizSearchCondition condition = modelMapper.map(searchRequest, QuizSearchCondition.class);
|
||||||
final PageRequest pageRequest = PageRequest.of(searchRequest.getPage(), searchRequest.getSize());
|
final PageRequest pageRequest = PageRequest.of(searchRequest.getPage(), searchRequest.getSize());
|
||||||
|
|||||||
@@ -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 com.mangkyu.employment.interview.enums.value.QuizCategory;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@@ -21,19 +22,19 @@ class GetQuizCategoryControllerTest {
|
|||||||
private MockMvc mockMvc;
|
private MockMvc mockMvc;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private GetQuizService quizService;
|
private GetQuizCategoryService quizService;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void getCategory() throws Exception {
|
void getCategory() throws Exception {
|
||||||
// given
|
// given
|
||||||
final QuizCategoryResponse quizCategoryResponse = QuizCategoryResponse.builder()
|
final EnumMapperValue enumMapperValue = EnumMapperValue.builder()
|
||||||
.count(15L)
|
|
||||||
.code(QuizCategory.JAVA.name())
|
.code(QuizCategory.JAVA.name())
|
||||||
.title(QuizCategory.JAVA.getTitle())
|
.title(QuizCategory.JAVA.getTitle())
|
||||||
.desc(QuizCategory.JAVA.getDesc())
|
.desc(QuizCategory.JAVA.getDesc())
|
||||||
|
.expose(false)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
doReturn(List.of(quizCategoryResponse))
|
doReturn(List.of(enumMapperValue))
|
||||||
.when(quizService)
|
.when(quizService)
|
||||||
.getQuizCategoryList();
|
.getQuizCategoryList();
|
||||||
|
|
||||||
@@ -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<EnumMapperValue> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -198,33 +198,6 @@ class GetQuizServiceTest {
|
|||||||
assertThat(result.getQuizList().size()).isEqualTo(unsolvedQuizList.size());
|
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<QuizCategoryResponse> result = quizService.getQuizCategoryList();
|
|
||||||
|
|
||||||
// then
|
|
||||||
assertThat(result.size()).isEqualTo(1);
|
|
||||||
assertThat(result.get(0).getCount()).isEqualTo(count);
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<com.mangkyu.employment.interview.app.quiz.entity.Quiz> quizList() {
|
private List<com.mangkyu.employment.interview.app.quiz.entity.Quiz> quizList() {
|
||||||
final List<com.mangkyu.employment.interview.app.quiz.entity.Quiz> unsolvedQuizList = new ArrayList<>();
|
final List<com.mangkyu.employment.interview.app.quiz.entity.Quiz> unsolvedQuizList = new ArrayList<>();
|
||||||
|
|||||||
Reference in New Issue
Block a user