From 58bbf75a3fe6adc8846acfe388993f4465d94f82 Mon Sep 17 00:00:00 2001 From: gimhanul Date: Thu, 14 Sep 2023 10:34:43 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=B3=B5=EC=88=98=EC=84=A0=ED=83=9D?= =?UTF-8?q?=ED=98=95=20filtering?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ApplicationController.java | 5 ++- .../QueryApplicationResultService.java | 44 ++++++++++++++++--- .../soogung/simblue/global/util/Operator.java | 3 +- 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/soogung/simblue/domain/application/presentation/ApplicationController.java b/src/main/java/com/soogung/simblue/domain/application/presentation/ApplicationController.java index adab64f..f34a3cf 100644 --- a/src/main/java/com/soogung/simblue/domain/application/presentation/ApplicationController.java +++ b/src/main/java/com/soogung/simblue/domain/application/presentation/ApplicationController.java @@ -97,10 +97,11 @@ public ApplicationStatusResponse getMyApplication() { return queryMyApplicationService.execute(); } - @GetMapping("/{id}/result") + // TODO :: HTTP method mismatched + @PostMapping("/{id}/result") public ApplicationResultResponse getApplicationResult( @PathVariable Long id, - @RequestBody(required = false) @Valid FilterListRequest filterList + @RequestBody(required = false) FilterListRequest filterList ) { return queryApplicationResultService.execute(id, filterList); } diff --git a/src/main/java/com/soogung/simblue/domain/application/service/QueryApplicationResultService.java b/src/main/java/com/soogung/simblue/domain/application/service/QueryApplicationResultService.java index 373bf4b..a1b3c6f 100644 --- a/src/main/java/com/soogung/simblue/domain/application/service/QueryApplicationResultService.java +++ b/src/main/java/com/soogung/simblue/domain/application/service/QueryApplicationResultService.java @@ -20,6 +20,7 @@ import com.soogung.simblue.domain.user.facade.UserFacade; import com.soogung.simblue.global.error.exception.ErrorCode; import com.soogung.simblue.global.error.exception.SimblueException; +import com.soogung.simblue.global.util.Operator; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -59,6 +60,7 @@ public ApplicationResultResponse execute(Long id, FilterListRequest filterList) .findApplicationResult(id).stream() .filter(r -> filtering(r, filterList)) .map(this::createReplyList) + .filter(r -> filteringContains(r, filterList)) .collect(Collectors.toList()); return new ApplicationResultResponse( @@ -70,14 +72,13 @@ public ApplicationResultResponse execute(Long id, FilterListRequest filterList) } private boolean filtering(ReplyBlock block, FilterListRequest request) { - if ( - request == null || - request.getFilterList() == null || - request.getFilterList().isEmpty()) { - return true; - } + if (validate(request)) return true; for (FilterRequest filter : request.getFilterList()) { + if (filter.getOperator() == Operator.CONTAINS) { + continue; + } + Reply reply = getReplyByQuestionId(block.getReplies(), filter.getQuestionId()); if (!filter.getOperator().getComparator() .execute(filter.getTarget(), reply.getAnswer())) { @@ -88,6 +89,30 @@ private boolean filtering(ReplyBlock block, FilterListRequest request) { return true; } + private boolean filteringContains(ReplyBlockResponse block, FilterListRequest request) { + if (validate(request)) return true; + + for (FilterRequest filter : request.getFilterList()) { + if (filter.getOperator() != Operator.CONTAINS) { + continue; + } + + ReplyResponse reply = getReplyResponseByQuestionId(block.getReplyList(), filter.getQuestionId()); + if (!filter.getOperator().getComparator() + .execute(filter.getTarget(), reply.getReply())) { + return false; + } + } + + return true; + } + + private boolean validate(FilterListRequest request) { + return request == null || + request.getFilterList() == null || + request.getFilterList().isEmpty(); + } + private Reply getReplyByQuestionId(List replyList, Long questionId) { return replyList.stream() .filter(r -> r.getQuestion().getId().equals(questionId)) @@ -95,6 +120,13 @@ private Reply getReplyByQuestionId(List replyList, Long questionId) { .orElseThrow(() -> new SimblueException(ErrorCode.BAD_REQUEST)); } + private ReplyResponse getReplyResponseByQuestionId(List replyList, Long questionId) { + return replyList.stream() + .filter(r -> r.getQuestionId().equals(questionId)) + .findFirst() + .orElseThrow(() -> new SimblueException(ErrorCode.BAD_REQUEST)); + } + private ReplyBlockResponse createReplyList(ReplyBlock block) { User student = block.getUser(); diff --git a/src/main/java/com/soogung/simblue/global/util/Operator.java b/src/main/java/com/soogung/simblue/global/util/Operator.java index 981d146..94da94b 100644 --- a/src/main/java/com/soogung/simblue/global/util/Operator.java +++ b/src/main/java/com/soogung/simblue/global/util/Operator.java @@ -17,7 +17,8 @@ public enum Operator { BEFORE((target, other) -> (LocalDate.parse((String) target)).isBefore((LocalDate.parse((String) other)))), AFTER((target, other) -> (LocalDate.parse((String) target)).isAfter((LocalDate.parse((String) other)))), BEFORE_OR_EQUAL((target, other) -> !AFTER.comparator.execute(target, other)), - AFTER_OR_EQUAL((target, other) -> !BEFORE.comparator.execute(target, other)); + AFTER_OR_EQUAL((target, other) -> !BEFORE.comparator.execute(target, other)), + CONTAINS((target, other) -> ((String) other).contains((String) target)); private final Comparator comparator; }