-
Notifications
You must be signed in to change notification settings - Fork 2
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] feat: 리뷰 폼 응답 재구현 #295
Changes from 1 commit
2ea69e6
c424c06
5abbf92
8d10101
d532c2b
8cdaabe
9039ec8
d6f708f
9c50413
fa0ae42
1811deb
f2edd17
2c93220
bb2245c
040cbea
274d8d3
31999b1
de0c64d
f6c309c
f7b1ec3
207eccc
fef29f6
bc28681
d26b268
3092be1
892c73b
be6b8d5
d5c3b3d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package reviewme.question.domain.exception; | ||
|
||
import lombok.extern.slf4j.Slf4j; | ||
import reviewme.global.exception.NotFoundException; | ||
|
||
@Slf4j | ||
public class NoOptionItemsInOptionGroupException extends NotFoundException { | ||
|
||
public NoOptionItemsInOptionGroupException(long optionGroupId) { | ||
super("서버 내부에서 문제가 발생했어요. 서버에 문의해주세요."); | ||
log.warn("OptionGroup has no OptionItems - optionGroupId: {}", optionGroupId); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package reviewme.question.domain.exception; | ||
|
||
import lombok.extern.slf4j.Slf4j; | ||
import reviewme.global.exception.NotFoundException; | ||
|
||
@Slf4j | ||
public class OptionGroupNotFoundByQuestionException extends NotFoundException { | ||
|
||
public OptionGroupNotFoundByQuestionException(long questionId) { | ||
super("서버 내부에서 문제가 발생했어요. 서버에 문의해주세요."); | ||
log.info("OptionGroup not found by question - questionId: {}", questionId); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
package reviewme.question.repository; | ||
|
||
import java.util.Optional; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
import org.springframework.stereotype.Repository; | ||
import reviewme.question.domain.OptionGroup; | ||
import reviewme.question.domain.exception.OptionGroupNotFoundByQuestionException; | ||
|
||
@Repository | ||
public interface OptionGroupRepository extends JpaRepository<OptionGroup, Long> { | ||
|
||
Optional<OptionGroup> findByQuestionId(long questionId); | ||
|
||
default OptionGroup getOptionGroupByQuestionId(long questionId) { | ||
return findByQuestionId(questionId) | ||
.orElseThrow(() -> new OptionGroupNotFoundByQuestionException(questionId)); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package reviewme.question.repository; | ||
|
||
import java.util.List; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
import org.springframework.stereotype.Repository; | ||
import reviewme.question.domain.OptionItem; | ||
|
||
@Repository | ||
public interface OptionItemRepository extends JpaRepository<OptionItem, Long> { | ||
|
||
List<OptionItem> findAllByOptionGroupId(long optionGroupId); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package reviewme.question.repository; | ||
|
||
import java.util.Optional; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
import org.springframework.stereotype.Repository; | ||
import reviewme.question.domain.Question2; | ||
import reviewme.question.domain.exception.QuestionNotFoundException; | ||
|
||
@Repository | ||
public interface Question2Repository extends JpaRepository<Question2, Long> { | ||
|
||
Optional<Question2> findById(long id); | ||
|
||
default Question2 getQuestionById(long id) { | ||
return findById(id).orElseThrow(() -> new QuestionNotFoundException(id)); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package reviewme.template.domain.exception; | ||
|
||
import lombok.extern.slf4j.Slf4j; | ||
import reviewme.global.exception.NotFoundException; | ||
|
||
@Slf4j | ||
public class SectionNotFoundException extends NotFoundException { | ||
|
||
public SectionNotFoundException(long id) { | ||
super("서버 내부에서 문제가 발생했어요. 서버에 문의해주세요."); | ||
log.info("SectionNotFoundException is occurred - id: {}", id); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 문의 바람은 |
||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package reviewme.template.repository; | ||
|
||
import java.util.Optional; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
import org.springframework.stereotype.Repository; | ||
import reviewme.template.domain.Section; | ||
import reviewme.template.domain.exception.SectionNotFoundException; | ||
|
||
@Repository | ||
public interface SectionRepository extends JpaRepository<Section, Long> { | ||
|
||
Optional<Section> findById(long id); | ||
|
||
default Section getSectionById(long id) { | ||
return findById(id).orElseThrow(() -> new SectionNotFoundException(id)); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package reviewme.template.repository; | ||
|
||
import java.util.Optional; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
import org.springframework.stereotype.Repository; | ||
import reviewme.template.domain.Template; | ||
|
||
@Repository | ||
public interface TemplateRepository extends JpaRepository<Template, Long> { | ||
|
||
Optional<Template> findTopByOrderByIdDesc(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 템플릿을 찾는 건데, id로 찾는 게 더 낫지 않나요? 나중에 여러 개가 들어오면 확장하기 어려울 것 같아요 |
||
} |
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. (급한 건 아닙니다! 얘기해볼 점!) 지금 생각으로는 TemplateService에 더 들어올 로직이 떠오르는 게 없는데, 그렇다면 현재 TemplateSevice는 곧 템플릿 생성이라는 역할만을 전적으로 담당하는 서비스인데, Mapper가 그 생성을 다시 한 번 나눠가진 느낌이 들어요. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
package reviewme.template.service; | ||
|
||
import java.util.List; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.stereotype.Component; | ||
import reviewme.question.domain.OptionGroup; | ||
import reviewme.question.domain.OptionItem; | ||
import reviewme.question.domain.Question2; | ||
import reviewme.question.domain.exception.NoOptionItemsInOptionGroupException; | ||
import reviewme.question.repository.OptionGroupRepository; | ||
import reviewme.question.repository.OptionItemRepository; | ||
import reviewme.question.repository.Question2Repository; | ||
import reviewme.reviewgroup.domain.ReviewGroup; | ||
import reviewme.template.domain.Section; | ||
import reviewme.template.domain.Template; | ||
import reviewme.template.dto.response.OptionGroupResponse; | ||
import reviewme.template.dto.response.OptionItemResponse; | ||
import reviewme.template.dto.response.QuestionResponse; | ||
import reviewme.template.dto.response.SectionResponse; | ||
import reviewme.template.dto.response.TemplateResponse; | ||
import reviewme.template.repository.SectionRepository; | ||
|
||
@Component | ||
@RequiredArgsConstructor | ||
public class TemplateMapper { | ||
|
||
private final SectionRepository sectionRepository; | ||
private final Question2Repository questionRepository; | ||
private final OptionGroupRepository optionGroupRepository; | ||
private final OptionItemRepository optionItemRepository; | ||
|
||
public TemplateResponse mapToTemplateResponse(ReviewGroup reviewGroup, Template template) { | ||
List<SectionResponse> sectionResponses = template.getSectionIds() | ||
.stream() | ||
.map(this::mapToSectionResponse) | ||
.toList(); | ||
Comment on lines
+35
to
+38
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 섹션 하나당 쿼리가 한 개 나갈텐데, 레포에서 쿼리 묶어서 하는 게 더 효율은 좋겠습니다. 일단 구현이 급선무니 이건 넘어가도 좋아요
Comment on lines
+34
to
+38
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ㅋㅋㅋㅋㅋ 연쇄매핑마.. 그래도 보기 깔끔해서 좋네요! |
||
|
||
return new TemplateResponse( | ||
template.getId(), | ||
reviewGroup.getReviewee(), | ||
reviewGroup.getProjectName(), | ||
sectionResponses | ||
); | ||
} | ||
|
||
private SectionResponse mapToSectionResponse(long sectionId) { | ||
Section section = sectionRepository.getSectionById(sectionId); | ||
List<QuestionResponse> questionResponses = section.getQuestionIds() | ||
.stream() | ||
.map(this::mapToQuestionResponse) | ||
.toList(); | ||
|
||
return new SectionResponse( | ||
sectionId, | ||
section.getVisibleType().name(), | ||
section.getOnSelectedOptionId(), | ||
section.getHeader(), | ||
questionResponses | ||
); | ||
} | ||
|
||
private QuestionResponse mapToQuestionResponse(long questionId) { | ||
Question2 question = questionRepository.getQuestionById(questionId); | ||
OptionGroup optionGroup = optionGroupRepository.getOptionGroupByQuestionId(questionId); | ||
OptionGroupResponse optionGroupResponse = mapToOptionGroupResponse(optionGroup); | ||
|
||
return new QuestionResponse( | ||
question.getId(), | ||
question.isRequired(), | ||
question.getContent(), | ||
question.getContent(), | ||
optionGroupResponse, | ||
question.hasGuideline(), | ||
question.getGuideline() | ||
); | ||
} | ||
|
||
private OptionGroupResponse mapToOptionGroupResponse(OptionGroup optionGroup) { | ||
List<OptionItem> optionItems = optionItemRepository.findAllByOptionGroupId(optionGroup.getId()); | ||
if (optionItems.isEmpty()) { | ||
throw new NoOptionItemsInOptionGroupException(optionGroup.getId()); | ||
} | ||
|
||
List<OptionItemResponse> optionItemResponses = optionItems.stream() | ||
.map(this::mapToOptionItemResponse) | ||
.toList(); | ||
|
||
return new OptionGroupResponse( | ||
optionGroup.getId(), | ||
optionGroup.getMinSelectionCount(), | ||
optionGroup.getMaxSelectionCount(), | ||
optionItemResponses | ||
); | ||
} | ||
|
||
private OptionItemResponse mapToOptionItemResponse(OptionItem optionItem) { | ||
return new OptionItemResponse(optionItem.getId(), optionItem.getContent()); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
제안:
MissingOptionItemsInOptionGroup
?