Skip to content

Commit

Permalink
Merge pull request #127 from HandTris/#126
Browse files Browse the repository at this point in the history
 ๊ฒŒ์ž„๋ฐฉ์— ์ฐธ์—ฌํ•œ ์ธ์›๋“ค์˜ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋Š” api ๊ตฌํ˜„
  • Loading branch information
forrest1398 authored Jul 10, 2024
2 parents 74da7e2 + cf97081 commit 906a407
Show file tree
Hide file tree
Showing 4 changed files with 126 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -22,6 +30,8 @@ public class MemberRecordServiceImpl implements MemberRecordService {

private final MemberRecordRepository memberRecordRepository;
private final MemberRepository memberRepository;
private final RedisTemplate<String, String> redisTemplate;
private static final String GAME_MEMBER_KEY_PREFIX = "gameMember:";

@Override
public MemberRecord getMemberRecord(String nickname) {
Expand Down Expand Up @@ -52,4 +62,69 @@ public MemberRecord updateMemberRecord(GameResultReq gameResultReq, String nickn
}
return memberRecord;
}

@Override
public List<MemberRecord> getParticipants(String roomCode, String nickname) {

List<MemberRecord> result = new ArrayList<>();
String gameKey = GAME_MEMBER_KEY_PREFIX + roomCode;

// ๋ณธ์ธ ์ „์ 
Optional<Member> member = memberRepository.findByNickname(nickname);
if (member.isEmpty()) {
throw new MemberNotFoundException();
}
Optional<MemberRecord> MyRecord = memberRecordRepository.findByMember(member.get());
if (MyRecord.isEmpty()) {
throw new MemberRecordNotFoundException();
}
result.add(MyRecord.get());

// ์ƒ๋Œ€ ์ „์ 
GameMember gameMember = getGameMemberFromCache(roomCode);
Set<GameMemberEssentialDTO> cachedUsers = gameMember.getMembers();
Optional<GameMemberEssentialDTO> otherUser = findOtherUser(cachedUsers, nickname);

// ์ƒ๋Œ€๊ฐ€ ์—†์„ ๊ฒฝ์šฐ
if (otherUser.isEmpty()) {
result.add(null);
}
// ์ƒ๋Œ€๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ
else {
Optional<Member> otherMember = memberRepository.findByNickname(otherUser.get().nickname());
if (otherMember.isEmpty()) {
throw new MemberNotFoundException();
}
Optional<MemberRecord> otherRecord = memberRecordRepository.findByMember(otherMember.get());
if (otherRecord.isEmpty()) {
throw new MemberRecordNotFoundException();
}
result.add(otherRecord.get());
}
return result;
}

private Optional<GameMemberEssentialDTO> findOtherUser(Set<GameMemberEssentialDTO> 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();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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<MemberRecord> getParticipants(String roomCode, String nickname);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -32,4 +36,23 @@ public ResponseEnvelope<MemberRecordDetailRes> updateMemberRecord(@Valid @Reques
return ResponseEnvelope.of(memberRecordDetailRes);
}

@GetMapping("/participant/{roomCode}")
public ResponseEnvelope<List<ParticipantRes>> getParticipants(@PathVariable("roomCode") String roomCode, @UserNicknameFromJwt String nickname) {
List<MemberRecord> participantsMemberRecord = memberRecordService.getParticipants(roomCode, nickname);
List<ParticipantRes> participantResList = new ArrayList<>();
for (MemberRecord memberRecord : participantsMemberRecord) {
if (memberRecord == null)
continue;
ParticipantRes participantRes = new ParticipantRes(memberRecord);
participantResList.add(participantRes);
}
return ResponseEnvelope.of(participantResList);
}

@GetMapping
public ResponseEnvelope<ParticipantRes> getMyRecord(@UserNicknameFromJwt String nickname) {
MemberRecord memberRecord = memberRecordService.getMemberRecord(nickname);
ParticipantRes participantRes = new ParticipantRes(memberRecord);
return ResponseEnvelope.of(participantRes);
}
}
Original file line number Diff line number Diff line change
@@ -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()
);
}

}

0 comments on commit 906a407

Please sign in to comment.