From 86a26dd881f9cd74fac09334a29889156208ee19 Mon Sep 17 00:00:00 2001 From: forrest1398 <129135885+forrest1398@users.noreply.github.com> Date: Wed, 10 Jul 2024 16:15:03 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat=20:=20=EA=B2=8C=EC=9E=84=EB=B0=A9?= =?UTF-8?q?=EC=97=90=20=EC=B0=B8=EC=97=AC=ED=95=9C=20=EC=9D=B8=EC=9B=90?= =?UTF-8?q?=EB=93=A4=EC=9D=98=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=ED=95=98=EB=8A=94=20api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/MemberRecordServiceImpl.java | 77 +++++++++++++++++++ .../service/MemberRecordService.java | 4 + .../presentation/MemberRecordController.java | 18 +++++ .../dto/response/ParticipantRes.java | 24 ++++++ 4 files changed, 123 insertions(+) create mode 100644 src/main/java/jungle/HandTris/presentation/dto/response/ParticipantRes.java diff --git a/src/main/java/jungle/HandTris/application/impl/MemberRecordServiceImpl.java b/src/main/java/jungle/HandTris/application/impl/MemberRecordServiceImpl.java index 8fc1adb..fcf73c8 100644 --- a/src/main/java/jungle/HandTris/application/impl/MemberRecordServiceImpl.java +++ b/src/main/java/jungle/HandTris/application/impl/MemberRecordServiceImpl.java @@ -1,19 +1,27 @@ package jungle.HandTris.application.impl; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.transaction.Transactional; import jungle.HandTris.application.service.MemberRecordService; +import jungle.HandTris.domain.GameMember; import jungle.HandTris.domain.Member; import jungle.HandTris.domain.MemberRecord; import jungle.HandTris.domain.exception.MemberNotFoundException; import jungle.HandTris.domain.exception.MemberRecordNotFoundException; import jungle.HandTris.domain.repo.MemberRecordRepository; import jungle.HandTris.domain.repo.MemberRepository; +import jungle.HandTris.presentation.dto.request.GameMemberEssentialDTO; import jungle.HandTris.presentation.dto.request.GameResult; import jungle.HandTris.presentation.dto.request.GameResultReq; import lombok.RequiredArgsConstructor; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; +import java.util.Set; @Service @Transactional @@ -22,6 +30,8 @@ public class MemberRecordServiceImpl implements MemberRecordService { private final MemberRecordRepository memberRecordRepository; private final MemberRepository memberRepository; + private final RedisTemplate redisTemplate; + private static final String GAME_MEMBER_KEY_PREFIX = "gameMember:"; @Override public MemberRecord getMemberRecord(String nickname) { @@ -52,4 +62,71 @@ public MemberRecord updateMemberRecord(GameResultReq gameResultReq, String nickn } return memberRecord; } + + @Override + public List getParticipants(String roomCode, String nickname) { + + List result = new ArrayList<>(); + String gameKey = GAME_MEMBER_KEY_PREFIX + roomCode; + + // 본인 전적 + Optional member = memberRepository.findByNickname(nickname); + System.out.println(member.get().getNickname() + "--------------------------------------------"); + if (member.isEmpty()) { + throw new MemberNotFoundException(); + } + Optional MyRecord = memberRecordRepository.findByMember(member.get()); + if (MyRecord.isEmpty()) { + throw new MemberRecordNotFoundException(); + } + result.add(MyRecord.get()); + + // 상대 전적 + GameMember gameMember = getGameMemberFromCache(roomCode); + Set cachedUsers = gameMember.getMembers(); + Optional otherUser = findOtherUser(cachedUsers, nickname); + + // 상대가 없을 경우 + if (otherUser.isEmpty()) { + result.add(null); + } + // 상대가 있을 경우 + else { + Optional otherMember = memberRepository.findByNickname(otherUser.get().nickname()); + System.out.println(otherMember.get().getNickname() + "--------------------------------------------"); + if (otherMember.isEmpty()) { + throw new MemberNotFoundException(); + } + Optional otherRecord = memberRecordRepository.findByMember(otherMember.get()); + if (otherRecord.isEmpty()) { + throw new MemberRecordNotFoundException(); + } + result.add(otherRecord.get()); + } + return result; + } + + private Optional findOtherUser(Set cachedUser, String nickname) { + return cachedUser.stream() + .filter(dto -> !dto.nickname().equals(nickname)) + .findFirst(); + } + + private GameMember getGameMemberFromCache(String roomCode) { + String gameMemberGen = redisTemplate.opsForValue().get(GAME_MEMBER_KEY_PREFIX + roomCode); + return generateGameMember(gameMemberGen); + } + + private GameMember generateGameMember(String gameMemberGen) { + try { + if (gameMemberGen != null) { + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.readValue(gameMemberGen, GameMember.class); + } + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + throw new MemberNotFoundException(); + } + } diff --git a/src/main/java/jungle/HandTris/application/service/MemberRecordService.java b/src/main/java/jungle/HandTris/application/service/MemberRecordService.java index 2a66beb..189ecc0 100644 --- a/src/main/java/jungle/HandTris/application/service/MemberRecordService.java +++ b/src/main/java/jungle/HandTris/application/service/MemberRecordService.java @@ -3,8 +3,12 @@ import jungle.HandTris.domain.MemberRecord; import jungle.HandTris.presentation.dto.request.GameResultReq; +import java.util.List; + public interface MemberRecordService { MemberRecord getMemberRecord(String nickname); MemberRecord updateMemberRecord(GameResultReq gameResultReq, String nickname); + + List getParticipants(String roomCode, String nickname); } diff --git a/src/main/java/jungle/HandTris/presentation/MemberRecordController.java b/src/main/java/jungle/HandTris/presentation/MemberRecordController.java index af0803b..1fdb1b2 100644 --- a/src/main/java/jungle/HandTris/presentation/MemberRecordController.java +++ b/src/main/java/jungle/HandTris/presentation/MemberRecordController.java @@ -7,9 +7,13 @@ import jungle.HandTris.global.validation.UserNicknameFromJwt; import jungle.HandTris.presentation.dto.request.GameResultReq; import jungle.HandTris.presentation.dto.response.MemberRecordDetailRes; +import jungle.HandTris.presentation.dto.response.ParticipantRes; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; +import java.util.ArrayList; +import java.util.List; + @RestController @RequiredArgsConstructor @@ -32,4 +36,18 @@ public ResponseEnvelope updateMemberRecord(@Valid @Reques return ResponseEnvelope.of(memberRecordDetailRes); } + @GetMapping("/participant/{roomCode}") + public ResponseEnvelope> getParticipants(@PathVariable("roomCode") String roomCode, @UserNicknameFromJwt String nickname) { + List participantsMemberRecord = memberRecordService.getParticipants(roomCode, nickname); + List participantResList = new ArrayList<>(); + for (MemberRecord memberRecord : participantsMemberRecord) { + if (memberRecord == null) + continue; + ParticipantRes participantRes = new ParticipantRes(memberRecord); + participantResList.add(participantRes); + } + return ResponseEnvelope.of(participantResList); + } + + } diff --git a/src/main/java/jungle/HandTris/presentation/dto/response/ParticipantRes.java b/src/main/java/jungle/HandTris/presentation/dto/response/ParticipantRes.java new file mode 100644 index 0000000..a236467 --- /dev/null +++ b/src/main/java/jungle/HandTris/presentation/dto/response/ParticipantRes.java @@ -0,0 +1,24 @@ +package jungle.HandTris.presentation.dto.response; + +import jungle.HandTris.domain.MemberRecord; + +import java.math.BigDecimal; + +public record ParticipantRes( + String nickname, + String profileImageUrl, + long win, + long lose, + BigDecimal winRate +) { + public ParticipantRes(MemberRecord memberRecord) { + this( + memberRecord.getMember().getNickname(), + memberRecord.getMember().getProfileImageUrl(), + memberRecord.getWin(), + memberRecord.getLose(), + memberRecord.getRate() + ); + } + +} \ No newline at end of file From 19341568a1018f2ef60334d8e03a96283d171d2e Mon Sep 17 00:00:00 2001 From: forrest1398 <129135885+forrest1398@users.noreply.github.com> Date: Wed, 10 Jul 2024 16:47:02 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat=20:=20=EB=8B=89=EB=84=A4=EC=9E=84=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EC=97=86=EC=9D=B4,=20=EB=B3=B8=EC=9D=B8?= =?UTF-8?q?=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=A1=B0=ED=9A=8C=20api=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HandTris/presentation/MemberRecordController.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/jungle/HandTris/presentation/MemberRecordController.java b/src/main/java/jungle/HandTris/presentation/MemberRecordController.java index 1fdb1b2..9921cfb 100644 --- a/src/main/java/jungle/HandTris/presentation/MemberRecordController.java +++ b/src/main/java/jungle/HandTris/presentation/MemberRecordController.java @@ -49,5 +49,11 @@ public ResponseEnvelope> getParticipants(@PathVariable("roo return ResponseEnvelope.of(participantResList); } + @GetMapping + public ResponseEnvelope getMyRecord(@UserNicknameFromJwt String nickname) { + MemberRecord memberRecord = memberRecordService.getMemberRecord(nickname); + MemberRecordDetailRes memberRecordDetailRes = new MemberRecordDetailRes(memberRecord); + return ResponseEnvelope.of(memberRecordDetailRes); + } } From cf97081482201145d099b1bafc1cb113f1e2f558 Mon Sep 17 00:00:00 2001 From: forrest1398 <129135885+forrest1398@users.noreply.github.com> Date: Wed, 10 Jul 2024 17:19:48 +0900 Subject: [PATCH 3/3] =?UTF-8?q?refactor=20:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=20=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20api=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(=EC=9E=84=EC=8B=9C,=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81=20=ED=95=84=EC=9A=94)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HandTris/application/impl/MemberRecordServiceImpl.java | 2 -- .../HandTris/presentation/MemberRecordController.java | 7 +++---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/jungle/HandTris/application/impl/MemberRecordServiceImpl.java b/src/main/java/jungle/HandTris/application/impl/MemberRecordServiceImpl.java index fcf73c8..f9a0a57 100644 --- a/src/main/java/jungle/HandTris/application/impl/MemberRecordServiceImpl.java +++ b/src/main/java/jungle/HandTris/application/impl/MemberRecordServiceImpl.java @@ -71,7 +71,6 @@ public List getParticipants(String roomCode, String nickname) { // 본인 전적 Optional member = memberRepository.findByNickname(nickname); - System.out.println(member.get().getNickname() + "--------------------------------------------"); if (member.isEmpty()) { throw new MemberNotFoundException(); } @@ -93,7 +92,6 @@ public List getParticipants(String roomCode, String nickname) { // 상대가 있을 경우 else { Optional otherMember = memberRepository.findByNickname(otherUser.get().nickname()); - System.out.println(otherMember.get().getNickname() + "--------------------------------------------"); if (otherMember.isEmpty()) { throw new MemberNotFoundException(); } diff --git a/src/main/java/jungle/HandTris/presentation/MemberRecordController.java b/src/main/java/jungle/HandTris/presentation/MemberRecordController.java index 9921cfb..66dc3c7 100644 --- a/src/main/java/jungle/HandTris/presentation/MemberRecordController.java +++ b/src/main/java/jungle/HandTris/presentation/MemberRecordController.java @@ -50,10 +50,9 @@ public ResponseEnvelope> getParticipants(@PathVariable("roo } @GetMapping - public ResponseEnvelope getMyRecord(@UserNicknameFromJwt String nickname) { + public ResponseEnvelope getMyRecord(@UserNicknameFromJwt String nickname) { MemberRecord memberRecord = memberRecordService.getMemberRecord(nickname); - MemberRecordDetailRes memberRecordDetailRes = new MemberRecordDetailRes(memberRecord); - return ResponseEnvelope.of(memberRecordDetailRes); + ParticipantRes participantRes = new ParticipantRes(memberRecord); + return ResponseEnvelope.of(participantRes); } - }