-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
1566337
commit 018a187
Showing
2 changed files
with
154 additions
and
0 deletions.
There are no files selected for viewing
61 changes: 61 additions & 0 deletions
61
backend/src/main/java/reviewme/highlight/service/mapper/HighlightMapper.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
package reviewme.highlight.service.mapper; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
import java.util.Map; | ||
import java.util.Map.Entry; | ||
import java.util.stream.Collectors; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.stereotype.Component; | ||
import reviewme.highlight.domain.Highlight; | ||
import reviewme.highlight.domain.HighlightLine; | ||
import reviewme.highlight.domain.HighlightLines; | ||
import reviewme.highlight.domain.HighlightRange; | ||
import reviewme.highlight.service.dto.HighlightIndexRangeRequest; | ||
import reviewme.highlight.service.dto.HighlightRequest; | ||
import reviewme.highlight.service.dto.HighlightedLineRequest; | ||
import reviewme.highlight.service.dto.HighlightsRequest; | ||
import reviewme.review.domain.Answer; | ||
import reviewme.review.domain.TextAnswer; | ||
|
||
@Component | ||
@RequiredArgsConstructor | ||
public class HighlightMapper { | ||
|
||
public List<Highlight> mapToHighlights(HighlightsRequest highlightsRequest, List<TextAnswer> textAnswers) { | ||
Map<Long, HighlightLines> answerHighlightLines = textAnswers.stream() | ||
.collect(Collectors.toMap(Answer::getId, answer -> new HighlightLines(answer.getContent()))); | ||
|
||
for (HighlightRequest highlightRequest : highlightsRequest.highlights()) { | ||
HighlightLines highlightLines = answerHighlightLines.get(highlightRequest.answerId()); | ||
addLine(highlightRequest, highlightLines); | ||
} | ||
|
||
List<Highlight> highlights = new ArrayList<>(); | ||
for (Entry<Long, HighlightLines> answerHighlightLine : answerHighlightLines.entrySet()) { | ||
addHighlight(answerHighlightLine, highlights); | ||
} | ||
return highlights; | ||
} | ||
|
||
private void addLine(HighlightRequest highlightRequest, HighlightLines highlightLines) { | ||
for (HighlightedLineRequest lineRequest : highlightRequest.lines()) { | ||
int lineIndex = lineRequest.index(); | ||
for (HighlightIndexRangeRequest rangeRequest : lineRequest.ranges()) { | ||
highlightLines.addRange(lineIndex, rangeRequest.startIndex(), rangeRequest.endIndex()); | ||
} | ||
} | ||
} | ||
|
||
private void addHighlight(Entry<Long, HighlightLines> answerHighlightLine, List<Highlight> highlights) { | ||
long answerId = answerHighlightLine.getKey(); | ||
HighlightLines highlightLines = answerHighlightLine.getValue(); | ||
|
||
for (HighlightLine line : highlightLines.getLines()) { | ||
for (HighlightRange range : line.getRanges()) { | ||
Highlight highlight = new Highlight(answerId, line.getLineIndex(), range); | ||
highlights.add(highlight); | ||
} | ||
} | ||
} | ||
} |
93 changes: 93 additions & 0 deletions
93
backend/src/test/java/reviewme/highlight/service/mapper/HighlightMapperTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
package reviewme.highlight.service.mapper; | ||
|
||
import static org.assertj.core.api.Assertions.assertThat; | ||
import static org.junit.jupiter.api.Assertions.assertAll; | ||
import static reviewme.fixture.SectionFixture.항상_보이는_섹션; | ||
import static reviewme.fixture.TemplateFixture.템플릿; | ||
|
||
import java.util.List; | ||
import org.junit.jupiter.api.Test; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
import reviewme.fixture.QuestionFixture; | ||
import reviewme.fixture.ReviewGroupFixture; | ||
import reviewme.highlight.domain.Highlight; | ||
import reviewme.highlight.domain.HighlightRange; | ||
import reviewme.highlight.repository.HighlightRepository; | ||
import reviewme.highlight.service.dto.HighlightIndexRangeRequest; | ||
import reviewme.highlight.service.dto.HighlightRequest; | ||
import reviewme.highlight.service.dto.HighlightedLineRequest; | ||
import reviewme.highlight.service.dto.HighlightsRequest; | ||
import reviewme.question.repository.QuestionRepository; | ||
import reviewme.review.domain.Review; | ||
import reviewme.review.domain.TextAnswer; | ||
import reviewme.review.repository.ReviewRepository; | ||
import reviewme.reviewgroup.repository.ReviewGroupRepository; | ||
import reviewme.support.ServiceTest; | ||
import reviewme.template.repository.SectionRepository; | ||
import reviewme.template.repository.TemplateRepository; | ||
|
||
@ServiceTest | ||
class HighlightMapperTest { | ||
|
||
@Autowired | ||
HighlightMapper highlightMapper; | ||
|
||
@Autowired | ||
private HighlightRepository highlightRepository; | ||
|
||
@Autowired | ||
private ReviewGroupRepository reviewGroupRepository; | ||
|
||
@Autowired | ||
private ReviewRepository reviewRepository; | ||
|
||
@Autowired | ||
private QuestionRepository questionRepository; | ||
|
||
@Autowired | ||
private SectionRepository sectionRepository; | ||
|
||
@Autowired | ||
private TemplateRepository templateRepository; | ||
|
||
@Test | ||
void 하이라이트_요청과_기존_서술형_답변으로_하이라이트를_매핑한다() { | ||
// given | ||
long questionId = questionRepository.save(QuestionFixture.서술형_필수_질문()).getId(); | ||
long sectionId = sectionRepository.save(항상_보이는_섹션(List.of(questionId))).getId(); | ||
long templateId = templateRepository.save(템플릿(List.of(sectionId))).getId(); | ||
String reviewRequestCode = "reviewRequestCode"; | ||
long reviewGroupId = reviewGroupRepository.save(ReviewGroupFixture.리뷰_그룹(reviewRequestCode, "groupAccessCode")) | ||
.getId(); | ||
|
||
TextAnswer textAnswer1 = new TextAnswer(questionId, "text answer1"); | ||
TextAnswer textAnswer2 = new TextAnswer(questionId, "text answer2"); | ||
Review review = reviewRepository.save(new Review(templateId, reviewGroupId, List.of(textAnswer1, textAnswer2))); | ||
|
||
highlightRepository.save(new Highlight(1, 1, new HighlightRange(1, 1))); | ||
|
||
int startIndex = 2; | ||
int endIndex = 2; | ||
int lineIndex = 0; | ||
HighlightIndexRangeRequest rangeRequest = new HighlightIndexRangeRequest(startIndex, endIndex); | ||
HighlightedLineRequest lineRequest1 = new HighlightedLineRequest(lineIndex, List.of(rangeRequest)); | ||
HighlightedLineRequest lineRequest2 = new HighlightedLineRequest(lineIndex, List.of(rangeRequest)); | ||
HighlightRequest highlightRequest1 = new HighlightRequest(textAnswer1.getId(), List.of(lineRequest1)); | ||
HighlightRequest highlightRequest2 = new HighlightRequest(textAnswer2.getId(), List.of(lineRequest2)); | ||
HighlightsRequest highlightsRequest = new HighlightsRequest(questionId, | ||
List.of(highlightRequest1, highlightRequest2)); | ||
|
||
// when | ||
List<Highlight> highlights = highlightMapper.mapToHighlights(highlightsRequest, | ||
List.of(textAnswer1, textAnswer2)); | ||
|
||
// then | ||
HighlightRange range = new HighlightRange(startIndex, endIndex); | ||
assertAll( | ||
() -> assertThat(highlights.get(0).getAnswerId()).isEqualTo(textAnswer1.getId()), | ||
() -> assertThat(highlights.get(1).getAnswerId()).isEqualTo(textAnswer2.getId()), | ||
() -> assertThat(highlights.get(0).getHighlightRange()).isEqualTo(range), | ||
() -> assertThat(highlights.get(1).getHighlightRange()).isEqualTo(range) | ||
); | ||
} | ||
} |