Skip to content

Commit a73c731

Browse files
committed
feat/OPS-390: NEWS API 수정 추가 사항 반영.
1 parent d8dbf57 commit a73c731

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed

src/main/java/org/tuna/zoopzoop/backend/domain/news/controller/ApiV1NewsController.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public class ApiV1NewsController {
2626
private final NewsAPIService newsSearchService;
2727
private final NewsService newsService;
2828

29+
2930
/**
3031
* 최신 뉴스 목록을 조회하는 API
3132
* 한번에 100개를 조회 합니다.
@@ -98,4 +99,33 @@ public Mono<ResponseEntity<RsData<ResBodyForNaverNews>>> searchNewsByRecommends(
9899
response
99100
)));
100101
}
102+
103+
/**
104+
* 공유 아카이브의 폴더 내부의 자료를 기반으로 키워드를 추천해서 검색하는 뉴스 API
105+
* HTTP METHOD: GET
106+
* 한번에 100개를 조회 합니다.
107+
* @param userDetails 로그인한 사용자
108+
* @param spaceId 대상 스페이스 id
109+
* @param folderId 대상 폴더 id
110+
*/
111+
@GetMapping("/recommends/shared/{spaceId}/{folderId}")
112+
@Operation(summary = "개인 아카이브 뉴스 추천")
113+
public Mono<ResponseEntity<RsData<ResBodyForNaverNews>>> searchNewsByRecommends(
114+
@AuthenticationPrincipal CustomUserDetails userDetails,
115+
@PathVariable Integer spaceId,
116+
@PathVariable Integer folderId
117+
) {
118+
Member member = userDetails.getMember();
119+
List<String> frequency = newsService.getTagFrequencyFromFilesInSharing(spaceId, member.getId(), folderId);
120+
String query = String.join(" ", frequency);
121+
122+
return newsSearchService.searchNews(query, "sim")
123+
.map(response -> ResponseEntity
124+
.status(HttpStatus.OK)
125+
.body(new RsData<>(
126+
"200",
127+
"키워드 기반 뉴스 목록을 조회했습니다.",
128+
response
129+
)));
130+
}
101131
}

src/main/java/org/tuna/zoopzoop/backend/domain/news/service/NewsService.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
import org.tuna.zoopzoop.backend.domain.archive.folder.service.PersonalArchiveFolderService;
66
import org.tuna.zoopzoop.backend.domain.datasource.dto.FileSummary;
77
import org.tuna.zoopzoop.backend.domain.datasource.dto.FolderFilesDto;
8+
import org.tuna.zoopzoop.backend.domain.member.entity.Member;
9+
import org.tuna.zoopzoop.backend.domain.member.service.MemberService;
10+
import org.tuna.zoopzoop.backend.domain.space.archive.service.SpaceArchiveFolderService;
811

912
import java.util.Comparator;
1013
import java.util.List;
@@ -15,6 +18,8 @@
1518
@RequiredArgsConstructor
1619
public class NewsService {
1720
private final PersonalArchiveFolderService folderService;
21+
private final SpaceArchiveFolderService spaceArchiveFolderService;
22+
private final MemberService memberService;
1823

1924
public List<String> getTagFrequencyFromFiles(Integer memberId, Integer folderId) {
2025
FolderFilesDto folderFilesDto = folderService.getFilesInFolder(memberId, folderId);
@@ -39,4 +44,29 @@ public List<String> getTagFrequencyFromFiles(Integer memberId, Integer folderId)
3944

4045
return frequency;
4146
}
47+
48+
public List<String> getTagFrequencyFromFilesInSharing(Integer spaceId, Integer memberId, Integer folderId) {
49+
Member member = memberService.findById(memberId);
50+
FolderFilesDto folderFilesDto = spaceArchiveFolderService.getFilesInFolder(spaceId, member, folderId);
51+
52+
List<FileSummary> files = folderFilesDto.files();
53+
54+
Map<String, Long> tags = files.stream()
55+
.flatMap(file -> {
56+
List<String> ts = file.tags();
57+
return (ts == null ? List.<String>of() : ts).stream();
58+
})
59+
.collect(Collectors.groupingBy(
60+
tagName -> tagName,
61+
Collectors.counting()
62+
));
63+
64+
List<String> frequency = tags.entrySet().stream()
65+
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
66+
.limit(3)
67+
.map(Map.Entry::getKey)
68+
.toList();
69+
70+
return frequency;
71+
}
4272
}

0 commit comments

Comments
 (0)