Skip to content

Commit

Permalink
Merge pull request #162 from Gamegoo-repo/feat/160
Browse files Browse the repository at this point in the history
[Feat/160] ๋งค๋„ˆํ‰๊ฐ€ ๊ด€๋ จ ์ถ”๊ฐ€ ๊ตฌํ˜„
  • Loading branch information
hzee97 authored Aug 13, 2024
2 parents dea7c8f + 0761f4d commit e06c7bc
Show file tree
Hide file tree
Showing 5 changed files with 185 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ public ApiResponse<MannerResponse.badMannerKeywordResponseDTO> getBadMannerKeywo
}

@GetMapping()
@Operation(summary = "๋‚ด๊ฐ€ ๋ฐ›์€ ๋งค๋„ˆ ํ‰๊ฐ€ ์กฐํšŒ API", description = "ํšŒ์›์˜ ๋งค๋„ˆ๋ ˆ๋ฒจ๊ณผ ํšŒ์›์ด ๋ฐ›์€ ๋งค๋„ˆ ํ‰๊ฐ€๋ฅผ ์กฐํšŒํ•˜๋Š” API ์ž…๋‹ˆ๋‹ค.")
@Operation(summary = "๋‚ด๊ฐ€ ๋ฐ›์€ ๋งค๋„ˆ ํ‰๊ฐ€ ์กฐํšŒ API", description = "ํšŒ์›์˜ ๋งค๋„ˆ๋ ˆ๋ฒจ๊ณผ ํšŒ์›์ด ๋ฐ›์€ ํ‚ค์›Œ๋“œ๋ฅผ ์กฐํšŒํ•˜๋Š” API ์ž…๋‹ˆ๋‹ค.")
public ApiResponse<MannerResponse.myMannerResponseDTO> getMyManner(){

Long memberId = JWTUtil.getCurrentUserId();
Expand All @@ -128,4 +128,14 @@ public ApiResponse<MannerResponse.myMannerResponseDTO> getMyManner(){

return ApiResponse.onSuccess(result);
}

@GetMapping("/{memberId}")
@Operation(summary = "๋‹ค๋ฅธ ์œ ์ €์˜ ๋งค๋„ˆ ํ‰๊ฐ€ ์กฐํšŒ API", description = "๋‹ค๋ฅธ ์œ ์ €์˜ ๋งค๋„ˆ๋ ˆ๋ฒจ๊ณผ ํ‚ค์›Œ๋“œ๋ฅผ ์กฐํšŒํ•˜๋Š” API ์ž…๋‹ˆ๋‹ค.")
@Parameter(name = "memberId", description = "๋งค๋„ˆ ํ‰๊ฐ€ ์กฐํšŒ ๋Œ€์ƒ์˜ id ์ž…๋‹ˆ๋‹ค.")
public ApiResponse<MannerResponse.mannerByIdResponseDTO> getMannerById(@PathVariable(name = "memberId") Long targetMemberId){

MannerResponse.mannerByIdResponseDTO result = mannerService.getMannerById(targetMemberId);

return ApiResponse.onSuccess(result);
}
}
3 changes: 3 additions & 0 deletions src/main/java/com/gamegoo/dto/board/BoardResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import com.gamegoo.domain.member.Tier;
import java.time.LocalDateTime;
import java.util.List;

import com.gamegoo.dto.manner.MannerResponse;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
Expand Down Expand Up @@ -123,6 +125,7 @@ public static class boardByIdResponseForMemberDTO {
String gameName;
String tag;
Integer mannerLevel;
List<MannerResponse.mannerKeywordDTO> mannerKeywords;
Tier tier;
Boolean mike;
List<Long> championList;
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/com/gamegoo/dto/manner/MannerResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,17 @@ public static class myMannerResponseDTO{
Integer mannerLevel;
List<mannerKeywordDTO> mannerKeywords;
}

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class mannerByIdResponseDTO{
Long memberId;
Integer mannerLevel;
List<mannerKeywordDTO> mannerKeywords;
}

@Getter
@Builder
@NoArgsConstructor
Expand Down
14 changes: 10 additions & 4 deletions src/main/java/com/gamegoo/service/board/BoardService.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,15 @@
import com.gamegoo.domain.member.Tier;
import com.gamegoo.dto.board.BoardRequest;
import com.gamegoo.dto.board.BoardResponse;
import com.gamegoo.dto.manner.MannerResponse;
import com.gamegoo.repository.board.BoardGameStyleRepository;
import com.gamegoo.repository.board.BoardRepository;
import com.gamegoo.repository.member.GameStyleRepository;
import com.gamegoo.repository.member.MemberRepository;
import com.gamegoo.service.manner.MannerService;
import com.gamegoo.service.member.FriendService;
import com.gamegoo.util.MemberUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -37,6 +36,8 @@ public class BoardService {

@Autowired
private FriendService friendService;
@Autowired
private MannerService mannerService;
private final MemberRepository memberRepository;
private final BoardRepository boardRepository;
private final GameStyleRepository gameStyleRepository;
Expand Down Expand Up @@ -335,6 +336,10 @@ public BoardResponse.boardByIdResponseForMemberDTO getBoardByIdForMember(Long bo

Member poster = board.getMember();

List<MannerResponse.mannerKeywordDTO> mannerKeywordDTOs = mannerService.mannerKeyword(poster);

List<MannerResponse.mannerKeywordDTO> mannerKeywords = mannerService.sortMannerKeywordDTOs(mannerKeywordDTOs);

return BoardResponse.boardByIdResponseForMemberDTO.builder()
.boardId(board.getId())
.memberId(poster.getId())
Expand All @@ -346,6 +351,7 @@ public BoardResponse.boardByIdResponseForMemberDTO getBoardByIdForMember(Long bo
.gameName(poster.getGameName())
.tag(poster.getTag())
.mannerLevel(poster.getMannerLevel())
.mannerKeywords(mannerKeywords)
.tier(poster.getTier())
.championList(poster.getMemberChampionList().stream().map(MemberChampion::getId)
.collect(Collectors.toList()))
Expand Down
160 changes: 150 additions & 10 deletions src/main/java/com/gamegoo/service/manner/MannerService.java
Original file line number Diff line number Diff line change
Expand Up @@ -310,19 +310,19 @@ public MannerRating update(MannerRequest.mannerUpdateDTO request, Long memberId,
}

// ๋งค๋„ˆ์ ์ˆ˜๋ฅผ ์‚ฐ์ •ํ•˜๊ณ  ์—…๋ฐ์ดํŠธ.
private int updateMannerScore(Member targetMember){
private int updateMannerScore(Member targetMember) {

// ๋งค๋„ˆํ‰๊ฐ€ ID ์กฐํšŒ
List<MannerRating> mannerRatings = targetMember.getMannerRatingList();

int totalCount;

// ๋งค๋„ˆ ํ‰๊ฐ€ + ๋น„๋งค๋„ˆ ํ‰๊ฐ€๋ฅผ ์ฒ˜์Œ ๋ฐ›์€ ํšŒ์›
if (mannerRatings.size()==1){
if (mannerRatings.size() == 1) {
if (mannerRatings.get(0).getIsPositive()) {
totalCount = mannerRatings.get(0).getMannerRatingKeywordList().size();
} else {
totalCount = (mannerRatings.get(0).getMannerRatingKeywordList().size())*-2;
totalCount = (mannerRatings.get(0).getMannerRatingKeywordList().size()) * -2;
}
} else {
int positiveCount = mannerRatings.stream()
Expand All @@ -331,20 +331,20 @@ private int updateMannerScore(Member targetMember){
.collect(Collectors.toList())
.size();

int negativeCount = mannerRatings.stream()
int negativeCount = mannerRatings.stream()
.filter(mannerRating -> !mannerRating.getIsPositive())
.flatMap(mannerRating -> mannerRating.getMannerRatingKeywordList().stream())
.collect(Collectors.toList())
.size();

totalCount = positiveCount + (negativeCount*-2);
totalCount = positiveCount + (negativeCount * -2);
}

return totalCount;
}

// ๋งค๋„ˆ๋ ˆ๋ฒจ ๊ฒฐ์ •
private int mannerLevel(int mannerCount){
private int mannerLevel(int mannerCount) {
if (mannerCount < 10) {
return 1;
} else if (mannerCount < 20) {
Expand All @@ -360,7 +360,7 @@ private int mannerLevel(int mannerCount){

// ๋งค๋„ˆํ‰๊ฐ€ ์กฐํšŒ
@Transactional(readOnly = true)
public MannerResponse.mannerKeywordResponseDTO getMannerKeyword(Long memberId, Long targetMemberId){
public MannerResponse.mannerKeywordResponseDTO getMannerKeyword(Long memberId, Long targetMemberId) {

Member member = memberRepository.findById(memberId).orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND));

Expand Down Expand Up @@ -412,7 +412,7 @@ public MannerResponse.mannerKeywordResponseDTO getMannerKeyword(Long memberId, L

// ๋น„๋งค๋„ˆํ‰๊ฐ€ ์กฐํšŒ
@Transactional(readOnly = true)
public MannerResponse.badMannerKeywordResponseDTO getBadMannerKeyword(Long memberId, Long targetMemberId){
public MannerResponse.badMannerKeywordResponseDTO getBadMannerKeyword(Long memberId, Long targetMemberId) {

Member member = memberRepository.findById(memberId).orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND));

Expand Down Expand Up @@ -458,7 +458,7 @@ public MannerResponse.badMannerKeywordResponseDTO getBadMannerKeyword(Long membe

// ๋‚ด๊ฐ€ ๋ฐ›์€ ๋งค๋„ˆ ํ‰๊ฐ€ ์กฐํšŒ
@Transactional(readOnly = true)
public MannerResponse.myMannerResponseDTO getMyManner(Long memberId){
public MannerResponse.myMannerResponseDTO getMyManner(Long memberId) {

Member member = memberRepository.findById(memberId).orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND));

Expand Down Expand Up @@ -524,10 +524,150 @@ public MannerResponse.myMannerResponseDTO getMyManner(Long memberId){
mannerKeywordDTOs.add(new MannerResponse.mannerKeywordDTO(false, i, count));
}

List<MannerResponse.mannerKeywordDTO> mannerKeywords = sortMannerKeywordDTOs(mannerKeywordDTOs);

Integer mannerLevel = member.getMannerLevel();
return MannerResponse.myMannerResponseDTO.builder()
.mannerLevel(mannerLevel)
.mannerKeywords(mannerKeywordDTOs)
.mannerKeywords(mannerKeywords)
.build();
}

// ๋Œ€์ƒ ํšŒ์›์˜ ๋งค๋„ˆ ํ‰๊ฐ€ ์กฐํšŒ
@Transactional(readOnly = true)
public MannerResponse.mannerByIdResponseDTO getMannerById(Long targetMemberId) {

Member targetMember = memberRepository.findById(targetMemberId).orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND));

List<MannerResponse.mannerKeywordDTO> mannerKeywordDTOs = mannerKeyword(targetMember);

List<MannerResponse.mannerKeywordDTO> mannerKeywords = sortMannerKeywordDTOs(mannerKeywordDTOs);

Integer mannerLevel = targetMember.getMannerLevel();
return MannerResponse.mannerByIdResponseDTO.builder()
.memberId(targetMember.getId())
.mannerLevel(mannerLevel)
.mannerKeywords(mannerKeywords)
.build();
}

public List<MannerResponse.mannerKeywordDTO> mannerKeyword(Member targetMember) {
// ๋งค๋„ˆํ‰๊ฐ€ ID ์กฐํšŒ
List<MannerRating> mannerRatings = targetMember.getMannerRatingList();

// ๋งค๋„ˆํ‚ค์›Œ๋“œ ์กฐํšŒ
List<MannerRating> positiveMannerRatings = mannerRatings.stream()
.filter(MannerRating::getIsPositive)
.collect(Collectors.toList());

// ๊ฐ ๋งค๋„ˆํ‚ค์›Œ๋“œ(1~6) ๋ณ„ count ์ง‘๊ณ„
List<Long> mannerKeywordIds = new ArrayList<>();

for (MannerRating positiveRating : positiveMannerRatings) {
List<MannerRatingKeyword> mannerRatingKeywords = positiveRating.getMannerRatingKeywordList();
for (MannerRatingKeyword mannerRatingKeyword : mannerRatingKeywords) {
mannerKeywordIds.add(mannerRatingKeyword.getMannerKeyword().getId());
}
}

Map<Integer, Integer> 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<MannerRating> negativeMannerRatings = mannerRatings.stream()
.filter(mannerRating -> !mannerRating.getIsPositive())
.collect(Collectors.toList());

// ๊ฐ ๋น„๋งค๋„ˆํ‚ค์›Œ๋“œ(7~12) ๋ณ„ count ์ง‘๊ณ„
List<Long> badMannerKeywordIds = new ArrayList<>();

for (MannerRating negativeRating : negativeMannerRatings) {
List<MannerRatingKeyword> badMannerRatingKeywords = negativeRating.getMannerRatingKeywordList();
for (MannerRatingKeyword badMannerRatingKeyword : badMannerRatingKeywords) {
badMannerKeywordIds.add(badMannerRatingKeyword.getMannerKeyword().getId());
}
}

Map<Integer, Integer> 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<MannerResponse.mannerKeywordDTO> 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));
}

return mannerKeywordDTOs;
}

// mannerKeywordDTOs(๋งค๋„ˆํ‚ค์›Œ๋“œ,๋น„๋งค๋„ˆํ‚ค์›Œ๋“œ) ์ •๋ ฌ
public List<MannerResponse.mannerKeywordDTO> sortMannerKeywordDTOs(List<MannerResponse.mannerKeywordDTO> mannerKeywordDTOs) {

// mannerKeywordId์™€ contents ๊ฐ’์„ ๋งคํ•‘
Map<Long, String> content = mannerKeywordRepository.findAll().stream()
.collect(Collectors.toMap(MannerKeyword::getId, MannerKeyword::getContents));

// Comparator ์ƒ์„ฑ
// ์šฐ์„  ์ˆœ์œ„) 1. count ๊ธฐ์ค€ ๋‚ด๋ฆผ์ฐจ์ˆœ, 2.contents ๊ธฐ์ค€ ์ˆซ์ž, 3.contents ๊ธฐ์ค€ ํ•œ๊ธ€(ใ„ฑใ„ดใ„ท์ˆœ) ์ •๋ ฌ
Comparator<MannerResponse.mannerKeywordDTO> comparator = Comparator
.comparingInt(MannerResponse.mannerKeywordDTO::getCount).reversed() // count ๋‚ด๋ฆผ์ฐจ์ˆœ
.thenComparing(dto -> {
String contents = content.get((long) dto.getMannerKeywordId());
return sortByContents(contents);
}); // contents ๊ธฐ์ค€ ์ •๋ ฌ

// ๋งค๋„ˆํ‚ค์›Œ๋“œ์™€ ๋น„๋งค๋„ˆํ‚ค์›Œ๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ๊ฐ ์ •๋ ฌ
List<MannerResponse.mannerKeywordDTO> positiveKeywords = mannerKeywordDTOs.stream()
.filter(MannerResponse.mannerKeywordDTO::getIsPositive)
.sorted(comparator)
.collect(Collectors.toList());

List<MannerResponse.mannerKeywordDTO> negativeKeywords = mannerKeywordDTOs.stream()
.filter(dto -> !dto.getIsPositive())
.sorted(comparator)
.collect(Collectors.toList());

// ์ •๋ ฌ๋œ ๋งค๋„ˆํ‚ค์›Œ๋“œ์™€ ๋น„๋งค๋„ˆํ‚ค์›Œ๋“œ๋ฅผ ํ•ฉ์น˜๊ธฐ
List<MannerResponse.mannerKeywordDTO> sortedKeywordDTOs = new ArrayList<>();
sortedKeywordDTOs.addAll(positiveKeywords);
sortedKeywordDTOs.addAll(negativeKeywords);

return sortedKeywordDTOs;
}

// contents๋ฅผ ์ˆซ์ž ์šฐ์„ , ํ•œ๊ธ€๋กœ ์ •๋ ฌํ•˜๋Š” ๋ฉ”์„œ๋“œ
public String sortByContents(String contents) {
if (contents == null || contents.isEmpty()) {
// contents๊ฐ€ null์ด๊ฑฐ๋‚˜ ๋นˆ ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ ๊ฐ€์žฅ ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„๋กœ ์ฒ˜๋ฆฌ
return "\uFFFF"; // ASCII์˜ ๊ฐ€์žฅ ํฐ ๊ฐ’
}

// ์ฒซ ๊ธ€์ž ๊ฐ€์ ธ์˜ค๊ธฐ
char firstChar = contents.charAt(0);

if (Character.isDigit(firstChar)) {
// ์ˆซ์ž์ผ ๊ฒฝ์šฐ, ์šฐ์„ ์ˆœ์œ„ ๋†’์Œ (์ˆซ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ)
return "0" + contents; // ์ˆซ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๊ฒƒ์œผ๋กœ ์„ค์ •
} else {
// ํ•œ๊ธ€์ผ ๊ฒฝ์šฐ, ํ•œ๊ธ€ ์ •๋ ฌ์„ ์œ„ํ•ด `contents` ์ž์ฒด๋ฅผ ๋ฐ˜ํ™˜
return contents;
}
}
}

0 comments on commit e06c7bc

Please sign in to comment.