Skip to content

Commit

Permalink
[Feat]: 스페이스 검색 시 like쿼리랑 비교하기 위한 엔드포인트 추가.
Browse files Browse the repository at this point in the history
  • Loading branch information
young970 committed Jan 15, 2024
1 parent ade240a commit 1c74022
Show file tree
Hide file tree
Showing 7 changed files with 87 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,34 @@ public ResponseEntity<PublicSpacesFindByQueryApiResponses> 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<PublicSpacesFindByQueryApiResponses> 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
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,9 @@ public void increaseScrapCount(Long spaceId) {
spaceJpaRepository.increaseScrapCount(spaceId);
}

@Override
public Slice<SpaceAndSpaceImageOwnerNickName> findPublicSpacesJoinSpaceImageByLikeQuery(QueryCondition queryCondition) {
return spaceQueryDslRepository.findPublicSpacesJoinSpaceImageByConditionWithLikeQuery(queryCondition);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,6 @@ public interface SpaceRepository {
void decreaseFavoriteCount(Long spaceId);

void increaseScrapCount(Long spaceId);

Slice<SpaceAndSpaceImageOwnerNickName> findPublicSpacesJoinSpaceImageByLikeQuery(QueryCondition queryCondition);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,4 +117,38 @@ private static List<Long> getSpaceIds(List<SpaceAndOwnerNickName> spaceAndOwnerN
.toList();
}

public Slice<SpaceAndSpaceImageOwnerNickName> findPublicSpacesJoinSpaceImageByConditionWithLikeQuery(QueryCondition condition) {
List<SpaceAndOwnerNickName> 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<Long> spaceIds = getSpaceIds(spaceAndOwnerNickNames);

List<SpaceImage> spaceImages = findSpaceImagesBySpaceIds(spaceIds);

SpaceAndSpaceImageOwnerNickNames spaceAndSpaceImageOwnerNickNames = SpaceAndSpaceImageOwnerNickNames.of(spaceAndOwnerNickNames, spaceImages);

List<SpaceAndSpaceImageOwnerNickName> 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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,14 @@ public SpacesFindByQueryResponses findPublicSpacesByQuery(PublicSpacesFindByQuer
return SpacesFindByQueryResponses.from(spaceAndSpaceImageOwnerNickName);
}

@Override
public SpacesFindByQueryResponses findPublicSpacesByLikeQuery(PublicSpacesFindByQueryRequest request) {
validateSearchKeWord(request.keyWord());
Slice<SpaceAndSpaceImageOwnerNickName> spaceAndSpaceImageOwnerNickName = spaceRepository.findPublicSpacesJoinSpaceImageByLikeQuery(mapper.toQueryCond(request));

return SpacesFindByQueryResponses.from(spaceAndSpaceImageOwnerNickName);
}

@Override
@Transactional
public Long createSpace(SpaceCreateRequest request) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 1c74022

Please sign in to comment.