From 1c740228131e11b0bcd15e34226ef7fc4b4b2c0b Mon Sep 17 00:00:00 2001 From: young970 Date: Tue, 16 Jan 2024 03:07:14 +0900 Subject: [PATCH] =?UTF-8?q?[Feat]:=20=EC=8A=A4=ED=8E=98=EC=9D=B4=EC=8A=A4?= =?UTF-8?q?=20=EA=B2=80=EC=83=89=20=EC=8B=9C=20like=EC=BF=BC=EB=A6=AC?= =?UTF-8?q?=EB=9E=91=20=EB=B9=84=EA=B5=90=ED=95=98=EA=B8=B0=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20=EC=97=94=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../space/controller/SpaceController.java | 28 +++++++++++++++ .../space/DefaultSpaceRepository.java | 5 +++ .../repository/space/SpaceRepository.java | 2 ++ .../space/querydsl/DynamicQueryFactory.java | 8 +++++ .../querydsl/SpaceQueryDslRepository.java | 34 +++++++++++++++++++ .../space/service/DefaultSpaceService.java | 8 +++++ .../domain/space/service/SpaceService.java | 2 ++ 7 files changed, 87 insertions(+) diff --git a/src/main/java/com/tenten/linkhub/domain/space/controller/SpaceController.java b/src/main/java/com/tenten/linkhub/domain/space/controller/SpaceController.java index 2fad0ac7..4f9b4d5d 100644 --- a/src/main/java/com/tenten/linkhub/domain/space/controller/SpaceController.java +++ b/src/main/java/com/tenten/linkhub/domain/space/controller/SpaceController.java @@ -131,6 +131,34 @@ public ResponseEntity findPublicSpacesByQue return ResponseEntity.ok(apiResponses); } + /** + * 스페이스 검색(like 쿼리) API + */ + @Operation( + summary = "스페이스 검색 API(like 쿼리)", description = "keyWord, pageNumber, pageSize, sort, filter를 받아 검색합니다.(keyWord, sort, filter 조건 없이 사용 가능합니다.)\n\n" + + "sort: {created_at, updated_at, favorite_count, view_count}\n\n" + + "filter: {ENTER_ART, LIFE_KNOWHOW_SHOPPING, HOBBY_LEISURE_TRAVEL, KNOWLEDGE_ISSUE_CAREER, ETC}", + responses = { + @ApiResponse(responseCode = "200", description = "검색이 성공적으로 완료 되었습니다."), + }) + @GetMapping(value = "/search/like-query", + produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity findPublicSpacesByLikeQuery( + @ModelAttribute PublicSpacesFindByQueryApiRequest request + ) { + PageRequest pageRequest = PageRequest.of( + request.pageNumber(), + request.pageSize(), + StringUtils.hasText(request.sort()) ? Sort.by(request.sort()) : Sort.unsorted()); + + SpacesFindByQueryResponses responses = spaceService.findPublicSpacesByLikeQuery( + spaceMapper.toPublicSpacesFindByQueryRequest(request, pageRequest) + ); + + PublicSpacesFindByQueryApiResponses apiResponses = PublicSpacesFindByQueryApiResponses.from(responses); + return ResponseEntity.ok(apiResponses); + } + /** * 스페이스 생성 API */ diff --git a/src/main/java/com/tenten/linkhub/domain/space/repository/space/DefaultSpaceRepository.java b/src/main/java/com/tenten/linkhub/domain/space/repository/space/DefaultSpaceRepository.java index db361ee7..78467c91 100644 --- a/src/main/java/com/tenten/linkhub/domain/space/repository/space/DefaultSpaceRepository.java +++ b/src/main/java/com/tenten/linkhub/domain/space/repository/space/DefaultSpaceRepository.java @@ -65,4 +65,9 @@ public void increaseScrapCount(Long spaceId) { spaceJpaRepository.increaseScrapCount(spaceId); } + @Override + public Slice findPublicSpacesJoinSpaceImageByLikeQuery(QueryCondition queryCondition) { + return spaceQueryDslRepository.findPublicSpacesJoinSpaceImageByConditionWithLikeQuery(queryCondition); + } + } diff --git a/src/main/java/com/tenten/linkhub/domain/space/repository/space/SpaceRepository.java b/src/main/java/com/tenten/linkhub/domain/space/repository/space/SpaceRepository.java index 072a2b70..94c5242f 100644 --- a/src/main/java/com/tenten/linkhub/domain/space/repository/space/SpaceRepository.java +++ b/src/main/java/com/tenten/linkhub/domain/space/repository/space/SpaceRepository.java @@ -23,4 +23,6 @@ public interface SpaceRepository { void decreaseFavoriteCount(Long spaceId); void increaseScrapCount(Long spaceId); + + Slice findPublicSpacesJoinSpaceImageByLikeQuery(QueryCondition queryCondition); } diff --git a/src/main/java/com/tenten/linkhub/domain/space/repository/space/querydsl/DynamicQueryFactory.java b/src/main/java/com/tenten/linkhub/domain/space/repository/space/querydsl/DynamicQueryFactory.java index 7d588bd0..c0314377 100644 --- a/src/main/java/com/tenten/linkhub/domain/space/repository/space/querydsl/DynamicQueryFactory.java +++ b/src/main/java/com/tenten/linkhub/domain/space/repository/space/querydsl/DynamicQueryFactory.java @@ -54,6 +54,14 @@ public BooleanExpression eqSpaceName(String keyWord) { return null; } + public BooleanExpression eqSpaceNameWithLikeQuery(String keyWord) { + if (StringUtils.hasText(keyWord)) { + return space.spaceName.contains(keyWord); + } + + return null; + } + public BooleanExpression eqIsVisible(Boolean isSelfSpace) { if (isSelfSpace) { return null; diff --git a/src/main/java/com/tenten/linkhub/domain/space/repository/space/querydsl/SpaceQueryDslRepository.java b/src/main/java/com/tenten/linkhub/domain/space/repository/space/querydsl/SpaceQueryDslRepository.java index 2ff9fe6d..cf3b46a2 100644 --- a/src/main/java/com/tenten/linkhub/domain/space/repository/space/querydsl/SpaceQueryDslRepository.java +++ b/src/main/java/com/tenten/linkhub/domain/space/repository/space/querydsl/SpaceQueryDslRepository.java @@ -117,4 +117,38 @@ private static List getSpaceIds(List spaceAndOwnerN .toList(); } + public Slice findPublicSpacesJoinSpaceImageByConditionWithLikeQuery(QueryCondition condition) { + List spaceAndOwnerNickNames = queryFactory + .select(new QSpaceAndOwnerNickName( + space, + member.nickname + )) + .from(space) + .join(member).on(space.memberId.eq(member.id)) + .where(space.isDeleted.eq(false), + space.isVisible.eq(true), + dynamicQueryFactory.eqSpaceNameWithLikeQuery(condition.keyWord()), + dynamicQueryFactory.eqCategory(condition.filter()) + ) + .orderBy(dynamicQueryFactory.spaceSort(condition.pageable())) + .offset(condition.pageable().getOffset()) + .limit(condition.pageable().getPageSize() + 1) + .fetch(); + + List spaceIds = getSpaceIds(spaceAndOwnerNickNames); + + List spaceImages = findSpaceImagesBySpaceIds(spaceIds); + + SpaceAndSpaceImageOwnerNickNames spaceAndSpaceImageOwnerNickNames = SpaceAndSpaceImageOwnerNickNames.of(spaceAndOwnerNickNames, spaceImages); + + List contents = spaceAndSpaceImageOwnerNickNames.contents(); + boolean hasNext = false; + + if (contents.size() > condition.pageable().getPageSize()) { + contents.remove(condition.pageable().getPageSize()); + hasNext = true; + } + + return new SliceImpl<>(contents, condition.pageable(), hasNext); + } } diff --git a/src/main/java/com/tenten/linkhub/domain/space/service/DefaultSpaceService.java b/src/main/java/com/tenten/linkhub/domain/space/service/DefaultSpaceService.java index e273a263..35fd36f6 100644 --- a/src/main/java/com/tenten/linkhub/domain/space/service/DefaultSpaceService.java +++ b/src/main/java/com/tenten/linkhub/domain/space/service/DefaultSpaceService.java @@ -63,6 +63,14 @@ public SpacesFindByQueryResponses findPublicSpacesByQuery(PublicSpacesFindByQuer return SpacesFindByQueryResponses.from(spaceAndSpaceImageOwnerNickName); } + @Override + public SpacesFindByQueryResponses findPublicSpacesByLikeQuery(PublicSpacesFindByQueryRequest request) { + validateSearchKeWord(request.keyWord()); + Slice spaceAndSpaceImageOwnerNickName = spaceRepository.findPublicSpacesJoinSpaceImageByLikeQuery(mapper.toQueryCond(request)); + + return SpacesFindByQueryResponses.from(spaceAndSpaceImageOwnerNickName); + } + @Override @Transactional public Long createSpace(SpaceCreateRequest request) { diff --git a/src/main/java/com/tenten/linkhub/domain/space/service/SpaceService.java b/src/main/java/com/tenten/linkhub/domain/space/service/SpaceService.java index 51495c2c..863d7c53 100644 --- a/src/main/java/com/tenten/linkhub/domain/space/service/SpaceService.java +++ b/src/main/java/com/tenten/linkhub/domain/space/service/SpaceService.java @@ -15,6 +15,8 @@ public interface SpaceService { SpacesFindByQueryResponses findPublicSpacesByQuery(PublicSpacesFindByQueryRequest request); + SpacesFindByQueryResponses findPublicSpacesByLikeQuery(PublicSpacesFindByQueryRequest request); + Long createSpace(SpaceCreateRequest spaceCreateRequest); SpaceWithSpaceImageAndSpaceMemberInfo getSpaceWithSpaceImageAndSpaceMemberById(Long spaceId, Long memberId);