Skip to content

Commit

Permalink
Merge pull request #166 from sharemindteam/feature/164-post-search
Browse files Browse the repository at this point in the history
feat: 공개 상담 검색 기능 구현
  • Loading branch information
aeyongdodam authored Mar 31, 2024
2 parents b23ec61 + 93d7cc1 commit 119a79f
Showing 14 changed files with 260 additions and 35 deletions.
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@
import com.example.sharemind.counselor.dto.request.CounselorUpdateProfileRequest;
import com.example.sharemind.counselor.dto.response.*;
import com.example.sharemind.customer.domain.Customer;
import com.example.sharemind.searchWord.dto.request.SearchWordFindRequest;
import com.example.sharemind.searchWord.dto.request.SearchWordCounselorFindRequest;

import com.example.sharemind.wishList.dto.request.WishListGetRequest;

@@ -31,7 +31,7 @@ public interface CounselorService {

List<Counselor> getEvaluationPendingConsults();

List<Counselor> getCounselorByWordWithPagination(SearchWordFindRequest searchWordFindRequest,
List<Counselor> getCounselorByWordWithPagination(SearchWordCounselorFindRequest searchWordCounselorFindRequest,
String sortType);

CounselorGetInfoResponse getCounselorMyInfo(Long customerId);
Original file line number Diff line number Diff line change
@@ -19,7 +19,7 @@
import com.example.sharemind.customer.domain.Customer;
import com.example.sharemind.global.content.ConsultCategory;
import com.example.sharemind.global.content.ConsultType;
import com.example.sharemind.searchWord.dto.request.SearchWordFindRequest;
import com.example.sharemind.searchWord.dto.request.SearchWordCounselorFindRequest;
import com.example.sharemind.wishList.application.WishListCounselorService;
import com.example.sharemind.wishList.domain.WishList;
import com.example.sharemind.wishList.dto.request.WishListGetRequest;
@@ -185,12 +185,13 @@ private List<Counselor> getCounselorByCategoryWithPagination(CounselorGetRequest
}

@Override
public List<Counselor> getCounselorByWordWithPagination(SearchWordFindRequest searchWordFindRequest,
String sortType) {
public List<Counselor> getCounselorByWordWithPagination(
SearchWordCounselorFindRequest searchWordCounselorFindRequest,
String sortType) {
String sortColumn = getCounselorSortColumn(sortType);
Pageable pageable = PageRequest.of(searchWordFindRequest.getIndex(), COUNSELOR_PAGE,
Pageable pageable = PageRequest.of(searchWordCounselorFindRequest.getIndex(), COUNSELOR_PAGE,
Sort.by(sortColumn).descending());
Page<Counselor> page = counselorRepository.findByWordAndLevelAndStatus(searchWordFindRequest.getWord(),
Page<Counselor> page = counselorRepository.findByWordAndLevelAndStatus(searchWordCounselorFindRequest.getWord(),
pageable);
return page.getContent();
}
Original file line number Diff line number Diff line change
@@ -52,7 +52,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
requests -> requests.requestMatchers("/error", "/swagger-ui/**", "/api-docs/**",
"/api/v1/auth/signUp", "/api/v1/auth/signIn", "/api/v1/auth/reissue",
"/api/v1/auth/find-id", "/api/v1/auth/find-password", "/api/v1/auth/recovery-email/**", "/api/v1/emails/**").permitAll()
.requestMatchers("/api/v1/counselors/all/**", "/api/v1/searchWords/results", "/api/v1/reviews/all/**").permitAll()
.requestMatchers("/api/v1/counselors/all/**", "/api/v1/searchWords/results/**", "/api/v1/reviews/all/**").permitAll()
.requestMatchers("/index.html", "/favicon.ico", "/chat/**", "/customer.html",
"/counselor.html").permitAll()
.requestMatchers(HttpMethod.GET, "/api/v1/posts/{postId}").permitAll()
Original file line number Diff line number Diff line change
@@ -5,6 +5,7 @@
import com.example.sharemind.post.dto.request.PostUpdateRequest;
import com.example.sharemind.post.dto.response.*;

import com.example.sharemind.searchWord.dto.request.SearchWordPostFindRequest;
import java.time.LocalDateTime;
import java.util.List;

@@ -36,4 +37,7 @@ List<PostGetListResponse> getPublicPostsByCustomer(Long postId, LocalDateTime fi
PostGetResponse getCounselorPostContent(Long postId, Long customerId);

Post checkAndGetCounselorPost(Long postId, Long customerId);

List<Post> getPostByWordWithPagination(SearchWordPostFindRequest searchWordPostFindRequest,
String sortType);
}
Original file line number Diff line number Diff line change
@@ -7,6 +7,7 @@
import com.example.sharemind.customer.application.CustomerService;
import com.example.sharemind.customer.domain.Customer;
import com.example.sharemind.global.content.ConsultCategory;
import com.example.sharemind.post.content.PostListSortType;
import com.example.sharemind.post.domain.Post;
import com.example.sharemind.post.dto.request.PostCreateRequest;
import com.example.sharemind.post.dto.request.PostUpdateRequest;
@@ -16,6 +17,7 @@
import com.example.sharemind.post.repository.PostRepository;
import com.example.sharemind.postLike.repository.PostLikeRepository;
import com.example.sharemind.postScrap.repository.PostScrapRepository;
import com.example.sharemind.searchWord.dto.request.SearchWordPostFindRequest;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
@@ -31,6 +33,7 @@
public class PostServiceImpl implements PostService {

private static final int POST_PAGE_SIZE = 4;
private static final int POST_PAGE_SEARCH_SIZE = 5;
private static final int POST_POPULARITY_SIZE = 3;
private static final int TOTAL_POSTS = 50;
private static final int POSTS_AFTER_24H_COUNT = TOTAL_POSTS / 3;
@@ -202,6 +205,19 @@ public Post checkAndGetCounselorPost(Long postId, Long customerId) {
return getProceedingPost(postId);
}

@Override
public List<Post> getPostByWordWithPagination(SearchWordPostFindRequest searchWordPostFindRequest,
String sortType) {
String sortColumn = getPostSortColumn(sortType);
if (searchWordPostFindRequest.getPostId() == 0) {
return postRepository.getFirstPostByWordWithSortType(searchWordPostFindRequest, sortColumn,
POST_PAGE_SEARCH_SIZE);
}
Post post = getPostByPostId(searchWordPostFindRequest.getPostId());
return postRepository.getPostByWordWithSortType(searchWordPostFindRequest, sortColumn, post,
POST_PAGE_SIZE);
}

private Boolean checkCounselorReadAuthority(Long postId, Long customerId) {
Post post = getPostByPostId(postId);

@@ -219,4 +235,9 @@ private Post getProceedingPost(Long postId) {
post.checkPostProceeding();
return post;
}

private String getPostSortColumn(String sortType) {
PostListSortType postListSortType = PostListSortType.getSortTypeByName(sortType);
return postListSortType.getSortColumn();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.example.sharemind.post.content;

import com.example.sharemind.post.exception.PostErrorCode;
import com.example.sharemind.post.exception.PostException;
import java.util.Arrays;
import lombok.Getter;

@Getter
public enum PostListSortType {

LATEST("publishedAt"),
DESC_TOTAL_COMMENT("totalComment"),
DESC_TOTAL_LIKE("totalLike");

private final String sortColumn;

PostListSortType(String sortColumn) {
this.sortColumn = sortColumn;
}

public static PostListSortType getSortTypeByName(String name) {
return Arrays.stream(PostListSortType.values())
.filter(sortType -> sortType.name().equalsIgnoreCase(name))
.findAny()
.orElseThrow(() -> new PostException(PostErrorCode.POST_SORT_TYPE_NOT_FOUND, name));
}
}
Original file line number Diff line number Diff line change
@@ -13,8 +13,8 @@ public enum PostErrorCode {
POST_MODIFY_DENIED(HttpStatus.FORBIDDEN, "일대다 상담 질문 작성 권한이 없습니다."),
POST_ALREADY_COMPLETED(HttpStatus.BAD_REQUEST, "이미 일대다 상담 질문이 최종 제출되었습니다."),
POST_NOT_PROCEEDING(HttpStatus.BAD_REQUEST, "진행중인 상담이 아닙니다."),
POST_ACCESS_DENIED(HttpStatus.FORBIDDEN, "일대다 상담 질문 접근 권한이 없습니다.");

POST_ACCESS_DENIED(HttpStatus.FORBIDDEN, "일대다 상담 질문 접근 권한이 없습니다."),
POST_SORT_TYPE_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 정렬 방식이 존재하지 않습니다.");
private final HttpStatus httpStatus;
private final String message;
}
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@

import com.example.sharemind.customer.domain.Customer;
import com.example.sharemind.post.domain.Post;
import com.example.sharemind.searchWord.dto.request.SearchWordPostFindRequest;
import java.time.LocalDateTime;
import java.util.List;

@@ -12,4 +13,10 @@ List<Post> findAllByCustomerAndIsActivatedIsTrue(Customer customer, Boolean filt

List<Post> findAllByIsPublicAndIsActivatedIsTrue(Long postId, LocalDateTime finishedAt,
int size);

List<Post> getPostByWordWithSortType(SearchWordPostFindRequest searchWordPostFindRequest,
String sortColumn, Post lastPost, int size);

List<Post> getFirstPostByWordWithSortType(SearchWordPostFindRequest searchWordPostFindRequest,
String sortColumn, int size);
}
Original file line number Diff line number Diff line change
@@ -4,6 +4,10 @@
import com.example.sharemind.post.content.PostStatus;
import com.example.sharemind.post.domain.Post;
import com.example.sharemind.post.domain.QPost;
import com.example.sharemind.post.exception.PostErrorCode;
import com.example.sharemind.post.exception.PostException;
import com.example.sharemind.searchWord.dto.request.SearchWordPostFindRequest;
import com.querydsl.core.types.OrderSpecifier;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.impl.JPAQueryFactory;
import java.time.LocalDateTime;
@@ -18,7 +22,7 @@ public class PostCustomRepositoryImpl implements PostCustomRepository {

@Override
public List<Post> findAllByCustomerAndIsActivatedIsTrue(Customer customer, Boolean filter,
Long postId, int size) {
Long postId, int size) {
return jpaQueryFactory
.selectFrom(post)
.where(
@@ -32,7 +36,7 @@ public List<Post> findAllByCustomerAndIsActivatedIsTrue(Customer customer, Boole

@Override
public List<Post> findAllByIsPublicAndIsActivatedIsTrue(Long postId, LocalDateTime finishedAt,
int size) {
int size) {
return jpaQueryFactory
.selectFrom(post)
.where(
@@ -43,6 +47,41 @@ public List<Post> findAllByIsPublicAndIsActivatedIsTrue(Long postId, LocalDateTi
).orderBy(post.finishedAt.desc(), post.postId.desc()).limit(size).fetch();
}

@Override
public List<Post> getFirstPostByWordWithSortType(SearchWordPostFindRequest searchWordPostFindRequest,
String sortColumn, int size) {
return jpaQueryFactory
.selectFrom(post)
.where(
post.isPublic.isTrue(),
post.isActivated.isTrue(),
post.postStatus.in(PostStatus.PROCEEDING, PostStatus.COMPLETED),
(post.title.contains(searchWordPostFindRequest.getWord())
.or(post.content.contains(searchWordPostFindRequest.getWord())))
)
.orderBy(getOrderSpecifier(sortColumn, post), post.postId.asc())
.limit(size)
.fetch();
}

@Override
public List<Post> getPostByWordWithSortType(SearchWordPostFindRequest searchWordPostFindRequest,
String sortColumn, Post lastPost, int size) {
return jpaQueryFactory
.selectFrom(post)
.where(
post.isPublic.isTrue(),
post.isActivated.isTrue(),
post.postStatus.in(PostStatus.PROCEEDING, PostStatus.COMPLETED),
(post.title.contains(searchWordPostFindRequest.getWord())
.or(post.content.contains(searchWordPostFindRequest.getWord()))),
getSortColumnCondition(post, sortColumn, lastPost)
)
.orderBy(getOrderSpecifier(sortColumn, post), post.postId.asc())
.limit(size)
.fetch();
}

private BooleanExpression postStatusIn(Boolean filter) {
return filter ? post.postStatus.in(PostStatus.WAITING, PostStatus.PROCEEDING,
PostStatus.REPORTED) : null;
@@ -56,4 +95,26 @@ private BooleanExpression lessThanFinishedAtAndPostId(Long postId, LocalDateTime
return postId != 0 ? post.finishedAt.lt(finishedAt)
.or(post.finishedAt.eq(finishedAt).and(post.postId.lt(postId))) : null;
}

private OrderSpecifier<?> getOrderSpecifier(String sortColumn, QPost post) {
return switch (sortColumn) {
case "publishedAt" -> post.publishedAt.desc();
case "totalComment" -> post.totalComment.desc();
case "totalLike" -> post.totalLike.desc();
default -> throw new PostException(PostErrorCode.POST_SORT_TYPE_NOT_FOUND, sortColumn);
};
}

private BooleanExpression getSortColumnCondition(QPost post, String sortColumn, Post lastPost) {
return switch (sortColumn) {
case "publishedAt" -> post.publishedAt.before(lastPost.getPublishedAt());
case "totalComment" -> post.totalComment.lt(lastPost.getTotalComment())
.or(post.totalComment.eq(lastPost.getTotalComment())
.and(post.postId.gt(lastPost.getPostId())));
case "totalLike" -> post.totalLike.lt(lastPost.getTotalLike())
.or(post.totalLike.eq(lastPost.getTotalLike())
.and(post.postId.gt(lastPost.getPostId())));
default -> throw new PostException(PostErrorCode.POST_SORT_TYPE_NOT_FOUND, sortColumn);
};
}
}
Original file line number Diff line number Diff line change
@@ -1,22 +1,30 @@
package com.example.sharemind.searchWord.application;

import com.example.sharemind.counselor.dto.response.CounselorGetListResponse;
import com.example.sharemind.post.dto.response.PostGetListResponse;
import com.example.sharemind.searchWord.dto.request.SearchWordDeleteRequest;
import com.example.sharemind.searchWord.dto.request.SearchWordFindRequest;
import com.example.sharemind.searchWord.dto.request.SearchWordCounselorFindRequest;

import com.example.sharemind.searchWord.dto.request.SearchWordPostFindRequest;
import java.util.List;

public interface SearchWordService {

List<CounselorGetListResponse> storeSearchWordAndGetCounselorsByCustomer(Long customerId, String sortType,
SearchWordFindRequest searchWordFindRequest);
SearchWordCounselorFindRequest searchWordCounselorFindRequest);

List<CounselorGetListResponse> storeAllSearchWordAndGetCounselors(String sortType,
SearchWordFindRequest searchWordFindRequest);
SearchWordCounselorFindRequest searchWordCounselorFindRequest);

List<String> getRecentSearchWordsByCustomer(Long customerId);

void removeSearchWordByCustomer(Long customerId, SearchWordDeleteRequest searchWordDeleteRequest);

void storeSearchWordInDB(String word);

List<PostGetListResponse> storeAllSearchWordAndGetPosts(String sortType,
SearchWordPostFindRequest searchWordPostFindRequest);

List<PostGetListResponse> storeSearchWordAndGetPosts(Long customerId, String sortType,
SearchWordPostFindRequest searchWordPostFindRequest);
}
Loading

0 comments on commit 119a79f

Please sign in to comment.