Skip to content

Commit

Permalink
Merge pull request #611 from woowacourse-teams/refactor/#595
Browse files Browse the repository at this point in the history
채팅 관련 기능 리팩토링 및 테이블 추가
  • Loading branch information
ay-eonii authored Oct 10, 2024
2 parents 3d0b581 + 30e7177 commit d3430cb
Show file tree
Hide file tree
Showing 60 changed files with 2,170 additions and 540 deletions.
25 changes: 15 additions & 10 deletions backend/src/main/java/mouda/backend/bet/business/BetScheduler.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,28 @@
import mouda.backend.bet.domain.Bet;
import mouda.backend.bet.implement.BetFinder;
import mouda.backend.bet.implement.BetWriter;
import mouda.backend.chat.domain.ChatRoomType;
import mouda.backend.chat.implement.ChatRoomWriter;

@Service
@RequiredArgsConstructor
public class BetScheduler {

@Value("${bet.schedule}")
private String rate;
@Value("${bet.schedule}")
private String rate;

private final BetFinder betFinder;
private final BetWriter betWriter;
private final BetFinder betFinder;
private final BetWriter betWriter;
private final ChatRoomWriter chatRoomWriter;

@Scheduled(cron = "${bet.schedule}")
public void performScheduledTask() {
List<Bet> bets = betFinder.findAllDrawableBet();
@Scheduled(cron = "${bet.schedule}")
public void performScheduledTask() {
List<Bet> bets = betFinder.findAllDrawableBet();

bets.forEach(Bet::draw);
bets.forEach(Bet::draw);

betWriter.saveAll(bets);
}
betWriter.saveAll(bets);

bets.forEach(bet -> chatRoomWriter.append(bet.getId(), bet.getDarakbangId(), ChatRoomType.BET));
}
}
73 changes: 40 additions & 33 deletions backend/src/main/java/mouda/backend/bet/business/BetService.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,52 +15,59 @@
import mouda.backend.bet.presentation.response.BetFindAllResponses;
import mouda.backend.bet.presentation.response.BetFindResponse;
import mouda.backend.bet.presentation.response.BetResultResponse;
import mouda.backend.chat.domain.ChatRoomType;
import mouda.backend.chat.implement.ChatRoomFinder;
import mouda.backend.chat.implement.ChatRoomWriter;
import mouda.backend.darakbangmember.domain.DarakbangMember;

@Service
@RequiredArgsConstructor
@Transactional
public class BetService {

private final BetFinder betFinder;
private final BetWriter betWriter;
private final BetSorter betSorter;
private final BetFinder betFinder;
private final BetWriter betWriter;
private final BetSorter betSorter;
private final ChatRoomFinder chatRoomFinder;
private final ChatRoomWriter chatRoomWriter;

@Transactional(readOnly = true)
public BetFindAllResponses findAllBets(long darakbangId) {
List<Bet> bets = betFinder.findAllByDarakbangId(darakbangId);
List<Bet> sortedBets = betSorter.sort(bets);
return BetFindAllResponses.toResponse(sortedBets);
}
@Transactional(readOnly = true)
public BetFindAllResponses findAllBets(long darakbangId) {
List<Bet> bets = betFinder.findAllByDarakbangId(darakbangId);
List<Bet> sortedBets = betSorter.sort(bets);
return BetFindAllResponses.toResponse(sortedBets);
}

@Transactional(readOnly = true)
public BetFindResponse findBet(long darakbangId, long betId, DarakbangMember darakbangMember) {
Bet bet = betFinder.find(darakbangId, betId);
return BetFindResponse.toResponse(bet, darakbangMember);
}
@Transactional(readOnly = true)
public BetFindResponse findBet(long darakbangId, long betId, DarakbangMember darakbangMember) {
Bet bet = betFinder.find(darakbangId, betId);
Long chatRoomId = chatRoomFinder.findChatRoomIdByTargetId(bet.getId(), ChatRoomType.BET);
return BetFindResponse.toResponse(bet, darakbangMember, chatRoomId);
}

public long createBet(long darakbangId, BetCreateRequest betRequest, DarakbangMember darakbangMember) {
Bet bet = betRequest.toBet(darakbangMember.getId());
long savedBetId = betWriter.save(darakbangId, bet);
betWriter.participate(darakbangId, savedBetId, darakbangMember);
public long createBet(long darakbangId, BetCreateRequest betRequest, DarakbangMember darakbangMember) {
Bet bet = betRequest.toBet(darakbangMember.getId());
long savedBetId = betWriter.save(darakbangId, bet);
betWriter.participate(darakbangId, savedBetId, darakbangMember);

return savedBetId;
}
return savedBetId;
}

public void participateBet(long darakbangId, long betId, DarakbangMember darakbangMember) {
betWriter.participate(darakbangId, betId, darakbangMember);
}
public void participateBet(long darakbangId, long betId, DarakbangMember darakbangMember) {
betWriter.participate(darakbangId, betId, darakbangMember);
}

@Transactional(readOnly = true)
public BetResultResponse findBetResult(long darakbangId, long betId) {
Loser loser = betFinder.findResult(darakbangId, betId);
return BetResultResponse.from(loser);
}
@Transactional(readOnly = true)
public BetResultResponse findBetResult(long darakbangId, long betId) {
Loser loser = betFinder.findResult(darakbangId, betId);
return BetResultResponse.from(loser);
}

public void drawBet(long darakbangId, long betId) {
Bet bet = betFinder.find(darakbangId, betId);
bet.draw();
betWriter.updateLoser(bet);
}
public void drawBet(long darakbangId, long betId) {
Bet bet = betFinder.find(darakbangId, betId);
bet.draw();
betWriter.updateLoser(bet);
chatRoomWriter.append(bet.getId(), darakbangId, ChatRoomType.BET);
}
}

90 changes: 46 additions & 44 deletions backend/src/main/java/mouda/backend/bet/domain/Bet.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,56 +9,58 @@
@Getter
public class Bet {

private final BetDetails betDetails;
private final List<Participant> participants;
private final long moimerId;
private Long loserId;
private final BetDetails betDetails;
private final long darakbangId;
private final List<Participant> participants;
private final long moimerId;
private Long loserId;

@Builder
public Bet(BetDetails betDetails, List<Participant> participants, long moimerId, Long loserId) {
this.betDetails = betDetails;
this.participants = participants;
this.moimerId = moimerId;
this.loserId = loserId;
}
@Builder
public Bet(BetDetails betDetails, long darakbangId, List<Participant> participants, long moimerId, Long loserId) {
this.betDetails = betDetails;
this.darakbangId = darakbangId;
this.participants = participants;
this.moimerId = moimerId;
this.loserId = loserId;
}

public void draw() {
Random random = new Random();
int loserIndex = random.nextInt(participants.size());
this.loserId = participants.get(loserIndex).getId();
}
public void draw() {
Random random = new Random();
int loserIndex = random.nextInt(participants.size());
this.loserId = participants.get(loserIndex).getId();
}

public boolean hasLoser() {
return loserId != null;
}
public boolean hasLoser() {
return loserId != null;
}

public BetRole getMyRole(Long id) {
if (moimerId == id) {
return BetRole.MOIMER;
}
if (isParticipated(id)) {
return BetRole.MOIMEE;
}
return BetRole.NON_PARTICIPANT;
}
public BetRole getMyRole(Long id) {
if (moimerId == id) {
return BetRole.MOIMER;
}
if (isParticipated(id)) {
return BetRole.MOIMEE;
}
return BetRole.NON_PARTICIPANT;
}

private boolean isParticipated(Long id) {
return participants.stream()
.anyMatch(participant -> participant.getId() == id);
}
private boolean isParticipated(Long id) {
return participants.stream()
.anyMatch(participant -> participant.getId() == id);
}

public long getLoserId() {
if (loserId == null) {
throw new IllegalArgumentException("당첨자가 존재하지 않습니다.");
}
return loserId;
}
public long getLoserId() {
if (loserId == null) {
throw new IllegalArgumentException("당첨자가 존재하지 않습니다.");
}
return loserId;
}

public long getId() {
return betDetails.getId();
}
public long getId() {
return betDetails.getId();
}

public long timeDifferenceInMinutesWithNow() {
return betDetails.timeDifferenceInMinutesWithNow();
}
public long timeDifferenceInMinutesWithNow() {
return betDetails.timeDifferenceInMinutesWithNow();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,14 @@ public class BetDarakbangMemberEntity {
@ManyToOne(fetch = FetchType.LAZY)
private BetEntity bet;

private long lastReadChatId;

public BetDarakbangMemberEntity(DarakbangMember darakbangMember, BetEntity bet) {
this.darakbangMember = darakbangMember;
this.bet = bet;
}

public void updateLastChat(Long lastReadChatId) {
this.lastReadChatId = lastReadChatId;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package mouda.backend.bet.implement;

import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;

import lombok.RequiredArgsConstructor;
import mouda.backend.bet.entity.BetDarakbangMemberEntity;
import mouda.backend.bet.infrastructure.BetDarakbangMemberRepository;
import mouda.backend.chat.exception.ChatErrorMessage;
import mouda.backend.chat.exception.ChatException;
import mouda.backend.darakbangmember.domain.DarakbangMember;

@Component
@RequiredArgsConstructor
public class BetDarakbangMemberWriter {

private final BetDarakbangMemberRepository betDarakbangMemberRepository;

public void updateLastReadChat(long betId, DarakbangMember darakbangMember, long lastReadChatId) {
BetDarakbangMemberEntity betDarakbangMemberEntity = betDarakbangMemberRepository
.findByBetIdAndDarakbangMemberId(betId, darakbangMember.getId())
.orElseThrow(
() -> new ChatException(HttpStatus.NOT_FOUND, ChatErrorMessage.BET_DARAKBANG_MEMBER_NOT_FOUND));
betDarakbangMemberEntity.updateLastChat(lastReadChatId);
}
}
11 changes: 11 additions & 0 deletions backend/src/main/java/mouda/backend/bet/implement/BetFinder.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,17 @@

import lombok.RequiredArgsConstructor;
import mouda.backend.bet.domain.Bet;
import mouda.backend.bet.domain.BetDetails;
import mouda.backend.bet.domain.Loser;
import mouda.backend.bet.domain.Participant;
import mouda.backend.bet.entity.BetDarakbangMemberEntity;
import mouda.backend.bet.entity.BetEntity;
import mouda.backend.bet.infrastructure.BetDarakbangMemberRepository;
import mouda.backend.bet.infrastructure.BetRepository;
import mouda.backend.darakbangmember.domain.DarakbangMember;

@Component
@Transactional
@RequiredArgsConstructor
public class BetFinder {

Expand Down Expand Up @@ -60,6 +63,7 @@ private Bet createBet(BetEntity betEntity) {
.betDetails(betEntity.toBetDetails())
.moimerId(betEntity.getMoimerId())
.loserId(betEntity.getLoserDarakbangMemberId())
.darakbangId(betEntity.getDarakbangId())
.participants(participants)
.build();
}
Expand All @@ -81,4 +85,11 @@ public Loser findResult(long darakbangId, long betId) {
return new Loser(betDarakbangMemberEntity.getDarakbangMember().getId(),
betDarakbangMemberEntity.getDarakbangMember().getNickname());
}

public List<BetDetails> readAllMyBets(DarakbangMember darakbangMember) {
return betDarakbangMemberRepository.findAllByDarakbangMemberId(darakbangMember.getId()).stream()
.map(BetDarakbangMemberEntity::getBet)
.map(BetEntity::toBetDetails)
.toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,13 @@ public interface BetDarakbangMemberRepository extends JpaRepository<BetDarakbang
List<BetDarakbangMemberEntity> findAllByBetId(Long id);

Optional<BetDarakbangMemberEntity> findByBetIdAndDarakbangMemberId(Long betId, Long loserDarakbangMemberId);

boolean existsByBetIdAndDarakbangMemberId(long betId, long darakbangMemberId);

List<BetDarakbangMemberEntity> findAllByDarakbangMemberId(Long id);

int countByBetId(long betId);

@Query("SELECT bdm.lastReadChatId FROM BetDarakbangMemberEntity bdm WHERE bdm.bet.id = :betId")
long findLastReadChatIdByBetId(@Param("betId") long betId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public record BetFindResponse(
BetRole myRole,
Long chatroomId
) {
public static BetFindResponse toResponse(Bet bet, DarakbangMember darakbangMember) {
public static BetFindResponse toResponse(Bet bet, DarakbangMember darakbangMember, Long chatroomId) {
List<ParticipantResponse> participants = bet.getParticipants().stream()
.map(ParticipantResponse::from)
.toList();
Expand All @@ -28,7 +28,7 @@ public static BetFindResponse toResponse(Bet bet, DarakbangMember darakbangMembe
bet.hasLoser(),
participants,
bet.getMyRole(darakbangMember.getId()),
null
chatroomId
);
}
}
Loading

0 comments on commit d3430cb

Please sign in to comment.