Skip to content

Commit e468e18

Browse files
authored
Merge pull request #30 from studio-recoding/feat-main-api
[🚀feat] [⚠️!HOTFIX] 한줄 추천 기능 생성 및 JWT 에러 처리시 모든 에러 catch하는 것 수정
2 parents 9d9a843 + 09ce6d1 commit e468e18

File tree

9 files changed

+150
-22
lines changed

9 files changed

+150
-22
lines changed

src/main/java/Ness/Backend/domain/auth/jwt/JwtAuthorizationFilter.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,17 +64,12 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
6464
chain.doFilter(request, response);
6565

6666
} catch (TokenExpiredException e){
67-
log.error("EXPIRED_TOKEN");
68-
request.setAttribute("exception", ErrorCode.EXPIRED_TOKEN.getCode());
67+
log.error(e + " EXPIRED_TOKEN");
68+
//request.setAttribute("exception", ErrorCode.EXPIRED_TOKEN.getCode());
6969
setResponse(response, ErrorCode.EXPIRED_TOKEN);
7070
} catch (SignatureVerificationException e){
71-
log.error("INVALID_TOKEN_SIGNATURE");
72-
request.setAttribute("exception", ErrorCode.INVALID_TOKEN_SIGNATURE.getCode());
71+
log.error(e + " INVALID_TOKEN_SIGNATURE");
7372
setResponse(response, ErrorCode.INVALID_TOKEN_SIGNATURE);
74-
} catch (Exception e){
75-
log.error("TOKEN_EXCEPTION");
76-
request.setAttribute("exception", ErrorCode.TOKEN_ERROR.getCode());
77-
setResponse(response, ErrorCode.TOKEN_ERROR);
7873
}
7974
}
8075
}

src/main/java/Ness/Backend/domain/chat/ChatService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,12 @@ public String parseAiChat(String text){
7979

8080
public String postNewAiChat(Long id, String text){
8181

82-
PostFastApiUserChatDto Userdto = PostFastApiUserChatDto.builder()
82+
PostFastApiUserChatDto userDto = PostFastApiUserChatDto.builder()
8383
.message(text)
8484
.build();
8585

8686
//Fast API에 전송하기
87-
PostFastApiAiChatDto AiDto = fastApiChatApi.creatFastApiChat(Userdto);
87+
PostFastApiAiChatDto AiDto = fastApiChatApi.creatFastApiChat(userDto);
8888

8989
return AiDto.getAnswer();
9090
}

src/main/java/Ness/Backend/domain/report/ReportController.java

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

33
import Ness.Backend.domain.member.entity.Member;
44
import Ness.Backend.domain.report.dto.response.GetReportMemoryListDto;
5+
import Ness.Backend.domain.report.dto.response.GetReportRecommendDto;
56
import Ness.Backend.domain.report.dto.response.GetReportTagListDto;
67
import Ness.Backend.global.auth.AuthUser;
78
import io.swagger.v3.oas.annotations.Operation;
@@ -30,8 +31,8 @@ public GetReportTagListDto getTag() {
3031

3132
@GetMapping("/recommend/dev")
3233
@Operation(summary = "개발 테스트용 한줄 추천 조회 API", description = "사용자의 ID로 한줄 추천을 조회하는 API 입니다.")
33-
public GetReportTagListDto getRecommend() {
34-
return reportService.getTag(1L);
34+
public GetReportRecommendDto getRecommend() {
35+
return reportService.getRecommend(1L);
3536
}
3637

3738
@GetMapping("/memory")
@@ -48,8 +49,8 @@ public GetReportTagListDto getTag(@AuthUser Member member) {
4849

4950
@GetMapping("/recommend")
5051
@Operation(summary = "한줄 추천 조회 API", description = "사용자의 ID로 한줄 추천을 조회하는 API 입니다.")
51-
public GetReportTagListDto getRecommend(@AuthUser Member member) {
52-
return reportService.getTag(member.getId());
52+
public GetReportRecommendDto getRecommend(@AuthUser Member member) {
53+
return reportService.getRecommend(member.getId());
5354
}
5455

5556
}
Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,23 @@
11
package Ness.Backend.domain.report;
22

3+
import Ness.Backend.domain.chat.entity.Chat;
34
import Ness.Backend.domain.report.entity.ReportRecommend;
45
import org.springframework.data.jpa.repository.JpaRepository;
6+
import org.springframework.data.jpa.repository.Query;
7+
import org.springframework.data.repository.query.Param;
58

69
import java.time.ZonedDateTime;
10+
import java.util.List;
711

812
public interface ReportRecommendRepository extends JpaRepository<ReportRecommend, Long> {
9-
ReportRecommend findReportRecommendByMember_IdAndCreatedDateBetween(Long id, ZonedDateTime startOfDay, ZonedDateTime now);
13+
// 특정 맴버의 오늘 하루 생성된 데이터만 반환
14+
@Query( value = "SELECT * FROM report_recommend " +
15+
"WHERE member_id = :memberId " +
16+
"AND DATE(created_date) = CURDATE() " +
17+
"ORDER BY created_date ASC",
18+
nativeQuery = true)
19+
ReportRecommend findTodayReportRecommendByMember_Id(
20+
@Param("memberId") Long memberId);
21+
22+
//ReportRecommend findReportRecommendByMember_IdAndCreatedDateBetween(Long id, ZonedDateTime startOfDay, ZonedDateTime now);
1023
}

src/main/java/Ness/Backend/domain/report/ReportService.java

Lines changed: 55 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
package Ness.Backend.domain.report;
22

3+
import Ness.Backend.domain.chat.dto.request.PostFastApiUserChatDto;
4+
import Ness.Backend.domain.chat.dto.response.PostFastApiAiChatDto;
5+
import Ness.Backend.domain.member.MemberRepository;
6+
import Ness.Backend.domain.member.entity.Member;
7+
import Ness.Backend.domain.report.dto.request.PostFastApiUserRecommendDto;
38
import Ness.Backend.domain.report.dto.response.*;
49
import Ness.Backend.domain.report.entity.ReportMemory;
510
import Ness.Backend.domain.report.entity.ReportRecommend;
611
import Ness.Backend.domain.report.entity.ReportTag;
12+
import Ness.Backend.global.fastApi.FastApiRecommendApi;
713
import lombok.RequiredArgsConstructor;
814
import lombok.extern.slf4j.Slf4j;
915
import org.springframework.stereotype.Service;
@@ -21,6 +27,8 @@ public class ReportService {
2127
private final ReportMemoryRepository reportMemoryRepository;
2228
private final ReportTagRepository reportTagRepository;
2329
private final ReportRecommendRepository reportRecommendRepository;
30+
private final FastApiRecommendApi fastApiRecommendApi;
31+
private final MemberRepository memberRepository;
2432

2533
public GetReportMemoryListDto getMemory(Long id){
2634
// 2주치의 데이터 가져오기
@@ -65,15 +73,55 @@ public GetReportTagListDto getTag(Long id){
6573
public GetReportRecommendDto getRecommend(Long id){
6674
// 이번 달의 데이터 가져오기
6775
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));
68-
ZonedDateTime startOfToday = now.toLocalDate().atStartOfDay(now.getZone());
69-
ZonedDateTime endOfToday = now.toLocalDate().atTime(LocalTime.MAX).atZone(now.getZone());
76+
ZonedDateTime today = now.toLocalDate().atStartOfDay(now.getZone());
7077

71-
ReportRecommend reportRecommend = reportRecommendRepository.findReportRecommendByMember_IdAndCreatedDateBetween(id, startOfToday, endOfToday);
78+
ReportRecommend reportRecommend = reportRecommendRepository.findTodayReportRecommendByMember_Id(id);
7279

73-
return GetReportRecommendDto.builder()
74-
.id(reportRecommend.getId())
75-
.createdDate(reportRecommend.getCreatedDate().toString())
76-
.recommendText(reportRecommend.getRecommendText())
80+
if(reportRecommend == null){
81+
//새로운 한 줄 추천 생성하기
82+
String answer = postNewAiRecommend(id, today);
83+
String parsedAnswer = parseAiRecommend(answer);
84+
85+
Member memberEntity = memberRepository.findMemberById(id);
86+
87+
ReportRecommend newRecommend = ReportRecommend.builder()
88+
.createdDate(today)
89+
.recommendText(answer)
90+
.member(memberEntity)
91+
.build();
92+
93+
//새롭게 생성된 한 줄 추천 저장하기
94+
reportRecommendRepository.save(newRecommend);
95+
96+
return GetReportRecommendDto.builder()
97+
.id(newRecommend.getId())
98+
.createdDate(newRecommend.getCreatedDate().toString())
99+
.recommendText(newRecommend.getRecommendText())
100+
.build();
101+
} else{
102+
return GetReportRecommendDto.builder()
103+
.id(reportRecommend.getId())
104+
.createdDate(reportRecommend.getCreatedDate().toString())
105+
.recommendText(reportRecommend.getRecommendText())
106+
.build();
107+
}
108+
}
109+
110+
public String parseAiRecommend(String text){
111+
return text.replace("\"", "");
112+
}
113+
114+
public String postNewAiRecommend(Long id, ZonedDateTime today){
115+
PostFastApiUserRecommendDto userDto = PostFastApiUserRecommendDto.builder()
116+
.member_id(id.intValue())
117+
.user_persona("")
118+
.schedule_datetime_start(today)
119+
.schedule_datetime_end(today)
77120
.build();
121+
122+
//Fast API에 전송하기
123+
PostFastApiAiRecommendDto AiDto = fastApiRecommendApi.creatFastApiRecommend(userDto);
124+
125+
return AiDto.getAnswer();
78126
}
79127
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package Ness.Backend.domain.report.dto.request;
2+
3+
import com.fasterxml.jackson.annotation.JsonFormat;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
10+
import java.time.ZonedDateTime;
11+
12+
@Data
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
@Builder
16+
public class PostFastApiUserRecommendDto {
17+
@JsonProperty("member_id")
18+
private int member_id;
19+
20+
@JsonProperty("user_persona")
21+
private String user_persona;
22+
23+
@JsonProperty("schedule_datetime_start")
24+
@JsonFormat(shape = JsonFormat.Shape.STRING)
25+
private ZonedDateTime schedule_datetime_start;
26+
27+
@JsonProperty("schedule_datetime_end")
28+
@JsonFormat(shape = JsonFormat.Shape.STRING)
29+
private ZonedDateTime schedule_datetime_end;
30+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package Ness.Backend.domain.report.dto.response;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Data;
7+
import lombok.NoArgsConstructor;
8+
9+
10+
@Data
11+
@NoArgsConstructor
12+
@AllArgsConstructor
13+
@Builder
14+
public class PostFastApiAiRecommendDto {
15+
@JsonProperty("ness")
16+
private String answer;
17+
}

src/main/java/Ness/Backend/domain/report/entity/ReportRecommend.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@
22

33
import Ness.Backend.domain.member.entity.Member;
44
import jakarta.persistence.*;
5+
import lombok.Builder;
56
import lombok.Data;
7+
import lombok.NoArgsConstructor;
68

79
import java.time.ZonedDateTime;
810

911
@Entity
1012
@Data
13+
@NoArgsConstructor
1114
public class ReportRecommend {
1215
@Id
1316
@GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -20,4 +23,11 @@ public class ReportRecommend {
2023
@ManyToOne
2124
@JoinColumn(name = "member_id")
2225
private Member member;
26+
27+
@Builder
28+
public ReportRecommend(ZonedDateTime createdDate, String recommendText, Member member) {
29+
this.createdDate = createdDate;
30+
this.recommendText = recommendText;
31+
this.member = member;
32+
}
2333
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package Ness.Backend.global.fastApi;
2+
3+
4+
import Ness.Backend.domain.report.dto.request.PostFastApiUserRecommendDto;
5+
import Ness.Backend.domain.report.dto.response.PostFastApiAiRecommendDto;
6+
import org.springframework.cloud.openfeign.FeignClient;
7+
import org.springframework.web.bind.annotation.PostMapping;
8+
@FeignClient(
9+
name = "FastApiRecommend",
10+
url = "${spring.cloud.openfeign.client.config.fastapi.url}")
11+
public interface FastApiRecommendApi {
12+
@PostMapping(value = "/recommendation/main")
13+
PostFastApiAiRecommendDto creatFastApiRecommend(PostFastApiUserRecommendDto postFastApiUserRecommendDto);
14+
}

0 commit comments

Comments
 (0)