Skip to content

Commit

Permalink
Merge pull request #189 from Gamegoo-repo/feat/186
Browse files Browse the repository at this point in the history
[Feat/186] ๋งค์นญ ์šฐ์„ ์ˆœ์œ„ API ๊ตฌํ˜„
  • Loading branch information
rimi3226 authored Feb 4, 2025
2 parents a7c7677 + 93002d1 commit 28893c4
Show file tree
Hide file tree
Showing 22 changed files with 1,791 additions and 101 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,6 @@ public class Member extends BaseDateTimeEntity {
@OneToMany(mappedBy = "member", cascade = CascadeType.ALL)
private List<MemberGameStyle> memberGameStyleList = new ArrayList<>();

// ํšŒ์›๊ฐ€์ž…์šฉ create
public static Member create(String email, String password, LoginType loginType, String gameName, String tag,
Tier tier, int gameRank, double winRate, int gameCount, boolean isAgree) {
int randomProfileImage = ThreadLocalRandom.current().nextInt(1, 9);
Expand All @@ -124,7 +123,6 @@ public static Member create(String email, String password, LoginType loginType,
.build();
}

// ํšŒ์›๊ฐ€์ž…์šฉ Builder
@Builder
private Member(String email, String password, int profileImage, LoginType loginType, String gameName,
String tag, Tier tier, int gameRank, double winRate, int gameCount, boolean isAgree) {
Expand Down Expand Up @@ -178,4 +176,11 @@ public Double updateMannerRank(Double mannerRank) {
return this.mannerRank;
}

public void updateMemberByMatchingRecord(Mike mike, Position mainP, Position subP, Position wantP) {
this.mike = mike;
this.mainPosition = mainP;
this.subPosition = subP;
this.wantPosition = wantP;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,5 @@

public enum Mike {
UNAVAILABLE,
ONLY_LISTEN,
AVAILABLE,
}
Original file line number Diff line number Diff line change
@@ -1,22 +1,18 @@
package com.gamegoo.gamegoo_v2.account.member.service;

import com.gamegoo.gamegoo_v2.account.member.domain.Member;
import com.gamegoo.gamegoo_v2.account.member.domain.MemberGameStyle;
import com.gamegoo.gamegoo_v2.account.member.dto.request.GameStyleRequest;
import com.gamegoo.gamegoo_v2.account.member.dto.request.IsMikeRequest;
import com.gamegoo.gamegoo_v2.account.member.dto.request.PositionRequest;
import com.gamegoo.gamegoo_v2.account.member.dto.request.ProfileImageRequest;
import com.gamegoo.gamegoo_v2.account.member.dto.response.MyProfileResponse;
import com.gamegoo.gamegoo_v2.account.member.dto.response.OtherProfileResponse;
import com.gamegoo.gamegoo_v2.game.domain.GameStyle;
import com.gamegoo.gamegoo_v2.social.block.service.BlockService;
import com.gamegoo.gamegoo_v2.social.friend.service.FriendService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
Expand All @@ -25,6 +21,7 @@ public class MemberFacadeService {
private final MemberService memberService;
private final FriendService friendService;
private final BlockService blockService;
private final MemberGameStyleService memberGameStyleService;

/**
* ๋‚ด ํ”„๋กœํ•„ ์กฐํšŒ
Expand Down Expand Up @@ -114,18 +111,7 @@ public String setPosition(Member member, PositionRequest request) {
*/
@Transactional
public String setGameStyle(Member member, GameStyleRequest request) {
// request์˜ Gamestyle ์กฐํšŒ
List<GameStyle> requestGameStyleList = memberService.findRequestGameStyle(request);

// ํ˜„์žฌ DB์˜ GameStyle ์กฐํšŒ
List<MemberGameStyle> currentMemberGameStyleList = memberService.findCurrentMemberGameStyleList(member);

// request์— ์—†๊ณ , DB์— ์žˆ๋Š” GameStyle ์‚ญ์ œ
memberService.removeUnnecessaryGameStyles(member, requestGameStyleList, currentMemberGameStyleList);

// request์— ์žˆ๊ณ , DB์— ์—†๋Š” GameStyle ์ถ”๊ฐ€
memberService.addNewGameStyles(member, requestGameStyleList, currentMemberGameStyleList);

memberGameStyleService.updateGameStyle(member, request.getGameStyleIdList());
return "๊ฒŒ์ž„ ์Šคํƒ€์ผ ์ˆ˜์ •์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค";
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package com.gamegoo.gamegoo_v2.account.member.service;

import com.gamegoo.gamegoo_v2.account.member.domain.Member;
import com.gamegoo.gamegoo_v2.account.member.domain.MemberGameStyle;
import com.gamegoo.gamegoo_v2.account.member.repository.MemberGameStyleRepository;
import com.gamegoo.gamegoo_v2.core.exception.MemberException;
import com.gamegoo.gamegoo_v2.core.exception.common.ErrorCode;
import com.gamegoo.gamegoo_v2.game.domain.GameStyle;
import com.gamegoo.gamegoo_v2.game.repository.GameStyleRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class MemberGameStyleService {

private final GameStyleRepository gameStyleRepository;
private final MemberGameStyleRepository memberGameStyleRepository;

/**
* @param member ํšŒ์›
* @param gameStyleIdList ์ˆ˜์ •ํ•  ๊ฒŒ์ž„ ์Šคํƒ€์ผ ๋ฆฌ์ŠคํŠธ
*/
@Transactional
public void updateGameStyle(Member member, List<Long> gameStyleIdList) {
// request์˜ Gamestyle ์กฐํšŒ
List<GameStyle> requestGameStyleList = findRequestGameStyle(gameStyleIdList);

// ํ˜„์žฌ DB์˜ GameStyle ์กฐํšŒ
List<MemberGameStyle> currentMemberGameStyleList = findCurrentMemberGameStyleList(member);

// request์— ์—†๊ณ , DB์— ์žˆ๋Š” GameStyle ์‚ญ์ œ
removeUnnecessaryGameStyles(member, requestGameStyleList, currentMemberGameStyleList);

// request์— ์žˆ๊ณ , DB์— ์—†๋Š” GameStyle ์ถ”๊ฐ€
addNewGameStyles(member, requestGameStyleList, currentMemberGameStyleList);
}

/**
* request id๋กœ GameStyle Entity ์กฐํšŒ
*
* @return request์˜ GamestyleList
*/
private List<GameStyle> findRequestGameStyle(List<Long> gameStyleIdList) {
return gameStyleIdList.stream()
.map(id -> gameStyleRepository.findById(id).orElseThrow(() -> new MemberException(ErrorCode.GAMESTYLE_NOT_FOUND)))
.toList();
}

/**
* ํ˜„์žฌ DB์˜ MemberGameStyle List ์กฐํšŒ
*
* @return MemberGameStyleList
*/
private List<MemberGameStyle> findCurrentMemberGameStyleList(Member member) {
return new ArrayList<>(member.getMemberGameStyleList());
}

/**
* ๋ถˆํ•„์š”ํ•œ GameStyle ์ œ๊ฑฐ
*
* @param member ํšŒ์›
* @param requestedGameStyles ์ƒˆ๋กœ์šด GameStyle
* @param currentMemberGameStyles ํ˜„์žฌ Gamestyle
*/
@Transactional
protected void removeUnnecessaryGameStyles(Member member, List<GameStyle> requestedGameStyles,
List<MemberGameStyle> currentMemberGameStyles) {
currentMemberGameStyles.stream()
.filter(mgs -> !requestedGameStyles.contains(mgs.getGameStyle()))
.forEach(mgs -> {
mgs.removeMember(member);
memberGameStyleRepository.delete(mgs);
});
}

/**
* ์ƒˆ๋กœ์šด GameStyle ์ถ”๊ฐ€
*
* @param member ์‚ฌ์šฉ์ž
* @param requestedGameStyles ๋ณ€๊ฒฝ ํ›„ ๊ฒŒ์ž„์Šคํƒ€์ผ
* @param currentMemberGameStyles ๋ณ€๊ฒฝ ์ „ ๊ฒŒ์ž„์Šคํƒ€์ผ
*/
@Transactional
protected void addNewGameStyles(Member member, List<GameStyle> requestedGameStyles,
List<MemberGameStyle> currentMemberGameStyles) {
List<GameStyle> currentGameStyles = currentMemberGameStyles.stream()
.map(MemberGameStyle::getGameStyle)
.toList();

requestedGameStyles.stream()
.filter(gs -> !currentGameStyles.contains(gs))
.forEach(gs -> {
MemberGameStyle newMemberGameStyle = MemberGameStyle.create(gs, member);
memberGameStyleRepository.save(newMemberGameStyle);
});
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,23 @@

import com.gamegoo.gamegoo_v2.account.member.domain.LoginType;
import com.gamegoo.gamegoo_v2.account.member.domain.Member;
import com.gamegoo.gamegoo_v2.account.member.domain.MemberGameStyle;
import com.gamegoo.gamegoo_v2.account.member.domain.Mike;
import com.gamegoo.gamegoo_v2.account.member.domain.Position;
import com.gamegoo.gamegoo_v2.account.member.domain.Tier;
import com.gamegoo.gamegoo_v2.account.member.dto.request.GameStyleRequest;
import com.gamegoo.gamegoo_v2.account.member.repository.MemberGameStyleRepository;
import com.gamegoo.gamegoo_v2.account.member.repository.MemberRepository;
import com.gamegoo.gamegoo_v2.core.exception.MemberException;
import com.gamegoo.gamegoo_v2.core.exception.common.ErrorCode;
import com.gamegoo.gamegoo_v2.game.domain.GameStyle;
import com.gamegoo.gamegoo_v2.game.repository.GameStyleRepository;
import com.gamegoo.gamegoo_v2.utils.PasswordUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class MemberService {

private final MemberRepository memberRepository;
private final GameStyleRepository gameStyleRepository;
private final MemberGameStyleRepository memberGameStyleRepository;

/**
* Member ์ƒ์„ฑ ๋ฉ”์†Œ๋“œ
Expand Down Expand Up @@ -130,64 +120,11 @@ public void setPosition(Member member, Position mainPosition, Position subPositi
member.updatePosition(mainPosition, subPosition, wantPosition);
}

/**
* request id๋กœ GameStyle Entity ์กฐํšŒ
*
* @return request์˜ GamestyleList
*/
public List<GameStyle> findRequestGameStyle(GameStyleRequest request) {
return request.getGameStyleIdList().stream()
.map(id -> gameStyleRepository.findById(id).orElseThrow(() -> new MemberException(ErrorCode.GAMESTYLE_NOT_FOUND)))
.toList();
}

/**
* ํ˜„์žฌ DB์˜ MemberGameStyle List ์กฐํšŒ
*
* @return MemberGameStyleList
*/
public List<MemberGameStyle> findCurrentMemberGameStyleList(Member member) {
return new ArrayList<>(member.getMemberGameStyleList());
}

/**
* ๋ถˆํ•„์š”ํ•œ GameStyle ์ œ๊ฑฐ
*
* @param member ํšŒ์›
* @param requestedGameStyles ์ƒˆ๋กœ์šด GameStyle
* @param currentMemberGameStyles ํ˜„์žฌ Gamestyle
*/
@Transactional
public void removeUnnecessaryGameStyles(Member member, List<GameStyle> requestedGameStyles,
List<MemberGameStyle> currentMemberGameStyles) {
currentMemberGameStyles.stream()
.filter(mgs -> !requestedGameStyles.contains(mgs.getGameStyle()))
.forEach(mgs -> {
mgs.removeMember(member); // Remove bidirectional relationship
memberGameStyleRepository.delete(mgs);
});
}

/**
* ์ƒˆ๋กœ์šด GameStyle ์ถ”๊ฐ€
*
* @param member ์‚ฌ์šฉ์ž
* @param requestedGameStyles ๋ณ€๊ฒฝ ํ›„ ๊ฒŒ์ž„์Šคํƒ€์ผ
* @param currentMemberGameStyles ๋ณ€๊ฒฝ ์ „ ๊ฒŒ์ž„์Šคํƒ€์ผ
*/
@Transactional
public void addNewGameStyles(Member member, List<GameStyle> requestedGameStyles,
List<MemberGameStyle> currentMemberGameStyles) {
List<GameStyle> currentGameStyles = currentMemberGameStyles.stream()
.map(MemberGameStyle::getGameStyle)
.toList();

requestedGameStyles.stream()
.filter(gs -> !currentGameStyles.contains(gs))
.forEach(gs -> {
MemberGameStyle newMemberGameStyle = MemberGameStyle.create(gs, member);
memberGameStyleRepository.save(newMemberGameStyle);
});
public void updateMikePosition(Member member, Mike mike, Position mainP, Position subP, Position wantP) {
// ๋งˆ์ดํฌ, ํฌ์ง€์…˜ ์ˆ˜์ •
member.updateMemberByMatchingRecord(mike, mainP, subP, wantP);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.gamegoo.gamegoo_v2.matching.Controller;

import com.gamegoo.gamegoo_v2.core.common.ApiResponse;
import com.gamegoo.gamegoo_v2.matching.dto.request.InitializingMatchingRequest;
import com.gamegoo.gamegoo_v2.matching.dto.response.PriorityListResponse;
import com.gamegoo.gamegoo_v2.matching.service.MatchingFacadeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Tag(name = "Matching", description = "๋งค์นญ ์ •๋ณด ๊ด€๋ จ API")
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v2/internal")
@Validated
public class MatchingController {

private final MatchingFacadeService matchingFacadeService;

@Operation(summary = "๋งค์นญ ์šฐ์„ ์ˆœ์œ„ ๊ณ„์‚ฐ ๋ฐ ๊ธฐ๋ก ์ €์žฅ API", description = "API for calculating and recording matching")
@PostMapping("/matching/priority/{memberId}")
public ApiResponse<PriorityListResponse> InitializeMatching(@PathVariable(name = "memberId") Long memberId,
@RequestBody @Valid InitializingMatchingRequest request) {
return ApiResponse.ok(matchingFacadeService.calculatePriorityAndRecording(memberId, request));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -89,28 +89,25 @@ public class MatchingRecord extends BaseDateTimeEntity {
private Member member;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "target_id", nullable = false)
@JoinColumn(name = "target_id")
private Member targetMember;

// MatchingRecord ์ƒ์„ฑ ๋ฉ”์„œ๋“œ
public static MatchingRecord create(GameMode gameMode, Position mainPosition, Position subPosition,
Position wantPosition, Mike mike, Tier soloTier, int soloRank,
double soloWinRate, Tier freeTier, int freeRank, double freeWinRate,
MatchingType matchingType, int mannerLevel, Member member) {
public static MatchingRecord create(GameMode gameMode, MatchingType matchingType, Member member) {
return MatchingRecord.builder()
.gameMode(gameMode)
.mainPosition(mainPosition)
.subPosition(subPosition)
.wantPosition(wantPosition)
.mike(mike)
.soloTier(soloTier)
.soloRank(soloRank)
.soloWinRate(soloWinRate)
.freeTier(freeTier)
.freeRank(freeRank)
.freeWinRate(freeWinRate)
.mainPosition(member.getMainPosition())
.subPosition(member.getSubPosition())
.wantPosition(member.getWantPosition())
.mike(member.getMike())
.soloTier(member.getTier()) // TODO:
.soloRank(member.getGameRank()) // TODO:
.soloWinRate(member.getWinRate()) // TODO:
.freeTier(member.getTier()) // TODO:
.freeRank(member.getGameRank()) // TODO:
.freeWinRate(member.getWinRate()) // TODO:
.matchingType(matchingType)
.mannerLevel(mannerLevel)
.mannerLevel(member.getMannerLevel())
.member(member)
.build();
}
Expand All @@ -135,6 +132,7 @@ private MatchingRecord(GameMode gameMode, Position mainPosition, Position subPos
this.matchingType = matchingType;
this.mannerLevel = mannerLevel;
this.member = member;
this.targetMember = null;
}

// status ๋ณ€๊ฒฝ
Expand Down
Loading

0 comments on commit 28893c4

Please sign in to comment.