Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BE] 스키마 변경에 따른 무중단 배포를 진행한다. #858

Merged
merged 1 commit into from
Oct 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading