Skip to content

Commit

Permalink
refactor: 서비스에 하이라이트 객체 매핑 적용
Browse files Browse the repository at this point in the history
  • Loading branch information
skylar1220 committed Oct 14, 2024
1 parent 018a187 commit 0932461
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 72 deletions.
Original file line number Diff line number Diff line change
@@ -1,19 +1,13 @@
package reviewme.highlight.service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import reviewme.highlight.domain.Highlight;
import reviewme.highlight.domain.HighlightLines;
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.highlight.service.mapper.HighlightMapper;
import reviewme.highlight.service.validator.HighlightValidator;
import reviewme.review.domain.TextAnswer;
import reviewme.review.domain.TextAnswers;
Expand All @@ -30,67 +24,22 @@ public class HighlightService {
private final TextAnswerRepository textAnswerRepository;

private final HighlightValidator highlightValidator;
private final HighlightMapper highlightMapper;

@Transactional
public void editHighlight(HighlightsRequest highlightsRequest, String reviewRequestCode) {
long reviewGroupId = reviewGroupRepository.findByReviewRequestCode(reviewRequestCode)
.orElseThrow(() -> new ReviewGroupNotFoundByReviewRequestCodeException(reviewRequestCode))
.getId();
List<TextAnswer> textAnswersByIds = textAnswerRepository.findAllById(highlightsRequest.getUniqueAnswerIds());
TextAnswers textAnswers = new TextAnswers(textAnswersByIds);

highlightValidator.validate(highlightsRequest, reviewGroupId);
Map<Long, HighlightLines> highlightLines = mapHighlightLines(highlightsRequest, textAnswers);

deleteBeforeHighlight(highlightsRequest.questionId(), textAnswers);
saveHighlights(highlightLines);
}

private Map<Long, HighlightLines> mapHighlightLines(HighlightsRequest highlightsRequest, TextAnswers textAnswers) {
Map<Long, List<Integer>> answerLineIndexes = highlightsRequest.highlights()
.stream()
.collect(Collectors.toMap(HighlightRequest::answerId, HighlightRequest::getLineIndexes));

Map<Long, HighlightLines> highlightLinesByAnswerId = new HashMap<>();
for (HighlightRequest highlightRequest : highlightsRequest.highlights()) {
long answerId = highlightRequest.answerId();
highlightLinesByAnswerId.put(answerId,
mapHighlightLine(highlightRequest, textAnswers.get(answerId), answerLineIndexes.get(answerId))
);
}
return highlightLinesByAnswerId;
}
List<Highlight> highlights = highlightMapper.mapToHighlights(highlightsRequest, textAnswersByIds);

private HighlightLines mapHighlightLine(HighlightRequest highlightRequest,
TextAnswer answer, List<Integer> answerLineIndex) {
HighlightLines highlightLines = new HighlightLines(answer.getContent(), answerLineIndex);
for (HighlightedLineRequest lineRequest : highlightRequest.lines()) {
for (HighlightIndexRangeRequest rangeRequest : lineRequest.ranges()) {
highlightLines.addRange(lineRequest.index(), rangeRequest.startIndex(), rangeRequest.endIndex());
}
}
return highlightLines;
}

private void deleteBeforeHighlight(long questionId, TextAnswers textAnswers) {
List<Long> answerIds = textAnswers.getIdsByQuestionId(questionId);
TextAnswers textAnswers = new TextAnswers(textAnswersByIds);
List<Long> answerIds = textAnswers.getIdsByQuestionId(highlightsRequest.questionId());
highlightRepository.deleteAllByIds(answerIds);
}

private void saveHighlights(Map<Long, HighlightLines> highlightLines) {
List<Highlight> highlights = highlightLines.entrySet()
.stream()
.flatMap(highlightLinesByAnswer ->
createHighlight(highlightLinesByAnswer.getKey(), highlightLinesByAnswer.getValue()).stream())
.collect(Collectors.toList());
highlightRepository.saveAll(highlights);
}

private List<Highlight> createHighlight(long answerId, HighlightLines lines) {
return lines.getLines()
.stream()
.flatMap(line -> line.getRanges().stream()
.map(range -> new Highlight(answerId, line.getLineIndex(), range)))
.toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -95,34 +95,26 @@ class HighlightServiceTest {
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)));

TextAnswer textAnswer = new TextAnswer(questionId, "text answer1");
Review review = reviewRepository.save(new Review(templateId, reviewGroupId, List.of(textAnswer)));
highlightRepository.save(new Highlight(1, 1, new HighlightRange(1, 1)));

int startIndex = 2;
int endIndex = 2;
int lineIndex = 0;
HighlightIndexRangeRequest indexRangeRequest = new HighlightIndexRangeRequest(startIndex, endIndex);
HighlightedLineRequest lineRequest1 = new HighlightedLineRequest(lineIndex, List.of(indexRangeRequest));
HighlightedLineRequest lineRequest2 = new HighlightedLineRequest(lineIndex, List.of(indexRangeRequest));
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));
HighlightedLineRequest lineRequest = new HighlightedLineRequest(0, List.of(indexRangeRequest));
HighlightRequest highlightRequest = new HighlightRequest(textAnswer.getId(), List.of(lineRequest));
HighlightsRequest highlightsRequest = new HighlightsRequest(questionId, List.of(highlightRequest));

// when
highlightService.editHighlight(highlightsRequest, reviewRequestCode);

// then
List<Highlight> highlights = highlightRepository.findAll();
HighlightRange position = 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(position),
() -> assertThat(highlights.get(0).getHighlightRange()).isEqualTo(position)
() -> assertThat(highlights.get(0).getAnswerId()).isEqualTo(textAnswer.getId()),
() -> assertThat(highlights.get(0).getHighlightRange()).isEqualTo(
new HighlightRange(startIndex, endIndex))
);
}
}

0 comments on commit 0932461

Please sign in to comment.