Skip to content

Commit b67a7aa

Browse files
authored
Merge pull request #27 from generation-it-gi/feat/search-article-#11
[Feature] 판매글 중 키워드 검색을 위한 API 구현 close #11
2 parents 83cf8bb + 77dcd83 commit b67a7aa

5 files changed

Lines changed: 60 additions & 0 deletions

File tree

src/main/java/kr/warmlink/application/article/dto/ArticleDto.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,34 @@ public static DetailResponse from(Article article, User user) {
8989
.build();
9090
}
9191
}
92+
93+
@Getter
94+
@Builder
95+
@AllArgsConstructor
96+
@Schema(name = "ArticleDto.SearchResponse", description = "검색 결과 반환을 위한 응답 DTO")
97+
public static class SearchResponse {
98+
@Schema(description = "게시글 id", example = "1")
99+
private Long id;
100+
101+
@Schema(description = "게시글 제목", example = "초상화 그려드립니다.")
102+
private String title;
103+
104+
@Schema(description = "작성자", example = "홍길동")
105+
private String name;
106+
107+
@Schema(description = "작성일", example = "2025-06-26")
108+
private LocalDateTime createdAt;
109+
110+
public static List<SearchResponse> from(List<Article> articles) {
111+
return articles.stream()
112+
.filter(article -> article.isDeleted() == false)
113+
.map(article -> SearchResponse.builder()
114+
.id(article.getId())
115+
.name(article.getUser().getName())
116+
.title(article.getTitle())
117+
.createdAt(article.getCreatedAt())
118+
.build())
119+
.collect(Collectors.toUnmodifiableList());
120+
}
121+
}
92122
}

src/main/java/kr/warmlink/domain/article/repository/ArticleRepository.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22

33
import kr.warmlink.domain.article.entity.Article;
44
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.data.jpa.repository.Query;
6+
import org.springframework.data.repository.query.Param;
7+
8+
import java.util.List;
59

610
public interface ArticleRepository extends JpaRepository<Article, Long> {
11+
@Query("SELECT a FROM article a WHERE a.title LIKE %:keyword%")
12+
List<Article> findByKeyword(@Param("keyword") String keyword);
13+
714
}

src/main/java/kr/warmlink/domain/article/service/ArticleService.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,14 @@ public ArticleDto.DetailResponse detail(HttpServletRequest request, Long id) {
9292

9393
return ArticleDto.DetailResponse.from(article, article.getUser());
9494
}
95+
96+
@Transactional
97+
public List<ArticleDto.SearchResponse> search(HttpServletRequest request, String keyword) {
98+
String accessToken = jwtProvider.resolveToken(request);
99+
String email = jwtProvider.getEmail(accessToken);
100+
101+
List<Article> result = articleRepository.findByKeyword(keyword);
102+
103+
return ArticleDto.SearchResponse.from(result);
104+
}
95105
}

src/main/java/kr/warmlink/presentation/api/ArticleApi.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.springframework.http.ResponseEntity;
1010
import org.springframework.web.bind.annotation.PathVariable;
1111
import org.springframework.web.bind.annotation.RequestBody;
12+
import org.springframework.web.bind.annotation.RequestParam;
1213

1314
@Tag(name = "[판매글 관련 API]", description = "사용자 판매글 관련 API")
1415
public interface ArticleApi {
@@ -47,4 +48,11 @@ public interface ArticleApi {
4748
})
4849
ResponseEntity<?> detail(HttpServletRequest request, @PathVariable Long id);
4950

51+
@Operation(summary = "판매글 키워드 검색", description = "특정 키워드를 검색했을 때, 게시글 목록 조회를 위한 API")
52+
@ApiResponses({
53+
@ApiResponse(responseCode = "200", description = "판매글 검색 성공"),
54+
@ApiResponse(responseCode = "400", description = "판매글 검색 실패")
55+
})
56+
ResponseEntity<?> searchKeyword(HttpServletRequest request, @RequestParam String keyword);
57+
5058
}

src/main/java/kr/warmlink/presentation/controller/ArticleController.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,9 @@ public ResponseEntity<?> detail(HttpServletRequest request, Long id) {
4949
return ResponseEntity.ok(articleService.detail(request, id));
5050
}
5151

52+
@Override
53+
@GetMapping("/search")
54+
public ResponseEntity<?> searchKeyword(HttpServletRequest request, String keyword) {
55+
return ResponseEntity.ok(articleService.search(request, keyword));
56+
}
5257
}

0 commit comments

Comments
 (0)