Skip to content

Commit c44ee80

Browse files
committed
[FEAT] 사용자 기록 내용 기반 헤드라인 생성 기능 구현
1 parent 6321c19 commit c44ee80

File tree

4 files changed

+129
-0
lines changed

4 files changed

+129
-0
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.movelog.domain.news.application;
2+
3+
import com.movelog.domain.news.dto.request.NewsHeadLineReq;
4+
import com.movelog.domain.news.dto.response.HeadLineRes;
5+
import com.movelog.domain.user.application.UserService;
6+
import com.movelog.domain.user.domain.User;
7+
import com.movelog.domain.user.domain.repository.UserRepository;
8+
import com.movelog.domain.user.exception.UserNotFoundException;
9+
import com.movelog.global.DefaultAssert;
10+
import com.movelog.global.config.security.token.UserPrincipal;
11+
import lombok.RequiredArgsConstructor;
12+
import org.springframework.http.ResponseEntity;
13+
import org.springframework.stereotype.Service;
14+
import org.springframework.transaction.annotation.Transactional;
15+
16+
import java.util.List;
17+
import java.util.Optional;
18+
19+
@Service
20+
@RequiredArgsConstructor
21+
@Transactional(readOnly = true)
22+
public class NewsService {
23+
private final HeadlineGeneratorService headlineGeneratorService;
24+
private final UserService userService;
25+
private final UserRepository userRepository;
26+
27+
public List<HeadLineRes> createHeadLine(UserPrincipal userPrincipal, NewsHeadLineReq newsHeadLineReq) {
28+
User user = validateUser(userPrincipal);
29+
// id가 5인 유저 정보(테스트용)
30+
// User user = userRepository.findById(5L).orElseThrow(UserNotFoundException::new);
31+
String option = newsHeadLineReq.getOption();
32+
String verb = newsHeadLineReq.getVerb();
33+
String noun = newsHeadLineReq.getNoun();
34+
return headlineGeneratorService.generateHeadLine(option, verb, noun);
35+
}
36+
37+
38+
private User validateUser(UserPrincipal userPrincipal) {
39+
Optional<User> userOptional = userService.findById(userPrincipal.getId());
40+
DefaultAssert.isOptionalPresent(userOptional);
41+
return userOptional.get();
42+
}
43+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.movelog.domain.news.dto.request;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
@Builder
10+
@AllArgsConstructor
11+
@NoArgsConstructor
12+
@Getter
13+
public class NewsHeadLineReq {
14+
@Schema( type = "String", example ="첫 도전, 오랜만에 다시, 꾸준히 이어온 기록, 끊어낸 습관 중 택 1", description="뉴스 헤드라인 고정 옵션입니다.")
15+
private String option;
16+
17+
@Schema( type = "String", example ="했어요, 먹었어요, 갔어요 중 택 1", description="사용자가 선택한 동사 정보입니다.")
18+
private String verb;
19+
20+
@Schema( type = "String", example ="클라이밍", description="사용자가 선택한 명사 정보입니다.")
21+
private String noun;
22+
23+
24+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.movelog.domain.news.dto.response;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
@Builder
10+
@AllArgsConstructor
11+
@NoArgsConstructor
12+
@Getter
13+
public class HeadLineRes {
14+
@Schema( type = "String", example ="5년 만의 첫 도전, 무엇이 그를 움직이게 했나?", description="뉴스 헤드라인 추천 내용입니다.")
15+
private String headLine;
16+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.movelog.domain.news.presentation;
2+
3+
import com.movelog.domain.news.application.NewsService;
4+
import com.movelog.domain.news.dto.request.NewsHeadLineReq;
5+
import com.movelog.domain.news.dto.response.HeadLineRes;
6+
import com.movelog.global.config.security.token.CurrentUser;
7+
import com.movelog.global.config.security.token.UserPrincipal;
8+
import io.swagger.v3.oas.annotations.Operation;
9+
import io.swagger.v3.oas.annotations.Parameter;
10+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
11+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
12+
import io.swagger.v3.oas.annotations.tags.Tag;
13+
import lombok.RequiredArgsConstructor;
14+
import lombok.extern.slf4j.Slf4j;
15+
import org.springframework.web.bind.annotation.PostMapping;
16+
import org.springframework.web.bind.annotation.RequestBody;
17+
import org.springframework.web.bind.annotation.RequestMapping;
18+
import org.springframework.web.bind.annotation.RestController;
19+
20+
import java.util.List;
21+
22+
@Slf4j
23+
@RestController
24+
@RequiredArgsConstructor
25+
@RequestMapping("/api/v1/news")
26+
@Tag(name = "News", description = "뉴스 관련 API입니다.")
27+
public class NewsController {
28+
29+
private final NewsService newsService;
30+
31+
@Operation(summary = "뉴스 헤드라인 생성 API", description = "뉴스 헤드라인을 생성하는 API입니다.")
32+
@ApiResponses(value = {
33+
@ApiResponse(responseCode = "200", description = "뉴스 헤드라인 생성 성공"),
34+
@ApiResponse(responseCode = "400", description = "뉴스 헤드라인 생성 실패")
35+
})
36+
@PostMapping("/headline")
37+
public List<HeadLineRes> createHeadLine(
38+
@Parameter(description = "Access Token을 입력해주세요.", required = true) @CurrentUser UserPrincipal userPrincipal,
39+
@Parameter(description = "뉴스 헤드라인 생성 요청", required = true) @RequestBody NewsHeadLineReq newsHeadLineReq
40+
) {
41+
return newsService.createHeadLine(userPrincipal, newsHeadLineReq);
42+
}
43+
44+
45+
46+
}

0 commit comments

Comments
 (0)