From 0317bd00f2e3fd30f27470bd0ab81eb19d0a5184 Mon Sep 17 00:00:00 2001 From: HyeonSeong Date: Thu, 19 Feb 2026 16:39:30 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20=ED=94=84=EB=A1=AC=ED=94=84=ED=8A=B8?= =?UTF-8?q?=20=EA=B2=80=EC=83=89=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../progbe/domain/category/dto/CategoryResponse.java | 5 +++++ .../domain/prompt/controller/PromptController.java | 12 ++++++++++++ .../domain/prompt/dto/PromptSummaryResponse.java | 10 ++++++++++ .../domain/prompt/repository/PromptRepository.java | 7 +++++++ .../progbe/domain/prompt/service/PromptService.java | 12 ++++++++++++ 5 files changed, 46 insertions(+) diff --git a/src/main/java/com/progbe/domain/category/dto/CategoryResponse.java b/src/main/java/com/progbe/domain/category/dto/CategoryResponse.java index b4b6f18..0cc7df1 100644 --- a/src/main/java/com/progbe/domain/category/dto/CategoryResponse.java +++ b/src/main/java/com/progbe/domain/category/dto/CategoryResponse.java @@ -1,9 +1,14 @@ package com.progbe.domain.category.dto; +import com.progbe.domain.category.entity.CategoryEntity; + public record CategoryResponse( Long categoryId, String name, String description ) { + public static CategoryResponse from(CategoryEntity category) { + return new CategoryResponse(category.getId(), category.getName(), category.getDescription()); + } } diff --git a/src/main/java/com/progbe/domain/prompt/controller/PromptController.java b/src/main/java/com/progbe/domain/prompt/controller/PromptController.java index 55b54a1..90e8b34 100644 --- a/src/main/java/com/progbe/domain/prompt/controller/PromptController.java +++ b/src/main/java/com/progbe/domain/prompt/controller/PromptController.java @@ -108,5 +108,17 @@ public ResponseEntity> deletePrompt( promptService.deletePrompt(promptId, userId); return ResponseEntity.ok(ApiResponse.success(null)); } + + /** + * 프롬프트 제목 기준 검색 API + * @param keyword + * @param pageable + * @return + */ + @GetMapping("/search/{keyword}") + public ApiResponse searchPrompts(@PathVariable("keyword") String keyword, Pageable pageable) { + PromptListResponse promptListResponse = promptService.searchPromptsByTitle(keyword, pageable); + return ApiResponse.success(promptListResponse); + } } diff --git a/src/main/java/com/progbe/domain/prompt/dto/PromptSummaryResponse.java b/src/main/java/com/progbe/domain/prompt/dto/PromptSummaryResponse.java index 294ef04..941ef1c 100644 --- a/src/main/java/com/progbe/domain/prompt/dto/PromptSummaryResponse.java +++ b/src/main/java/com/progbe/domain/prompt/dto/PromptSummaryResponse.java @@ -1,6 +1,7 @@ package com.progbe.domain.prompt.dto; import com.progbe.domain.category.dto.CategoryResponse; +import com.progbe.domain.prompt.entity.PromptEntity; import java.time.LocalDateTime; @@ -11,5 +12,14 @@ public record PromptSummaryResponse( LocalDateTime createdAt, LocalDateTime updatedAt ) { + public static PromptSummaryResponse of(PromptEntity promptEntity) { + return new PromptSummaryResponse( + promptEntity.getId(), + CategoryResponse.from(promptEntity.getCategory()), + promptEntity.getTitle(), + promptEntity.getCreatedAt(), + promptEntity.getUpdatedAt() + ); + } } diff --git a/src/main/java/com/progbe/domain/prompt/repository/PromptRepository.java b/src/main/java/com/progbe/domain/prompt/repository/PromptRepository.java index e158106..7d9505d 100644 --- a/src/main/java/com/progbe/domain/prompt/repository/PromptRepository.java +++ b/src/main/java/com/progbe/domain/prompt/repository/PromptRepository.java @@ -29,5 +29,12 @@ public interface PromptRepository extends JpaRepository { "WHERE p.user.id IN :userIds AND p.deletedAt IS NULL " + "GROUP BY p.user.id") List countByUserIdsGrouped(@Param("userIds") List userIds); + + @Query("SELECT p FROM PromptEntity p " + + "JOIN FETCH p.category " + + "WHERE p.title LIKE %:keyword% " + + "AND p.deletedAt IS NULL " + + "ORDER BY p.createdAt DESC") + Page findByTitleContaining(@Param("keyword") String keyword, Pageable pageable); } diff --git a/src/main/java/com/progbe/domain/prompt/service/PromptService.java b/src/main/java/com/progbe/domain/prompt/service/PromptService.java index f5bdfa0..d3e3e30 100644 --- a/src/main/java/com/progbe/domain/prompt/service/PromptService.java +++ b/src/main/java/com/progbe/domain/prompt/service/PromptService.java @@ -107,4 +107,16 @@ public void deletePrompt(Long promptId, Long userId) { prompt.delete(); promptRepository.save(prompt); } + + // 프롬프트 검색 로직 (#33) + public PromptListResponse searchPromptsByTitle(String keyword, Pageable pageable) { + Page searchResult = promptRepository.findByTitleContaining(keyword, pageable); + + return new PromptListResponse( + searchResult.getContent().stream() + .map(PromptSummaryResponse::of) + .toList(), + searchResult.getTotalElements() + ); + } }