Skip to content

Commit

Permalink
[BE] 스키마 변경에 따른 무중단 배포를 진행한다. (#858)
Browse files Browse the repository at this point in the history
  • Loading branch information
JINU-CHANG authored Oct 22, 2024
1 parent a222313 commit 662888a
Show file tree
Hide file tree
Showing 16 changed files with 104 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -156,9 +156,9 @@ private List<SelectedCategoryQuestionsResponse> readChecklistQuestions(Checklist

private SelectedCategoryQuestionsResponse categorizeChecklistQuestions(CategoryEntity category,
List<ChecklistQuestion> checklistQuestions) {
List<SelectedQuestionResponse> selectedQuestionResponse = Question.filter(category, checklistQuestions)
List<SelectedQuestionResponse> selectedQuestionResponse = checklistQuestionService.categorizeChecklistQuestions(category, checklistQuestions)
.stream()
.map(SelectedQuestionResponse::new)
.map(checklistQuestion -> new SelectedQuestionResponse(checklistQuestion, questionService.readHighlights(checklistQuestion.getQuestionId())))
.toList();

return SelectedCategoryQuestionsResponse.of(category, selectedQuestionResponse);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,20 +50,20 @@ public void change(ChecklistQuestion checklistQuestion) {
this.answer = checklistQuestion.answer;
}

public boolean isDifferentQuestionId(ChecklistQuestion checklistQuestion) {
return this.question != checklistQuestion.question;
public boolean isDifferentQuestionId(ChecklistQuestion checklistQuestion) { // TODO 리팩토링
return !getQuestionId().equals(checklistQuestion.getQuestionId());
}

public Long getChecklistId() {
return checklist.getId();
}

public Integer getQuestionId() {
return question.getId();
return questionEntity.getId();
}

public boolean isCategory(CategoryEntity category) {
return question.isCategory(category);
return questionEntity.getCategory().equals(category);
}

@Override
Expand All @@ -88,7 +88,7 @@ public String toString() {
return "ChecklistQuestion{" +
"id=" + id +
", checklist=" + checklist +
", question=" + question +
", questionEntity=" + questionEntity +
", answer=" + answer +
'}';
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,10 @@ public CustomChecklistQuestion(User user, Question question, QuestionEntity ques
}

public Integer getQuestionId() {
return question.getId();
return questionEntity.getId();
}

public Category getCategory() {
return question.getCategory();
public boolean isSameCategory(CategoryEntity category) {
return this.questionEntity.getCategory().equals(category);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -72,18 +72,6 @@ public static Question fromId(int id) {
.orElseThrow(() -> new BangggoodException(ExceptionCode.QUESTION_INVALID));
}

public static List<ChecklistQuestion> filter(CategoryEntity category, List<ChecklistQuestion> questions) {
return questions.stream()
.filter(question -> question.isCategory(category) && question.getAnswer() != null)
.toList();
}

public static List<Question> findQuestionsByCategory(CategoryEntity category) {
return Arrays.stream(values())
.filter(question -> question.getCategory().getName().equals(category.getName())) // TODO 변경필요
.toList();
}

public static List<Question> findDefaultQuestions() {
return Arrays.stream(values())
.filter(question -> question.isDefault)
Expand All @@ -95,15 +83,6 @@ public static boolean contains(int id) {
.anyMatch(question -> question.getId() == id);
}

public boolean isSelected(List<CustomChecklistQuestion> questions) {
return questions.stream()
.anyMatch(question -> question.getQuestionId() == this.id);
}

public boolean isCategory(CategoryEntity category) {
return this.category.getName().equals(category.getName());
}

public int getId() {
return id;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.Objects;

import static lombok.AccessLevel.PROTECTED;
Expand Down Expand Up @@ -42,6 +43,11 @@ public QuestionEntity(CategoryEntity category, String title, String subtitle, bo
this.isDefault = isDefault;
}

public boolean isSelected(List<CustomChecklistQuestion> questions) {
return questions.stream()
.anyMatch(question -> question.getQuestionId() == this.id);
}

@Override
public boolean equals(Object o) {
if (this == o) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package com.bang_ggood.question.dto.response;

import com.bang_ggood.question.domain.Question;
import com.bang_ggood.question.domain.Highlight;
import com.bang_ggood.question.domain.QuestionEntity;
import java.util.List;

public class CustomChecklistQuestionResponse extends QuestionResponse {

private final boolean isSelected;

public CustomChecklistQuestionResponse(Question question, boolean isSelected) {
super(question);
public CustomChecklistQuestionResponse(QuestionEntity question, List<Highlight> highlights, boolean isSelected) {
super(question, highlights);
this.isSelected = isSelected;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.bang_ggood.question.dto.response;

import com.bang_ggood.question.domain.Question;
import com.bang_ggood.question.domain.Highlight;
import com.bang_ggood.question.domain.QuestionEntity;
import java.util.List;

public class QuestionResponse {
Expand All @@ -10,11 +11,13 @@ public class QuestionResponse {
private final String subtitle;
private final List<String> highlights;

public QuestionResponse(Question question) {
public QuestionResponse(QuestionEntity question, List<Highlight> highlights) {
this.questionId = question.getId();
this.title = question.getTitle();
this.subtitle = question.getSubtitle();
this.highlights = question.getHighlights();
this.highlights = highlights.stream()
.map(Highlight::getName)
.toList();
}

public Integer getQuestionId() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package com.bang_ggood.question.dto.response;

import com.bang_ggood.question.domain.ChecklistQuestion;
import com.bang_ggood.question.domain.Highlight;
import java.util.List;

public class SelectedQuestionResponse extends QuestionResponse {

private final String answer;

public SelectedQuestionResponse(ChecklistQuestion checklistQuestion) {
super(checklistQuestion.getQuestion());
public SelectedQuestionResponse(ChecklistQuestion checklistQuestion, List<Highlight> highlights) {
super(checklistQuestion.getQuestionEntity(), highlights);
this.answer = checklistQuestion.getAnswer().name();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,9 @@ public interface ChecklistQuestionRepository extends JpaRepository<ChecklistQues
+ "SET cq.deleted = true "
+ "WHERE cq.checklist.id = :checklistId")
void deleteAllByChecklistId(@Param("checklistId") Long checklistId);

@Query("UPDATE ChecklistQuestion cq "
+ "SET cq.questionEntity = :questionId "
+ "WHERE cq.id = :id ")
ChecklistQuestion updateChecklistQuestionId(@Param("questionId") Integer questionId, @Param("id") Long id);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.bang_ggood.question.repository;

import com.bang_ggood.question.domain.Highlight;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;

public interface HighlightRepository extends JpaRepository<Highlight, Integer> {

List<Highlight> findAllByQuestionId(Integer id);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@
import com.bang_ggood.global.exception.ExceptionCode;
import com.bang_ggood.question.domain.QuestionEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;

public interface QuestionRepository extends JpaRepository<QuestionEntity, Integer> {

default QuestionEntity getById(Integer id) {
return findById(id).orElseThrow(() -> new BangggoodException(ExceptionCode.QUESTION_INVALID));
}

List<QuestionEntity> findAllByCategoryId(Integer id);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.bang_ggood.checklist.domain.Checklist;
import com.bang_ggood.global.exception.BangggoodException;
import com.bang_ggood.global.exception.ExceptionCode;
import com.bang_ggood.question.domain.CategoryEntity;
import com.bang_ggood.question.domain.ChecklistQuestion;
import com.bang_ggood.question.domain.CustomChecklistQuestion;
import com.bang_ggood.question.domain.Question;
Expand All @@ -12,6 +13,7 @@
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
Expand Down Expand Up @@ -76,7 +78,29 @@ private void validateCustomChecklistQuestionsDuplication(List<Question> question

@Transactional(readOnly = true)
public List<ChecklistQuestion> readChecklistQuestions(Checklist checklist) {
return checklistQuestionRepository.findAllByChecklistId(checklist.getId());
List<ChecklistQuestion> checklistQuestions = checklistQuestionRepository.findAllByChecklistId(checklist.getId());

List<ChecklistQuestion> result = new ArrayList<>();
for (ChecklistQuestion checklistQuestion : checklistQuestions) {
if (checklistQuestion.getQuestionEntity() == null) {
ChecklistQuestion checklistQuestion1 = checklistQuestionRepository.updateChecklistQuestionId(
checklistQuestion.getQuestionId(), checklistQuestion.getId());

result.add(checklistQuestion1);
continue;
}

result.add(checklistQuestion);
}

return result;
}

@Transactional(readOnly = true)
public List<ChecklistQuestion> categorizeChecklistQuestions(CategoryEntity category, List<ChecklistQuestion> questions) {
return questions.stream()
.filter(question -> question.isCategory(category) && question.getAnswer() != null)
.toList();
}

@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.bang_ggood.question.domain.CategoryEntity;
import com.bang_ggood.question.domain.CustomChecklistQuestion;
import com.bang_ggood.question.domain.Question;
import com.bang_ggood.question.domain.QuestionEntity;
import com.bang_ggood.question.dto.request.CustomChecklistUpdateRequest;
import com.bang_ggood.question.dto.response.CategoryCustomChecklistQuestionResponse;
import com.bang_ggood.question.dto.response.CategoryCustomChecklistQuestionsResponse;
Expand Down Expand Up @@ -52,8 +53,8 @@ private List<CategoryQuestionsResponse> categorizeCustomChecklistQuestions(

for (CategoryEntity category : questionService.findAllCustomQuestionCategories(user)) {
List<QuestionResponse> questionResponses = customChecklistQuestions.stream()
.filter(customChecklistQuestion -> customChecklistQuestion.getCategory().getName().equals(category.getName())) // TODO 리팩토링
.map(customChecklistQuestion -> new QuestionResponse(customChecklistQuestion.getQuestion()))
.filter(customChecklistQuestion -> customChecklistQuestion.isSameCategory(category)) // TODO 리팩토링
.map(customChecklistQuestion -> new QuestionResponse(customChecklistQuestion.getQuestionEntity(), questionService.readHighlights(customChecklistQuestion.getQuestionId())))
.toList();

categoryQuestionsResponses.add(CategoryQuestionsResponse.of(category, questionResponses));
Expand All @@ -74,9 +75,11 @@ private CategoryCustomChecklistQuestionsResponse categorizeAllQuestionsWithSelec
List<CategoryCustomChecklistQuestionResponse> response = new ArrayList<>();

for (CategoryEntity category : questionService.findAllCategories()) {
List<Question> categoryQuestions = Question.findQuestionsByCategory(category);
List<QuestionEntity> categoryQuestions = questionService.readQuestionsByCategory(category);
List<CustomChecklistQuestionResponse> questions = categoryQuestions.stream()
.map(question -> new CustomChecklistQuestionResponse(question,
.map(question -> new CustomChecklistQuestionResponse(
question,
questionService.readHighlights(question.getId()),
question.isSelected(customChecklistQuestions)))
.toList();
response.add(CategoryCustomChecklistQuestionResponse.of(category, questions));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.bang_ggood.question.service;

import com.bang_ggood.question.domain.CategoryEntity;
import com.bang_ggood.question.domain.Highlight;
import com.bang_ggood.question.domain.QuestionEntity;
import com.bang_ggood.question.repository.CategoryRepository;
import com.bang_ggood.question.repository.HighlightRepository;
import com.bang_ggood.question.repository.QuestionRepository;
import com.bang_ggood.user.domain.User;
import lombok.RequiredArgsConstructor;
Expand All @@ -16,6 +18,7 @@ public class QuestionService {

private final CategoryRepository categoryRepository;
private final QuestionRepository questionRepository;
private final HighlightRepository highlightRepository;

@Transactional(readOnly = true)
public List<CategoryEntity> findAllCategories() {
Expand All @@ -31,4 +34,14 @@ public List<CategoryEntity> findAllCustomQuestionCategories(User user) {
public QuestionEntity readQuestion(Integer questionId) {
return questionRepository.getById(questionId);
}

@Transactional(readOnly = true)
public List<Highlight> readHighlights(Integer questionId) {
return highlightRepository.findAllByQuestionId(questionId);
}

@Transactional(readOnly = true)
public List<QuestionEntity> readQuestionsByCategory(CategoryEntity category) {
return questionRepository.findAllByCategoryId(category.getId());
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.bang_ggood.question.domain;

import com.bang_ggood.IntegrationTestSupport;
import com.bang_ggood.checklist.ChecklistFixture;
import com.bang_ggood.question.ChecklistQuestionFixture;
import com.bang_ggood.question.QuestionFixture;
import com.bang_ggood.room.RoomFixture;
import com.bang_ggood.room.domain.Room;
import com.bang_ggood.user.UserFixture;
Expand All @@ -11,7 +13,7 @@

import static org.assertj.core.api.Assertions.assertThat;

class ChecklistQuestionTest {
class ChecklistQuestionTest extends IntegrationTestSupport {

@DisplayName("체크리스트 내에서 질문끼리 다른 id를 갖고 있는지 확인 성공 : 다른 id일 경우")
@Test
Expand All @@ -21,9 +23,9 @@ void isDifferentQuestionId_true() {
User user = UserFixture.USER1();

ChecklistQuestion checklistQuestion1 = ChecklistQuestionFixture.CHECKLIST1_QUESTION1(
ChecklistFixture.CHECKLIST1_USER1(room, user), null);
ChecklistFixture.CHECKLIST1_USER1(room, user), QuestionFixture.QUESTION1_CATEGORY1);
ChecklistQuestion checklistQuestion2 = ChecklistQuestionFixture.CHECKLIST1_QUESTION2(
ChecklistFixture.CHECKLIST1_USER1(room, user), null);
ChecklistFixture.CHECKLIST1_USER1(room, user), QuestionFixture.QUESTION2_CATEGORY1);

//when & then
assertThat(checklistQuestion1.isDifferentQuestionId(checklistQuestion2)).isTrue();
Expand All @@ -36,9 +38,9 @@ void isDifferentQuestionId_false() {
Room room = RoomFixture.ROOM_1();
User user = UserFixture.USER1();
ChecklistQuestion checklistQuestion = ChecklistQuestionFixture.CHECKLIST1_QUESTION1(
ChecklistFixture.CHECKLIST1_USER1(room, user), null);
ChecklistFixture.CHECKLIST1_USER1(room, user), QuestionFixture.QUESTION1_CATEGORY1);
ChecklistQuestion compareChecklistQuestion = ChecklistQuestionFixture.CHECKLIST1_QUESTION1(
ChecklistFixture.CHECKLIST1_USER1(room, user), null);
ChecklistFixture.CHECKLIST1_USER1(room, user), QuestionFixture.QUESTION1_CATEGORY1);

//when & then
assertThat(checklistQuestion.isDifferentQuestionId(compareChecklistQuestion)).isFalse();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import com.bang_ggood.global.exception.ExceptionCode;
import com.bang_ggood.question.CustomChecklistFixture;
import com.bang_ggood.question.domain.CustomChecklistQuestion;
import com.bang_ggood.question.domain.Question;
import com.bang_ggood.question.domain.QuestionEntity;
import com.bang_ggood.question.dto.request.CustomChecklistUpdateRequest;
import com.bang_ggood.question.dto.response.CategoryQuestionsResponse;
import com.bang_ggood.question.dto.response.CustomChecklistQuestionsResponse;
Expand Down Expand Up @@ -49,8 +49,8 @@ void readChecklistQuestions() {

// then
List<Integer> defaultQuestionsIds = customChecklistQuestions.stream()
.map(CustomChecklistQuestion::getQuestion)
.map(Question::getId)
.map(CustomChecklistQuestion::getQuestionEntity)
.map(QuestionEntity::getId)
.toList();
List<Integer> responseQuestionsIds = customChecklistQuestionsResponse.categories().stream()
.map(CategoryQuestionsResponse::questions)
Expand Down

0 comments on commit 662888a

Please sign in to comment.