11package hongik .triple .apimodule .application .analysis ;
22
3- import hongik .triple .commonmodule .dto .analysis .AnalysisData ;
4- import hongik .triple .commonmodule .dto .analysis .AnalysisRes ;
5- import hongik .triple .commonmodule .dto .analysis .NaverProductDto ;
6- import hongik .triple .commonmodule .dto .analysis .YoutubeVideoDto ;
3+ import hongik .triple .commonmodule .dto .analysis .*;
74import hongik .triple .commonmodule .enumerate .AcneType ;
85import hongik .triple .domainmodule .domain .analysis .Analysis ;
96import hongik .triple .domainmodule .domain .analysis .repository .AnalysisRepository ;
107import hongik .triple .domainmodule .domain .member .Member ;
118import hongik .triple .inframodule .ai .AIClient ;
129import hongik .triple .inframodule .naver .NaverClient ;
10+ import hongik .triple .inframodule .s3 .S3Client ;
1311import hongik .triple .inframodule .youtube .YoutubeClient ;
1412import lombok .RequiredArgsConstructor ;
1513import org .springframework .data .domain .Page ;
@@ -29,6 +27,7 @@ public class AnalysisService {
2927 private final YoutubeClient youtubeClient ;
3028 private final NaverClient naverClient ;
3129 private final AnalysisRepository analysisRepository ;
30+ private final S3Client s3Client ;
3231
3332 @ Transactional
3433 public AnalysisRes performAnalysis (Member member , MultipartFile multipartFile ) {
@@ -38,7 +37,7 @@ public AnalysisRes performAnalysis(Member member, MultipartFile multipartFile) {
3837 }
3938
4039 // Business Logic
41- // TODO: S3 파일 업로드
40+ String s3_key = s3Client . uploadImage ( multipartFile , "skin" );
4241
4342 // 피부 분석 AI 모델 호출
4443 AnalysisData analysisData = aiClient .sendPredictRequest (multipartFile );
@@ -55,7 +54,7 @@ public AnalysisRes performAnalysis(Member member, MultipartFile multipartFile) {
5554 Analysis analysis = Analysis .builder ()
5655 .member (member )
5756 .acneType (analysisData .labelToSkinType ())
58- .imageUrl ("S3 URL or other storage URL" )
57+ .imageUrl (s3_key )
5958 .isPublic (true )
6059 .videoData (videoList )
6160 .productData (productList )
@@ -65,7 +64,7 @@ public AnalysisRes performAnalysis(Member member, MultipartFile multipartFile) {
6564 // Response
6665 return new AnalysisRes (
6766 saveAnalysis .getAnalysisId (),
68- saveAnalysis .getImageUrl (),
67+ s3Client . getImage ( saveAnalysis .getImageUrl () ),
6968 saveAnalysis .getIsPublic (),
7069 AcneType .valueOf (saveAnalysis .getAcneType ()).name (),
7170 AcneType .valueOf (saveAnalysis .getAcneType ()).getDescription (),
@@ -88,7 +87,7 @@ public AnalysisRes getAnalysisDetail(Member member, Long analysisId) {
8887 // Response
8988 return new AnalysisRes (
9089 analysis .getAnalysisId (),
91- analysis .getImageUrl (),
90+ s3Client . getImage ( analysis .getImageUrl () ),
9291 analysis .getIsPublic (),
9392 AcneType .valueOf (analysis .getAcneType ()).name (),
9493 AcneType .valueOf (analysis .getAcneType ()).getDescription (),
@@ -99,14 +98,18 @@ public AnalysisRes getAnalysisDetail(Member member, Long analysisId) {
9998 );
10099 }
101100
102- public List < AnalysisRes > getAnalysisListForMainPage () {
101+ public MainLogRes getAnalysisListForMainPage () {
103102 // Business Logic
104- List <Analysis > analyses = analysisRepository .findTop3ByOrderByCreatedAtDesc ();
103+ List <Analysis > analyses = analysisRepository .findTop3ByIsPublicTrueOrderByCreatedAtDesc ();
104+ int comedones = analysisRepository .countByAcneTypeAndIsPublicTrue ("COMEDONES" );
105+ int pustules = analysisRepository .countByAcneTypeAndIsPublicTrue ("PUSTULES" );
106+ int papules = analysisRepository .countByAcneTypeAndIsPublicTrue ("PAPULES" );
107+ int follicultis = analysisRepository .countByAcneTypeAndIsPublicTrue ("FOLLICULITIS" );
105108
106109 // Response
107- return analyses .stream ().map (analysis -> new AnalysisRes (
110+ List < AnalysisRes > analysisList = analyses .stream ().map (analysis -> new AnalysisRes (
108111 analysis .getAnalysisId (),
109- analysis .getImageUrl (),
112+ s3Client . getImage ( analysis .getImageUrl () ),
110113 analysis .getIsPublic (),
111114 AcneType .valueOf (analysis .getAcneType ()).name (),
112115 AcneType .valueOf (analysis .getAcneType ()).getDescription (),
@@ -115,6 +118,8 @@ public List<AnalysisRes> getAnalysisListForMainPage() {
115118 analysis .getVideoData (),
116119 analysis .getProductData ()
117120 )).toList ();
121+
122+ return MainLogRes .from (comedones , pustules , papules , follicultis , analysisList );
118123 }
119124
120125 /**
@@ -148,7 +153,7 @@ public Page<AnalysisRes> getAnalysisPaginationForLogPage(String acneType, Pageab
148153 // Response
149154 return analysisPage .map (analysis -> new AnalysisRes (
150155 analysis .getAnalysisId (),
151- analysis .getImageUrl (),
156+ s3Client . getImage ( analysis .getImageUrl () ),
152157 analysis .getIsPublic (),
153158 AcneType .valueOf (analysis .getAcneType ()).name (),
154159 AcneType .valueOf (analysis .getAcneType ()).getDescription (),
@@ -195,7 +200,7 @@ public Page<AnalysisRes> getAnalysisListForMyPage(Member member, String acneType
195200 // Response
196201 return analysisPage .map (analysis -> new AnalysisRes (
197202 analysis .getAnalysisId (),
198- analysis .getImageUrl (),
203+ s3Client . getImage ( analysis .getImageUrl () ),
199204 analysis .getIsPublic (),
200205 AcneType .valueOf (analysis .getAcneType ()).name (),
201206 AcneType .valueOf (analysis .getAcneType ()).getDescription (),
@@ -205,4 +210,26 @@ public Page<AnalysisRes> getAnalysisListForMyPage(Member member, String acneType
205210 analysis .getProductData ()
206211 ));
207212 }
213+
214+ /*
215+ 피플즈 로그 개별 화면 조회
216+ */
217+ public AnalysisRes getLogDetail (Long analysisId ) {
218+ // Validation
219+ Analysis analysis = analysisRepository .findById (analysisId )
220+ .orElseThrow (() -> new IllegalArgumentException ("Analysis not found with id: " + analysisId ));
221+
222+ // Response
223+ return new AnalysisRes (
224+ analysis .getAnalysisId (),
225+ s3Client .getImage (analysis .getImageUrl ()),
226+ analysis .getIsPublic (),
227+ AcneType .valueOf (analysis .getAcneType ()).name (),
228+ AcneType .valueOf (analysis .getAcneType ()).getDescription (),
229+ AcneType .valueOf (analysis .getAcneType ()).getCareMethod (),
230+ AcneType .valueOf (analysis .getAcneType ()).getGuide (),
231+ analysis .getVideoData (),
232+ analysis .getProductData ()
233+ );
234+ }
208235}
0 commit comments