Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public CommentPageResponse<CommentResponse> getComments(Long postId, int page) {

Pageable pageable = PageRequest.of(
page - 1,
20,
10,
Sort.by(Sort.Direction.ASC, "createdDate")
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,16 @@
import com.back.web7_9_codecrete_be.global.rq.Rq;
import com.back.web7_9_codecrete_be.global.rsData.RsData;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/v1/join")
@RequiredArgsConstructor
Expand Down Expand Up @@ -73,4 +78,23 @@ public RsData<?> close(
joinPostService.close(postId, user.getId());
return RsData.success("구인글이 마감되었습니다.");
}

@Operation(summary = "구인글 검색", description = "제목 또는 내용에 키워드를 포함하고 있는 구인글을 검색합니다.")
@GetMapping("/search")
public RsData<List<JoinPostResponse>> search(
@Schema(description = """
<h3>검색어가 되는 Keyword입니다.</h3>
<hr/>
<b>?keyword={keyword}</b> 로 값을 넘기시면 됩니다.<br/>
제목 또는 내용에 해당 문자열을 포함하는 구인글을
페이징된 만큼 반환합니다.
""")
@RequestParam String keyword,
@Schema(description = "페이징 처리 또는 무한 스크롤 구현에 사용하는 Pageable 객체입니다.")
@Parameter(hidden = true) Pageable pageable
) {
return RsData.success(
joinPostService.searchByKeyword(keyword, pageable)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,17 @@
import com.back.web7_9_codecrete_be.global.rq.Rq;
import com.back.web7_9_codecrete_be.global.rsData.RsData;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/v1/reviews")
@RequiredArgsConstructor
Expand Down Expand Up @@ -86,4 +91,24 @@ public RsData<?> getReviewsByConcert(
reviewPostService.getReviewsByConcert(concertId)
);
}

@Operation(summary = "후기 게시글 검색", description = "제목 또는 내용에 키워드를 포함하고 있는 후기 게시글을 검색합니다.")
@GetMapping("/search")
public RsData<List<ReviewPostResponse>> search(
@Schema(description = """
<h3>검색어가 되는 Keyword입니다.</h3>
<hr/>
<b>?keyword={keyword}</b> 로 값을 넘기시면 됩니다.<br/>
제목 또는 내용에 해당 문자열을 포함하는
후기 게시글을 페이징된 만큼 반환합니다.
""")
@RequestParam String keyword,

@Schema(description = "페이징 처리 또는 무한 스크롤 구현에 사용하는 Pageable 객체입니다.")
@Parameter(hidden = true) Pageable pageable
) {
return RsData.success(
reviewPostService.searchByKeyword(keyword, pageable)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,29 @@
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface JoinPostRepository extends JpaRepository<JoinPost, Long> {
Page<JoinPost> findByPost_UserId(Long userId, Pageable pageable);

@Query("""
SELECT
jp
FROM
JoinPost jp
JOIN FETCH
jp.post p
WHERE
p.title LIKE %:keyword%
OR p.content LIKE %:keyword%
ORDER BY
p.createdDate DESC
""")
List<JoinPost> searchByKeyword(
@Param("keyword") String keyword,
Pageable pageable
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,29 @@
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface ReviewPostRepository extends JpaRepository<ReviewPost, Long> {
Page<ReviewPost> findByPost_UserId(Long userId, Pageable pageable);

@Query("""
SELECT
rp
FROM
ReviewPost rp
JOIN FETCH
rp.post p
WHERE
p.title LIKE %:keyword%
OR p.content LIKE %:keyword%
ORDER BY
p.createdDate DESC
""")
List<ReviewPost> searchByKeyword(
@Param("keyword") String keyword,
Pageable pageable
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,12 @@
import com.back.web7_9_codecrete_be.global.error.code.PostErrorCode;
import com.back.web7_9_codecrete_be.global.error.exception.BusinessException;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@RequiredArgsConstructor
public class JoinPostService {
Expand Down Expand Up @@ -117,4 +120,15 @@ public void close(Long postId, Long userId) {

joinPost.close(); // status = CLOSED
}

public List<JoinPostResponse> searchByKeyword(String keyword, Pageable pageable) {
if (keyword == null || keyword.isEmpty()) {
throw new BusinessException(PostErrorCode.KEYWORD_IS_NULL);
}

return joinPostRepository.searchByKeyword(keyword, pageable)
.stream()
.map(JoinPostResponse::from)
.toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.back.web7_9_codecrete_be.global.storage.ImageFileValidator;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
Expand Down Expand Up @@ -268,5 +269,23 @@ private ReviewItemResponse toReviewItem(ReviewPost reviewPost) {
.createdDate(reviewPost.getPost().getCreatedDate())
.build();
}

public List<ReviewPostResponse> searchByKeyword(String keyword, Pageable pageable) {
if (keyword == null || keyword.isBlank()) {
throw new BusinessException(PostErrorCode.KEYWORD_IS_NULL);
}

return reviewPostRepository.searchByKeyword(keyword, pageable)
.stream()
.map(reviewPost -> {
List<String> imageUrls = reviewPost.getImages()
.stream()
.map(ReviewImage::getImageUrl)
.toList();

return ReviewPostResponse.from(reviewPost, imageUrls);
})
.toList();
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,13 @@ public enum PostErrorCode implements ErrorCode {
HttpStatus.BAD_REQUEST,
"P-130",
"이미 삭제된 게시글입니다."
),

// 검색 관련
KEYWORD_IS_NULL(
HttpStatus.BAD_REQUEST,
"P-140",
"검색어는 필수입니다."
);

private final HttpStatus status;
Expand Down