From d7547a1028ab9a22d73956d149d62e98d8a1f417 Mon Sep 17 00:00:00 2001 From: "sungjin.choi" Date: Wed, 12 Aug 2026 10:56:41 +0900 Subject: [PATCH] =?UTF-8?q?chore=20:=20deploy=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ScrapedPostController.java | 15 +++++++++++++++ .../repository/ScrapedPostRepository.java | 4 ++++ .../scraper/ScrapedPostQueryService.java | 9 +++++++++ .../scraper/ScrapedPostResponse.java | 6 ++++-- 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/main/java/company/specialsource/controller/ScrapedPostController.java b/src/main/java/company/specialsource/controller/ScrapedPostController.java index a876368..42e7dcd 100644 --- a/src/main/java/company/specialsource/controller/ScrapedPostController.java +++ b/src/main/java/company/specialsource/controller/ScrapedPostController.java @@ -36,6 +36,21 @@ public class ScrapedPostController { return ResponseEntity.ok(posts); } + @GetMapping("/viewed") + public ResponseEntity getViewedPosts( + @RequestParam(required = false) String board, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "20") int size + ) { + if (board != null && !isValidBoardKey(board)) { + return ResponseEntity.badRequest().body("존재하지 않는 게시판 키입니다: " + board); + } + + Pageable pageable = PageRequest.of(page, Math.min(size, 100)); + Page posts = scrapedPostQueryService.getViewedPosts(board, pageable); + return ResponseEntity.ok(posts); + } + @GetMapping("/boards") public ResponseEntity> getBoards() { List boards = Arrays.stream(BoardSource.values()) diff --git a/src/main/java/company/specialsource/repository/ScrapedPostRepository.java b/src/main/java/company/specialsource/repository/ScrapedPostRepository.java index d45fcef..47f21a1 100644 --- a/src/main/java/company/specialsource/repository/ScrapedPostRepository.java +++ b/src/main/java/company/specialsource/repository/ScrapedPostRepository.java @@ -15,6 +15,10 @@ public interface ScrapedPostRepository extends JpaRepository Page findByViewedAtIsNullOrderByScrapedAtDesc(Pageable pageable); + Page findByBoardKeyAndViewedAtIsNotNullOrderByViewedAtDesc(String boardKey, Pageable pageable); + + Page findByViewedAtIsNotNullOrderByViewedAtDesc(Pageable pageable); + @Transactional long deleteByScrapedAtBefore(LocalDateTime cutoff); } diff --git a/src/main/java/company/specialsource/scraper/ScrapedPostQueryService.java b/src/main/java/company/specialsource/scraper/ScrapedPostQueryService.java index 47191e2..001c02d 100644 --- a/src/main/java/company/specialsource/scraper/ScrapedPostQueryService.java +++ b/src/main/java/company/specialsource/scraper/ScrapedPostQueryService.java @@ -26,6 +26,15 @@ public class ScrapedPostQueryService { return page.map(ScrapedPostResponse::from); } + public Page getViewedPosts(String boardKey, Pageable pageable) { + // 조회한(viewedAt != null) 글만 최근 읽은 순으로 보여준다. + Page page = (boardKey == null || boardKey.isBlank()) + ? scrapedPostRepository.findByViewedAtIsNotNullOrderByViewedAtDesc(pageable) + : scrapedPostRepository.findByBoardKeyAndViewedAtIsNotNullOrderByViewedAtDesc(boardKey, pageable); + + return page.map(ScrapedPostResponse::from); + } + @Transactional public void markViewed(Long id) { ScrapedPost post = scrapedPostRepository.findById(id) diff --git a/src/main/java/company/specialsource/scraper/ScrapedPostResponse.java b/src/main/java/company/specialsource/scraper/ScrapedPostResponse.java index 37a8c3e..89827f1 100644 --- a/src/main/java/company/specialsource/scraper/ScrapedPostResponse.java +++ b/src/main/java/company/specialsource/scraper/ScrapedPostResponse.java @@ -18,7 +18,8 @@ public record ScrapedPostResponse( Integer likeCount, String content, List imageUrls, - LocalDateTime scrapedAt + LocalDateTime scrapedAt, + LocalDateTime viewedAt ) { public static ScrapedPostResponse from(ScrapedPost post) { List imageUrls = (post.getImageUrls() == null || post.getImageUrls().isBlank()) @@ -38,7 +39,8 @@ public record ScrapedPostResponse( post.getLikeCount(), post.getContent(), imageUrls, - post.getScrapedAt() + post.getScrapedAt(), + post.getViewedAt() ); } }