diff --git a/src/main/java/com/movelog/domain/news/application/NewsService.java b/src/main/java/com/movelog/domain/news/application/NewsService.java index 3233444..aef9679 100644 --- a/src/main/java/com/movelog/domain/news/application/NewsService.java +++ b/src/main/java/com/movelog/domain/news/application/NewsService.java @@ -5,6 +5,7 @@ import com.movelog.domain.news.dto.request.CreateNewsReq; import com.movelog.domain.news.dto.request.NewsHeadLineReq; import com.movelog.domain.news.dto.response.HeadLineRes; +import com.movelog.domain.news.dto.response.RecentKeywordsRes; import com.movelog.domain.record.domain.Keyword; import com.movelog.domain.record.domain.VerbType; import com.movelog.domain.record.exception.KeywordNotFoundException; @@ -29,6 +30,7 @@ public class NewsService { private final HeadLineGeneratorService headLineGeneratorService; private final UserService userService; + private final UserRepository userRepository; private final KeywordRepository keywordRepository; private final NewsRepository newsRepository; private final S3Util s3Util; @@ -64,6 +66,20 @@ public void createNews(UserPrincipal userPrincipal, Long keywordId, CreateNewsRe } + public List getRecentKeywords(UserPrincipal userPrincipal) { + User user = validateUser(userPrincipal); + // id가 5인 유저 정보(테스트용) + // User user = userRepository.findById(5L).orElseThrow(UserNotFoundException::new); + List recentKeywords = keywordRepository.findTop5ByUserOrderByCreatedAtDesc(user); + + return recentKeywords.stream() + .map(keyword -> RecentKeywordsRes.builder() + .keywordId(keyword.getKeywordId()) + .verb(VerbType.getStringVerbType(keyword.getVerbType())) + .noun(keyword.getKeyword()) + .build()) + .toList(); + } // User 정보 검증 @@ -80,5 +96,4 @@ private Keyword validateKeyword(Long keywordId) { return keywordOptional.get(); } - } diff --git a/src/main/java/com/movelog/domain/news/dto/response/RecentKeywordsRes.java b/src/main/java/com/movelog/domain/news/dto/response/RecentKeywordsRes.java new file mode 100644 index 0000000..6a2f068 --- /dev/null +++ b/src/main/java/com/movelog/domain/news/dto/response/RecentKeywordsRes.java @@ -0,0 +1,23 @@ +package com.movelog.domain.news.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Getter +public class RecentKeywordsRes { + @Schema( type = "int", example ="1", description="키워드 ID") + private Long keywordId; + + @Schema( type = "String", example ="클라이밍", description="명사") + private String noun; + + @Schema( type = "String", example ="시작하다", description="동사") + private String verb; + +} diff --git a/src/main/java/com/movelog/domain/news/presentation/NewsController.java b/src/main/java/com/movelog/domain/news/presentation/NewsController.java index 3b0e599..8fa663e 100644 --- a/src/main/java/com/movelog/domain/news/presentation/NewsController.java +++ b/src/main/java/com/movelog/domain/news/presentation/NewsController.java @@ -4,6 +4,7 @@ import com.movelog.domain.news.dto.request.CreateNewsReq; import com.movelog.domain.news.dto.request.NewsHeadLineReq; import com.movelog.domain.news.dto.response.HeadLineRes; +import com.movelog.domain.news.dto.response.RecentKeywordsRes; import com.movelog.global.config.security.token.CurrentUser; import com.movelog.global.config.security.token.UserPrincipal; import com.movelog.global.payload.Message; @@ -72,6 +73,20 @@ public ResponseEntity createNews( } + @Operation(summary = "뉴스 추천 기록 조회 API", description = "뉴스 생성 시 최근 생성된 5개의 동사-명사 쌍 목록을 조회합니다. ") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "뉴스 추천 기록 조회 성공", + content = @Content(mediaType = "application/json", schema = @Schema(implementation = List.class))), + @ApiResponse(responseCode = "400", description = "뉴스 추천 기록 조회 실패", + content = @Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))) + }) + @GetMapping("/recommend") + public ResponseEntity getRecentKeywords( + @Parameter(description = "Access Token을 입력해주세요.", required = true) @AuthenticationPrincipal UserPrincipal userPrincipal + ) { + List response = newsService.getRecentKeywords(userPrincipal); + return ResponseEntity.ok(ApiResponseUtil.success(response)); + } diff --git a/src/main/java/com/movelog/domain/record/repository/KeywordRepository.java b/src/main/java/com/movelog/domain/record/repository/KeywordRepository.java index d4f5e6c..dc22690 100644 --- a/src/main/java/com/movelog/domain/record/repository/KeywordRepository.java +++ b/src/main/java/com/movelog/domain/record/repository/KeywordRepository.java @@ -11,4 +11,6 @@ @Repository public interface KeywordRepository extends JpaRepository { List findByUser(User user); + + List findTop5ByUserOrderByCreatedAtDesc(User user); }