From 8bdccb2e9323f41b080bb132616fac563c7da7b1 Mon Sep 17 00:00:00 2001 From: Santoragi32 Date: Mon, 28 Apr 2025 16:06:09 +0900 Subject: [PATCH] =?UTF-8?q?[#72]Feat:=20Flask=20=EC=9A=94=EC=B2=AD=20?= =?UTF-8?q?=EC=8B=9C=20Level=20=EC=A0=84=EB=8B=AC=20=EC=B6=94=EA=B0=80,=20?= =?UTF-8?q?Flask=20=EC=9D=91=EB=8B=B5=EC=9C=BC=EB=A1=9C=20score=EC=A0=90?= =?UTF-8?q?=EC=88=98=20=EB=B0=9B=EA=B8=B0=20=EB=B0=8F=20=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/enums/PoseScore.java | 2 +- .../repository/UserSportsRepository.java | 2 ++ .../AnalyzeCommandServiceImpl.java | 34 +++++++++++-------- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/main/java/capstone/SportyUp/SportyUp_Server/domain/enums/PoseScore.java b/src/main/java/capstone/SportyUp/SportyUp_Server/domain/enums/PoseScore.java index 774ec4a..0e90dd5 100644 --- a/src/main/java/capstone/SportyUp/SportyUp_Server/domain/enums/PoseScore.java +++ b/src/main/java/capstone/SportyUp/SportyUp_Server/domain/enums/PoseScore.java @@ -1,5 +1,5 @@ package capstone.SportyUp.SportyUp_Server.domain.enums; public enum PoseScore { - BAD, GOOD, EXCELLENT + BAD, COMMON, GOOD, EXCELLENT } diff --git a/src/main/java/capstone/SportyUp/SportyUp_Server/repository/UserSportsRepository.java b/src/main/java/capstone/SportyUp/SportyUp_Server/repository/UserSportsRepository.java index d00d2ac..2423a1e 100644 --- a/src/main/java/capstone/SportyUp/SportyUp_Server/repository/UserSportsRepository.java +++ b/src/main/java/capstone/SportyUp/SportyUp_Server/repository/UserSportsRepository.java @@ -1,5 +1,6 @@ package capstone.SportyUp.SportyUp_Server.repository; +import capstone.SportyUp.SportyUp_Server.domain.Sports; import capstone.SportyUp.SportyUp_Server.domain.User; import capstone.SportyUp.SportyUp_Server.domain.UserSports; import org.springframework.data.jpa.repository.JpaRepository; @@ -8,4 +9,5 @@ public interface UserSportsRepository extends JpaRepository { Optional findTop1ByUser(User user); + UserSports findTop1ByUserAndSports(User user, Sports sports); } diff --git a/src/main/java/capstone/SportyUp/SportyUp_Server/service/AnalyzeService/AnalyzeCommandServiceImpl.java b/src/main/java/capstone/SportyUp/SportyUp_Server/service/AnalyzeService/AnalyzeCommandServiceImpl.java index cb2f15d..ea96500 100644 --- a/src/main/java/capstone/SportyUp/SportyUp_Server/service/AnalyzeService/AnalyzeCommandServiceImpl.java +++ b/src/main/java/capstone/SportyUp/SportyUp_Server/service/AnalyzeService/AnalyzeCommandServiceImpl.java @@ -5,14 +5,12 @@ import capstone.SportyUp.SportyUp_Server.apiPayload.code.status.ErrorStatus; import capstone.SportyUp.SportyUp_Server.aws.s3.S3Uploader; import capstone.SportyUp.SportyUp_Server.converter.AnalyzeConverter; -import capstone.SportyUp.SportyUp_Server.domain.AnalyzeEntity; -import capstone.SportyUp.SportyUp_Server.domain.Game; -import capstone.SportyUp.SportyUp_Server.domain.Sports; -import capstone.SportyUp.SportyUp_Server.domain.User; +import capstone.SportyUp.SportyUp_Server.domain.*; import capstone.SportyUp.SportyUp_Server.domain.enums.PoseScore; import capstone.SportyUp.SportyUp_Server.repository.AnalyzeRepository; import capstone.SportyUp.SportyUp_Server.repository.GameRepository; import capstone.SportyUp.SportyUp_Server.repository.UserRepository; +import capstone.SportyUp.SportyUp_Server.repository.UserSportsRepository; import capstone.SportyUp.SportyUp_Server.web.DTO.AnalyzeDTO.AnalyzeRequestDTO; import capstone.SportyUp.SportyUp_Server.web.DTO.AnalyzeDTO.AnalyzeResponseDTO; import lombok.RequiredArgsConstructor; @@ -37,6 +35,7 @@ public class AnalyzeCommandServiceImpl implements AnalyzeCommandService { private final GameRepository gameRepository; private final AnalyzeRepository analyzeRepository; private final UserRepository userRepository; + private final UserSportsRepository userSportsRepository; @Value("${flask}") private String FLASK_SERVER_URL; // Flask 서버 URL (예시: http://localhost:5000) @@ -54,6 +53,7 @@ public AnalyzeResponseDTO.AnalyzeResultDTO requestAnalyze(Long userId, Long game //분석할 영상이 속한 게임 찾기 Game game = gameRepository.findById(gameId).orElseThrow(()->new GameHandler(ErrorStatus.GAME_NOT_FOUND)); Sports sports = game.getSports(); + UserSports userSports = userSportsRepository.findTop1ByUserAndSports(user,sports); //영상찾기 MultipartFile uploadedFile = request.getFile(); @@ -73,24 +73,27 @@ public AnalyzeResponseDTO.AnalyzeResultDTO requestAnalyze(Long userId, Long game } catch (IOException e){ throw new RuntimeException("S3 업로드 실패", e); } + String userLevel = userSports.getLevel().toString(); //Flask 요청 - Map flaskResponse = processFileWithFlask(sports,uploadedVideoUrl,analyzedKey); + Map flaskResponse = processFileWithFlask(sports,uploadedVideoUrl,analyzedKey,userLevel); //Flask 응답 String videoUrl = (String) flaskResponse.get("video_url"); String recommendPose = (String) flaskResponse.get("recommend"); String goodPoint = (String) flaskResponse.get("good"); String badPoint = (String) flaskResponse.get("bad"); - Double score = ((Number) flaskResponse.get("score")).doubleValue(); + PoseScore poseScore = PoseScore.valueOf(flaskResponse.get("grade").toString()); + Integer score = ((Number) flaskResponse.get("score")).intValue(); - PoseScore poseScore = evaluateScore(score.intValue()); +// PoseScore poseScore = evaluateScore(score.intValue()); //AnalyzeEntity 저장 AnalyzeEntity newAnalyzeEntity = AnalyzeEntity.builder() .user(user) .game(game) .videoUrl(videoUrl) + .score(score) .poseScore(poseScore) .goodPoint(goodPoint) .badPoint(badPoint) @@ -103,12 +106,13 @@ public AnalyzeResponseDTO.AnalyzeResultDTO requestAnalyze(Long userId, Long game } - private Map sendFileToFlask(String videoUrl, String analyzedKey) throws IOException { + private Map sendFileToFlask(String videoUrl, String analyzedKey, String userLevel) throws IOException { RestTemplate restTemplate = new RestTemplate(); // Flask 서버에 보낼 파일 설정 MultiValueMap body = new LinkedMultiValueMap<>(); body.add("video_url", videoUrl); + body.add("user_level", userLevel); body.add("analyzed_key", analyzedKey); // HTTP 요청 헤더 설정 @@ -149,10 +153,10 @@ private Map sendFileToFlask(String videoUrl, String analyzedKey) // } // } - private Map processFileWithFlask(Sports sports, String videoUrl, String analyzedKey) { + private Map processFileWithFlask(Sports sports, String videoUrl, String analyzedKey, String userLevel) { if ("볼링".equals(sports.getName())) { try { - return sendFileToFlask(videoUrl, analyzedKey); + return sendFileToFlask(videoUrl, analyzedKey, userLevel); } catch (IOException e) { throw new RuntimeException("Flask 처리 실패", e); } @@ -168,9 +172,9 @@ private Map processFileWithFlask(Sports sports, String videoUrl, ); } - private PoseScore evaluateScore(int score) { - if (score <= 33) return PoseScore.BAD; - if (score <= 66) return PoseScore.GOOD; - return PoseScore.EXCELLENT; - } +// private PoseScore evaluateScore(int score) { +// if (score <= 33) return PoseScore.BAD; +// if (score <= 66) return PoseScore.GOOD; +// return PoseScore.EXCELLENT; +// } }