Divide QuizCategory domain

This commit is contained in:
MangKyu
2023-02-18 21:34:07 +09:00
parent 52591b947a
commit cffac499b7
8 changed files with 159 additions and 83 deletions

View File

@@ -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();
}
}

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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()));
}
}

View File

@@ -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<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) {
final PageRequest pageRequest = PageRequest.of(getQuizRequest.getPage(), getQuizRequest.getSize());
final Page<Quiz> 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<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) {
final QuizSearchCondition condition = modelMapper.map(searchRequest, QuizSearchCondition.class);
final PageRequest pageRequest = PageRequest.of(searchRequest.getPage(), searchRequest.getSize());

View File

@@ -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();

View File

@@ -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);
}
}

View File

@@ -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<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() {
final List<com.mangkyu.employment.interview.app.quiz.entity.Quiz> unsolvedQuizList = new ArrayList<>();