From e91d665932c96c305b317d89a117003064703928 Mon Sep 17 00:00:00 2001 From: hzee97 Date: Sun, 11 Aug 2024 07:33:20 +0900 Subject: [PATCH 1/4] =?UTF-8?q?:sparkles:=20[Feat]=20=EB=A7=A4=EB=84=88?= =?UTF-8?q?=EC=A0=90=EC=88=98=20=EC=82=B0=EC=A0=95=20=EB=B0=8F=20=EB=A7=A4?= =?UTF-8?q?=EB=84=88=EB=A0=88=EB=B2=A8=20=EA=B2=B0=EC=A0=95,=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gamegoo/domain/member/Member.java | 4 + .../manner/MannerRatingRepository.java | 4 + .../gamegoo/service/manner/MannerService.java | 112 ++++++++++++++++++ 3 files changed, 120 insertions(+) diff --git a/src/main/java/com/gamegoo/domain/member/Member.java b/src/main/java/com/gamegoo/domain/member/Member.java index 93babca1..affb0bf1 100644 --- a/src/main/java/com/gamegoo/domain/member/Member.java +++ b/src/main/java/com/gamegoo/domain/member/Member.java @@ -149,5 +149,9 @@ public void updatePassword(String password) { public void updateRefreshToken(String refreshToken) { this.refreshToken = refreshToken; } + + public void setMannerLevel(int mannerLevel) { + this.mannerLevel = mannerLevel; + } } diff --git a/src/main/java/com/gamegoo/repository/manner/MannerRatingRepository.java b/src/main/java/com/gamegoo/repository/manner/MannerRatingRepository.java index b7934c1a..dddc4db1 100644 --- a/src/main/java/com/gamegoo/repository/manner/MannerRatingRepository.java +++ b/src/main/java/com/gamegoo/repository/manner/MannerRatingRepository.java @@ -2,9 +2,13 @@ import com.gamegoo.domain.manner.MannerRating; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; public interface MannerRatingRepository extends JpaRepository { + List findByToMemberId(Long toMember); List findByFromMemberIdAndToMemberId(Long fromMember, Long toMember); + } diff --git a/src/main/java/com/gamegoo/service/manner/MannerService.java b/src/main/java/com/gamegoo/service/manner/MannerService.java index 52f85d2a..6cf4090c 100644 --- a/src/main/java/com/gamegoo/service/manner/MannerService.java +++ b/src/main/java/com/gamegoo/service/manner/MannerService.java @@ -32,6 +32,7 @@ public class MannerService { private final MannerRatingKeywordRepository mannerRatingKeywordRepository; private final MannerKeywordRepository mannerKeywordRepository; + // 매너평가 등록 public MannerRating insertManner(MannerRequest.mannerInsertDTO request, Long memberId) { Member member = memberRepository.findById(memberId).orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND)); @@ -84,9 +85,23 @@ public MannerRating insertManner(MannerRequest.mannerInsertDTO request, Long mem mannerRatingKeyword.setMannerRating(saveManner); mannerRatingKeywordRepository.save(mannerRatingKeyword); }); + + // 매너점수 산정. + int mannerScore = updateMannerScore(targetMember); + + // 매너레벨 결정. + int mannerLevel = mannerLevel(mannerScore); + + // 매너레벨 반영. + targetMember.setMannerLevel(mannerLevel); + + // db 저장. + memberRepository.save(targetMember); + return saveManner; } + // 비매너평가 등록 public MannerRating insertBadManner(MannerRequest.mannerInsertDTO request, Long memberId) { Member member = memberRepository.findById(memberId).orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND)); @@ -139,6 +154,19 @@ public MannerRating insertBadManner(MannerRequest.mannerInsertDTO request, Long mannerRatingKeyword.setMannerRating(saveManner); mannerRatingKeywordRepository.save(mannerRatingKeyword); }); + + // 매너점수 산정. + int mannerScore = updateMannerScore(targetMember); + + // 매너레벨 결정. + int mannerLevel = mannerLevel(mannerScore); + + // 매너레벨 반영. + targetMember.setMannerLevel(mannerLevel); + + // db 저장. + memberRepository.save(targetMember); + return saveManner; } @@ -148,6 +176,8 @@ public MannerRating update(MannerRequest.mannerUpdateDTO request, Long memberId, MannerRating mannerRating = mannerRatingRepository.findById(mannerId).orElseThrow(() -> new MannerHandler(ErrorStatus.MANNER_NOT_FOUND)); + Member targetMember = memberRepository.findById(mannerRating.getToMember().getId()).orElseThrow(() -> new MemberHandler(ErrorStatus.MANNER_TARGET_MEMBER_NOT_FOUND)); + // 매너평가 작성자가 맞는지 검증. if (!mannerRating.getFromMember().getId().equals(memberId)) { throw new MannerHandler(ErrorStatus.MANNER_UNAUTHORIZED); @@ -201,6 +231,19 @@ public MannerRating update(MannerRequest.mannerUpdateDTO request, Long memberId, mannerRatingKeyword.setMannerKeyword(mannerKeyword); } } + + // 매너점수 산정. + int mannerScore = updateMannerScore(targetMember); + + // 매너레벨 결정. + int mannerLevel = mannerLevel(mannerScore); + + // 매너레벨 반영. + targetMember.setMannerLevel(mannerLevel); + + // db 저장. + memberRepository.save(targetMember); + return mannerRatingRepository.save(mannerRating); } @@ -252,9 +295,78 @@ public MannerRating update(MannerRequest.mannerUpdateDTO request, Long memberId, mannerRatingKeyword.setMannerKeyword(mannerKeyword); } } + + // 매너점수 산정. + int mannerScore = updateMannerScore(targetMember); + + // 매너레벨 결정. + int mannerLevel = mannerLevel(mannerScore); + + // 매너레벨 반영. + targetMember.setMannerLevel(mannerLevel); + + // db 저장. + memberRepository.save(targetMember); + return mannerRatingRepository.save(mannerRating); } + } + + // 매너점수를 산정하고 업데이트. + public int updateMannerScore(Member targetMember){ + + // 매너평가 ID 조회 + List mannerRatings = mannerRatingRepository.findByToMemberId(targetMember.getId()); + + int totalCount; + + // 매너 평가 + 비매너 평가를 처음 받은 회원 + if (mannerRatings.size()==1){ + if (mannerRatings.get(0).getIsPositive()) { + totalCount = mannerRatings.get(0).getMannerRatingKeywordList().stream() + .map(mannerRatingKeyword -> mannerRatingKeyword.getMannerKeyword().getId()) + .collect(Collectors.toList()).size(); + } else { + totalCount = (mannerRatings.get(0).getMannerRatingKeywordList().stream() + .map(mannerRatingKeyword -> mannerRatingKeyword.getMannerKeyword().getId()) + .collect(Collectors.toList()).size())*-2; + } + } else { + List positiveMannerKeywordIds = mannerRatings.stream() + .filter(MannerRating::getIsPositive) + .flatMap(mannerRating -> mannerRating.getMannerRatingKeywordList().stream()) + .map(mannerRatingKeyword -> mannerRatingKeyword.getMannerKeyword().getId()) + .collect(Collectors.toList()); + int positiveCount = positiveMannerKeywordIds.size(); + + List negativeMannerKeywordIds = mannerRatings.stream() + .filter(mannerRating -> !mannerRating.getIsPositive()) + .flatMap(mannerRating -> mannerRating.getMannerRatingKeywordList().stream()) + .map(mannerRatingKeyword -> mannerRatingKeyword.getMannerKeyword().getId()) + .collect(Collectors.toList()); + + int negativeCount = negativeMannerKeywordIds.size(); + + totalCount = positiveCount + (negativeCount*-2); + } + + return totalCount; + } + + // 매너레벨 결정 + public int mannerLevel(int mannerCount){ + if (mannerCount < 10) { + return 1; + } else if (mannerCount < 20) { + return 2; + } else if (mannerCount < 30) { + return 3; + } else if (mannerCount < 40) { + return 4; + } else { + return 5; + } } // 매너평가 조회 From d0b60859db08167420c5d7f33f4b10c3cab4c3ba Mon Sep 17 00:00:00 2001 From: hzee97 Date: Sun, 11 Aug 2024 18:29:34 +0900 Subject: [PATCH 2/4] =?UTF-8?q?:sparkles:=20[Feat]=20=EB=82=B4=EA=B0=80=20?= =?UTF-8?q?=EB=B0=9B=EC=9D=80=20=EB=A7=A4=EB=84=88=20=ED=8F=89=EA=B0=80=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/mannner/MannerController.java | 10 +++ .../gamegoo/dto/manner/MannerResponse.java | 19 +++++ .../gamegoo/service/manner/MannerService.java | 77 ++++++++++++++++++- 3 files changed, 102 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gamegoo/controller/mannner/MannerController.java b/src/main/java/com/gamegoo/controller/mannner/MannerController.java index 565804de..19282c02 100644 --- a/src/main/java/com/gamegoo/controller/mannner/MannerController.java +++ b/src/main/java/com/gamegoo/controller/mannner/MannerController.java @@ -117,4 +117,14 @@ public ApiResponse getBadMannerKeywo return ApiResponse.onSuccess(result); } + + @GetMapping() + public ApiResponse getMyManner(){ + + Long memberId = JWTUtil.getCurrentUserId(); + + MannerResponse.myMannerResponseDTO result = mannerService.getMyManner(memberId); + + return ApiResponse.onSuccess(result); + } } diff --git a/src/main/java/com/gamegoo/dto/manner/MannerResponse.java b/src/main/java/com/gamegoo/dto/manner/MannerResponse.java index a5ed5ca1..9249d08e 100644 --- a/src/main/java/com/gamegoo/dto/manner/MannerResponse.java +++ b/src/main/java/com/gamegoo/dto/manner/MannerResponse.java @@ -40,4 +40,23 @@ public static class mannerKeywordResponseDTO{ public static class badMannerKeywordResponseDTO{ List mannerRatingKeywordList; } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class myMannerResponseDTO{ + Integer mannerLevel; + List mannerKeywords; + } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class mannerKeywordDTO{ + Boolean isPositive; + Integer mannerKeywordId; + Integer count; + } } diff --git a/src/main/java/com/gamegoo/service/manner/MannerService.java b/src/main/java/com/gamegoo/service/manner/MannerService.java index 6cf4090c..a45da930 100644 --- a/src/main/java/com/gamegoo/service/manner/MannerService.java +++ b/src/main/java/com/gamegoo/service/manner/MannerService.java @@ -17,10 +17,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; @Service @@ -433,4 +430,76 @@ public MannerResponse.badMannerKeywordResponseDTO getBadMannerKeyword(Long membe .mannerRatingKeywordList(badMannerKeywordIds) .build(); } + + // 내가 받은 매너 평가 조회 + @Transactional(readOnly = true) + public MannerResponse.myMannerResponseDTO getMyManner(Long memberId){ + + Member member = memberRepository.findById(memberId).orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND)); + + // 매너평가 ID 조회 + List mannerRatings = mannerRatingRepository.findByToMemberId(member.getId()); + + // 매너키워드 조회 + List positiveMannerRatings = mannerRatings.stream() + .filter(MannerRating::getIsPositive) + .collect(Collectors.toList()); + + // 각 매너키워드(1~6) 별 count 집계 + List mannerKeywordIds = new ArrayList<>(); + + for (MannerRating positiveRating : positiveMannerRatings) { + List mannerRatingKeywords = positiveRating.getMannerRatingKeywordList(); + for (MannerRatingKeyword mannerRatingKeyword : mannerRatingKeywords) { + mannerKeywordIds.add(mannerRatingKeyword.getMannerKeyword().getId()); + } + } + + Map mannerKeywordCountMap = new HashMap<>(); + for (long i = 1; i <= 6; i++) { + mannerKeywordCountMap.put((int) i, 0); // 초기화 + } + for (Long keywordId : mannerKeywordIds) { + mannerKeywordCountMap.put(keywordId.intValue(), mannerKeywordCountMap.getOrDefault(keywordId.intValue(), 0) + 1); + } + + // 비매너키워드 조회 + List negativeMannerRatings = mannerRatings.stream() + .filter(mannerRating -> !mannerRating.getIsPositive()) + .collect(Collectors.toList()); + + // 각 비매너키워드(7~12) 별 count 집계 + List badMannerKeywordIds = new ArrayList<>(); + + for (MannerRating negativeRating : negativeMannerRatings) { + List badMannerRatingKeywords = negativeRating.getMannerRatingKeywordList(); + for (MannerRatingKeyword badMannerRatingKeyword : badMannerRatingKeywords) { + badMannerKeywordIds.add(badMannerRatingKeyword.getMannerKeyword().getId()); + } + } + + Map badMannerKeywordCountMap = new HashMap<>(); + for (long i = 7; i <= 12; i++) { + badMannerKeywordCountMap.put((int) i, 0); // 초기화 + } + for (Long keywordId : badMannerKeywordIds) { + badMannerKeywordCountMap.put(keywordId.intValue(), badMannerKeywordCountMap.getOrDefault(keywordId.intValue(), 0) + 1); + } + + // 매너 키워드 DTO 생성 + List mannerKeywordDTOs = new ArrayList<>(); + for (int i = 1; i <= 6; i++) { + int count = mannerKeywordCountMap.getOrDefault(i, 0); + mannerKeywordDTOs.add(new MannerResponse.mannerKeywordDTO(true, i, count)); + } + + // 비매너 키워드 DTO 생성 + for (int i = 7; i <= 12; i++) { + int count = badMannerKeywordCountMap.getOrDefault(i, 0); + mannerKeywordDTOs.add(new MannerResponse.mannerKeywordDTO(false, i, count)); + } + + Integer mannerLevel = member.getMannerLevel(); + return new MannerResponse.myMannerResponseDTO(mannerLevel, mannerKeywordDTOs); + } } From 5108697d985d59328c8b6872f65deee7d4bd0138 Mon Sep 17 00:00:00 2001 From: hzee97 Date: Sun, 11 Aug 2024 18:36:15 +0900 Subject: [PATCH 3/4] =?UTF-8?q?:memo:=20[Docs]=20=EB=82=B4=EA=B0=80=20?= =?UTF-8?q?=EB=B0=9B=EC=9D=80=20=EB=A7=A4=EB=84=88=20=ED=8F=89=EA=B0=80=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20API=20Swagger=20=EB=AA=85=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gamegoo/controller/mannner/MannerController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/gamegoo/controller/mannner/MannerController.java b/src/main/java/com/gamegoo/controller/mannner/MannerController.java index 19282c02..7c976616 100644 --- a/src/main/java/com/gamegoo/controller/mannner/MannerController.java +++ b/src/main/java/com/gamegoo/controller/mannner/MannerController.java @@ -119,6 +119,7 @@ public ApiResponse getBadMannerKeywo } @GetMapping() + @Operation(summary = "내가 받은 매너 평가 조회 API", description = "회원의 매너레벨과 회원이 받은 매너 평가를 조회하는 API 입니다.") public ApiResponse getMyManner(){ Long memberId = JWTUtil.getCurrentUserId(); From a3fbc84e254d6d8361f3d0cc758813aba88b5c54 Mon Sep 17 00:00:00 2001 From: hzee97 Date: Mon, 12 Aug 2024 01:10:00 +0900 Subject: [PATCH 4/4] =?UTF-8?q?:recycle:=20[Refactor]=20MannerService.java?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gamegoo/service/manner/MannerService.java | 37 ++++++++----------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/gamegoo/service/manner/MannerService.java b/src/main/java/com/gamegoo/service/manner/MannerService.java index a45da930..902f2317 100644 --- a/src/main/java/com/gamegoo/service/manner/MannerService.java +++ b/src/main/java/com/gamegoo/service/manner/MannerService.java @@ -310,40 +310,32 @@ public MannerRating update(MannerRequest.mannerUpdateDTO request, Long memberId, } // 매너점수를 산정하고 업데이트. - public int updateMannerScore(Member targetMember){ + private int updateMannerScore(Member targetMember){ // 매너평가 ID 조회 - List mannerRatings = mannerRatingRepository.findByToMemberId(targetMember.getId()); + List mannerRatings = targetMember.getMannerRatingList(); int totalCount; // 매너 평가 + 비매너 평가를 처음 받은 회원 if (mannerRatings.size()==1){ if (mannerRatings.get(0).getIsPositive()) { - totalCount = mannerRatings.get(0).getMannerRatingKeywordList().stream() - .map(mannerRatingKeyword -> mannerRatingKeyword.getMannerKeyword().getId()) - .collect(Collectors.toList()).size(); + totalCount = mannerRatings.get(0).getMannerRatingKeywordList().size(); } else { - totalCount = (mannerRatings.get(0).getMannerRatingKeywordList().stream() - .map(mannerRatingKeyword -> mannerRatingKeyword.getMannerKeyword().getId()) - .collect(Collectors.toList()).size())*-2; + totalCount = (mannerRatings.get(0).getMannerRatingKeywordList().size())*-2; } } else { - List positiveMannerKeywordIds = mannerRatings.stream() + int positiveCount = mannerRatings.stream() .filter(MannerRating::getIsPositive) .flatMap(mannerRating -> mannerRating.getMannerRatingKeywordList().stream()) - .map(mannerRatingKeyword -> mannerRatingKeyword.getMannerKeyword().getId()) - .collect(Collectors.toList()); + .collect(Collectors.toList()) + .size(); - int positiveCount = positiveMannerKeywordIds.size(); - - List negativeMannerKeywordIds = mannerRatings.stream() + int negativeCount = mannerRatings.stream() .filter(mannerRating -> !mannerRating.getIsPositive()) .flatMap(mannerRating -> mannerRating.getMannerRatingKeywordList().stream()) - .map(mannerRatingKeyword -> mannerRatingKeyword.getMannerKeyword().getId()) - .collect(Collectors.toList()); - - int negativeCount = negativeMannerKeywordIds.size(); + .collect(Collectors.toList()) + .size(); totalCount = positiveCount + (negativeCount*-2); } @@ -352,7 +344,7 @@ public int updateMannerScore(Member targetMember){ } // 매너레벨 결정 - public int mannerLevel(int mannerCount){ + private int mannerLevel(int mannerCount){ if (mannerCount < 10) { return 1; } else if (mannerCount < 20) { @@ -438,7 +430,7 @@ public MannerResponse.myMannerResponseDTO getMyManner(Long memberId){ Member member = memberRepository.findById(memberId).orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND)); // 매너평가 ID 조회 - List mannerRatings = mannerRatingRepository.findByToMemberId(member.getId()); + List mannerRatings = member.getMannerRatingList(); // 매너키워드 조회 List positiveMannerRatings = mannerRatings.stream() @@ -500,6 +492,9 @@ public MannerResponse.myMannerResponseDTO getMyManner(Long memberId){ } Integer mannerLevel = member.getMannerLevel(); - return new MannerResponse.myMannerResponseDTO(mannerLevel, mannerKeywordDTOs); + return MannerResponse.myMannerResponseDTO.builder() + .mannerLevel(mannerLevel) + .mannerKeywords(mannerKeywordDTOs) + .build(); } }