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] Enum 데이터를 DB로 옮긴다. #810

Merged
merged 10 commits into from
Oct 17, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,13 @@
import com.bang_ggood.option.dto.response.SelectedOptionResponse;
import com.bang_ggood.option.service.ChecklistOptionService;
import com.bang_ggood.question.domain.Answer;
import com.bang_ggood.question.domain.Category;
import com.bang_ggood.question.domain.CategoryEntity;
import com.bang_ggood.question.domain.ChecklistQuestion;
import com.bang_ggood.question.domain.Question;
import com.bang_ggood.question.dto.response.SelectedCategoryQuestionsResponse;
import com.bang_ggood.question.dto.response.SelectedQuestionResponse;
import com.bang_ggood.question.service.ChecklistQuestionService;
import com.bang_ggood.question.service.QuestionService;
import com.bang_ggood.room.domain.Room;
import com.bang_ggood.room.dto.response.SelectedRoomResponse;
import com.bang_ggood.room.service.RoomService;
Expand All @@ -33,7 +34,6 @@
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.List;

@RequiredArgsConstructor
Expand All @@ -47,6 +47,7 @@ public class ChecklistManageService {
private final ChecklistMaintenanceService checklistMaintenanceService;
private final ChecklistLikeService checklistLikeService;
private final ChecklistStationService checklistStationService;
private final QuestionService questionService;

@Transactional
public Long createChecklist(User user, ChecklistRequest checklistRequest) {
Expand Down Expand Up @@ -83,6 +84,7 @@ private void createChecklistQuestions(ChecklistRequest checklistRequest, Checkli
.map(question -> new ChecklistQuestion(
checklist,
Question.fromId(question.questionId()),
questionService.readQuestion(question.questionId()),
Answer.from(question.answer())))
.toList();
checklistQuestionService.createQuestions(checklistQuestions);
Expand Down Expand Up @@ -146,12 +148,13 @@ private List<SelectedOptionResponse> readChecklistOptions(Checklist checklist) {
private List<SelectedCategoryQuestionsResponse> readChecklistQuestions(Checklist checklist) {
List<ChecklistQuestion> checklistQuestions = checklistQuestionService.readChecklistQuestions(checklist);

return Arrays.stream(Category.values())

return questionService.findAllCategories().stream()
.map(category -> categorizeChecklistQuestions(category, checklistQuestions))
.toList();
}

private SelectedCategoryQuestionsResponse categorizeChecklistQuestions(Category category,
private SelectedCategoryQuestionsResponse categorizeChecklistQuestions(CategoryEntity category,
List<ChecklistQuestion> checklistQuestions) {
List<SelectedQuestionResponse> selectedQuestionResponse = Question.filter(category, checklistQuestions)
.stream()
Expand Down Expand Up @@ -234,6 +237,7 @@ private void updateChecklistQuestions(ChecklistRequest checklistRequest, Checkli
.map(question -> new ChecklistQuestion(
checklist,
Question.fromId(question.questionId()),
questionService.readQuestion(question.questionId()),
Answer.from(question.answer())))
.toList();
checklistQuestionService.updateQuestions(questions, updateQuestions);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.bang_ggood.question.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.Objects;

import static lombok.AccessLevel.PROTECTED;

@Getter
@NoArgsConstructor(access = PROTECTED)
@Table(name = "category") //TODO 변경필요
@Entity
public class CategoryEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

@Column(nullable = false)
private String name;

public CategoryEntity(String name) {
this.name = name;
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
CategoryEntity that = (CategoryEntity) o;
return Objects.equals(id, that.id);
}

@Override
public int hashCode() {
return Objects.hash(id);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -31,13 +32,18 @@ public class ChecklistQuestion extends BaseEntity {
@Enumerated(EnumType.STRING)
private Question question;

@JoinColumn(name = "question_id")
@ManyToOne(fetch = FetchType.LAZY)
private QuestionEntity questionEntity;

@Enumerated(EnumType.STRING)
private Answer answer;

public ChecklistQuestion(Checklist checklist, Question question, Answer answer) {
public ChecklistQuestion(Checklist checklist, Question question, QuestionEntity questionEntity, Answer answer) {
this.checklist = checklist;
this.question = question;
this.answer = answer;
this.questionEntity = questionEntity;
}

public void change(ChecklistQuestion checklistQuestion) {
Expand All @@ -56,7 +62,7 @@ public Integer getQuestionId() {
return question.getId();
}

public boolean isCategory(Category category) {
public boolean isCategory(CategoryEntity category) {
return question.isCategory(category);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -30,9 +31,14 @@ public class CustomChecklistQuestion extends BaseEntity {
@Enumerated(EnumType.STRING)
private Question question;

public CustomChecklistQuestion(User user, Question question) {
@JoinColumn(name = "question_id")
@ManyToOne(fetch = FetchType.LAZY)
private QuestionEntity questionEntity;

public CustomChecklistQuestion(User user, Question question, QuestionEntity questionEntity) {
this.user = user;
this.question = question;
this.questionEntity = questionEntity;
}

public Integer getQuestionId() {
Expand All @@ -42,5 +48,4 @@ public Integer getQuestionId() {
public Category getCategory() {
return question.getCategory();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.bang_ggood.question.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.Objects;

import static lombok.AccessLevel.PROTECTED;

@Getter
@NoArgsConstructor(access = PROTECTED)
@Entity
public class Highlight {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

@ManyToOne(fetch = FetchType.LAZY)
private QuestionEntity question;

@Column(nullable = false)
private String name;

public Highlight(QuestionEntity question, String name) {
this.question = question;
this.name = name;
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Highlight highlight = (Highlight) o;
return Objects.equals(id, highlight.id);
}

@Override
public int hashCode() {
return Objects.hash(id);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@
import com.bang_ggood.global.exception.BangggoodException;
import com.bang_ggood.global.exception.ExceptionCode;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public enum Question {

Expand Down Expand Up @@ -51,11 +49,6 @@ public enum Question {
OUTSIDE_5(31, Category.OUTSIDE, "옆 건물에서 보이는 구조인지 확인했나요?", null, List.of("보이는 구조"), false),
OUTSIDE_6(32, Category.OUTSIDE, "주차할 수 있는 시설이 있나요?", null, List.of("주차할 수 있는 시설"), false);

static {
validateQuestionIdDuplication();
validateQuestionHighlightsMisMatch();
}

private final int id;
private final Category category;
private final String title;
Expand All @@ -72,41 +65,22 @@ public enum Question {
this.isDefault = isDefault;
}

private static void validateQuestionIdDuplication() {
Set<Integer> idSet = new HashSet<>();
for (Question question : Question.values()) {
if (!idSet.add(question.getId())) {
throw new BangggoodException(ExceptionCode.QUESTION_ID_ERROR);
}
}
}

private static void validateQuestionHighlightsMisMatch() {
for (Question question : Question.values()) {
for (String highlight : question.highlights) {
if (!question.getTitle().contains(highlight)) {
throw new BangggoodException(ExceptionCode.QUESTION_HIGHLIGHT_ERROR);
}
}
}
}

public static Question fromId(int id) {
return Arrays.stream(values())
.filter(question -> question.id == id)
.findFirst()
.orElseThrow(() -> new BangggoodException(ExceptionCode.QUESTION_INVALID));
}

public static List<ChecklistQuestion> filter(Category category, List<ChecklistQuestion> questions) {
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(Category category) {
public static List<Question> findQuestionsByCategory(CategoryEntity category) {
return Arrays.stream(values())
.filter(question -> question.getCategory().equals(category))
.filter(question -> question.getCategory().getName().equals(category.getName())) // TODO 변경필요
.toList();
}

Expand All @@ -126,8 +100,8 @@ public boolean isSelected(List<CustomChecklistQuestion> questions) {
.anyMatch(question -> question.getQuestionId() == this.id);
}

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

public int getId() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package com.bang_ggood.question.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.Objects;

import static lombok.AccessLevel.PROTECTED;

@Getter
@NoArgsConstructor(access = PROTECTED)
@Table(name = "question") //TODO 변경필요
@Entity
public class QuestionEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

@ManyToOne(fetch = FetchType.LAZY)
private CategoryEntity category;

@Column(nullable = false)
private String title;

private String subtitle;

private boolean isDefault;

public QuestionEntity(CategoryEntity category, String title, String subtitle, boolean isDefault) {
this.category = category;
this.title = title;
this.subtitle = subtitle;
this.isDefault = isDefault;
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
QuestionEntity that = (QuestionEntity) o;
return Objects.equals(id, that.id);
}

@Override
public int hashCode() {
return Objects.hash(id);
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.bang_ggood.question.dto.response;

import com.bang_ggood.question.domain.Category;
import com.bang_ggood.question.domain.CategoryEntity;
import java.util.List;

public record CategoryCustomChecklistQuestionResponse(Integer categoryId, String categoryName,
List<CustomChecklistQuestionResponse> questions) {

public static CategoryCustomChecklistQuestionResponse of(Category category,
public static CategoryCustomChecklistQuestionResponse of(CategoryEntity category,
List<CustomChecklistQuestionResponse> questions) {
return new CategoryCustomChecklistQuestionResponse(category.getId(), category.getName(), questions);
}
Expand Down
Loading
Loading