diff --git a/src/main/java/grep/neogulcoder/domain/buddy/entity/BuddyEnergy.java b/src/main/java/grep/neogulcoder/domain/buddy/entity/BuddyEnergy.java index 984417f6..f030a94e 100644 --- a/src/main/java/grep/neogulcoder/domain/buddy/entity/BuddyEnergy.java +++ b/src/main/java/grep/neogulcoder/domain/buddy/entity/BuddyEnergy.java @@ -43,9 +43,16 @@ public void updateLevel(int newLevel) { // 리뷰 타입 기반 에너지 변경 // public void updateEnergy(ReviewType reviewType) { if (reviewType == ReviewType.GOOD || reviewType == ReviewType.EXCELLENT) { - this.level += 1; + this.level += BuddyEnergyReason.POSITIVE_REVIEW.getPoint(); } else if (reviewType == ReviewType.BAD) { - this.level -= 1; + this.level += BuddyEnergyReason.NEGATIVE_REVIEW.getPoint(); + } + } + + public void updateEnergy(boolean isLeader) { + this.level += BuddyEnergyReason.STUDY_DONE.getPoint(); + if (isLeader) { + this.level += BuddyEnergyReason.TEAM_LEADER_BONUS.getPoint(); } } diff --git a/src/main/java/grep/neogulcoder/domain/buddy/repository/BuddyEnergyRepository.java b/src/main/java/grep/neogulcoder/domain/buddy/repository/BuddyEnergyRepository.java index 6bbbcbc0..76550fd3 100644 --- a/src/main/java/grep/neogulcoder/domain/buddy/repository/BuddyEnergyRepository.java +++ b/src/main/java/grep/neogulcoder/domain/buddy/repository/BuddyEnergyRepository.java @@ -1,6 +1,9 @@ package grep.neogulcoder.domain.buddy.repository; import grep.neogulcoder.domain.buddy.entity.BuddyEnergy; + +import java.util.Collection; +import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -9,4 +12,5 @@ public interface BuddyEnergyRepository extends JpaRepository { Optional findByUserId(Long userId); + List findAllByUserIdIn(Collection userIds); } diff --git a/src/main/java/grep/neogulcoder/domain/buddy/service/BuddyEnergyService.java b/src/main/java/grep/neogulcoder/domain/buddy/service/BuddyEnergyService.java index eda79168..4c56c5be 100644 --- a/src/main/java/grep/neogulcoder/domain/buddy/service/BuddyEnergyService.java +++ b/src/main/java/grep/neogulcoder/domain/buddy/service/BuddyEnergyService.java @@ -46,23 +46,14 @@ public BuddyEnergyResponse updateEnergyByReview(Long userId, ReviewType reviewTy // 스터디 종료 시 +1, 리더면 +2 @Transactional - public BuddyEnergyResponse updateEnergyByStudy(Long userId, boolean isLeader) { - BuddyEnergy energy = buddyEnergyRepository.findByUserId(userId) - .orElseThrow(() -> new BuddyEnergyNotFoundException(BUDDY_ENERGY_NOT_FOUND)); - - int points = BuddyEnergyReason.STUDY_DONE.getPoint(); - BuddyEnergyReason reason = BuddyEnergyReason.STUDY_DONE; + public void updateEnergyByStudy(BuddyEnergy energy, boolean isLeader) { + energy.updateEnergy(isLeader); + buddyEnergyLogRepository.save(BuddyLog.of(energy, BuddyEnergyReason.STUDY_DONE)); if (isLeader) { - points += BuddyEnergyReason.TEAM_LEADER_BONUS.getPoint(); - reason = BuddyEnergyReason.TEAM_LEADER_BONUS; + buddyEnergyLogRepository.save(BuddyLog.of(energy, BuddyEnergyReason.TEAM_LEADER_BONUS)); } - - energy.updateLevel(energy.getLevel() + points); - buddyEnergyLogRepository.save(BuddyLog.of(energy, reason)); - buddyEnergyRepository.save(energy); - - return BuddyEnergyResponse.from(energy); + BuddyEnergyResponse.from(energy); } // 회원가입 시 기본 에너지 생성 diff --git a/src/main/java/grep/neogulcoder/domain/study/repository/StudyMemberQueryRepository.java b/src/main/java/grep/neogulcoder/domain/study/repository/StudyMemberQueryRepository.java index 1f6963d3..6811d2aa 100644 --- a/src/main/java/grep/neogulcoder/domain/study/repository/StudyMemberQueryRepository.java +++ b/src/main/java/grep/neogulcoder/domain/study/repository/StudyMemberQueryRepository.java @@ -129,9 +129,11 @@ public List findActivatedMembersByStudyIds(List studyIds) { return queryFactory .selectFrom(studyMember) .join(studyMember.study, study).fetchJoin() + .join(user).on(user.id.eq(studyMember.userId)).fetchJoin() .where( studyMember.study.id.in(studyIds), - studyMember.activated.isTrue() + studyMember.activated.isTrue(), + user.activated.isTrue() ) .fetch(); } diff --git a/src/main/java/grep/neogulcoder/domain/study/repository/StudyMemberRepository.java b/src/main/java/grep/neogulcoder/domain/study/repository/StudyMemberRepository.java index 7d47d351..ebedb1a9 100644 --- a/src/main/java/grep/neogulcoder/domain/study/repository/StudyMemberRepository.java +++ b/src/main/java/grep/neogulcoder/domain/study/repository/StudyMemberRepository.java @@ -29,8 +29,6 @@ public interface StudyMemberRepository extends JpaRepository @Query("update StudyMember m set m.activated = false where m.study.id = :studyId") void deactivateByStudyId(@Param("studyId") Long studyId); - Optional findByStudyIdAndUserId(Long studyId, Long userId); - Optional findByStudyIdAndUserIdAndActivatedTrue(Long studyId, Long userId); @Query("select m from StudyMember m where m.study.id = :studyId and m.role = 'MEMBER' and m.activated = true") diff --git a/src/main/java/grep/neogulcoder/domain/study/service/StudyManagementService.java b/src/main/java/grep/neogulcoder/domain/study/service/StudyManagementService.java index 5b6e00ce..0e392bac 100644 --- a/src/main/java/grep/neogulcoder/domain/study/service/StudyManagementService.java +++ b/src/main/java/grep/neogulcoder/domain/study/service/StudyManagementService.java @@ -175,7 +175,7 @@ private Study getStudyById(Long studyId) { } private StudyMember getStudyMemberById(Long studyId, Long userId) { - return studyMemberRepository.findByStudyIdAndUserId(studyId, userId) + return studyMemberRepository.findByStudyIdAndUserIdAndActivatedTrue(studyId, userId) .orElseThrow(() -> new NotFoundException(STUDY_MEMBER_NOT_FOUND)); } diff --git a/src/main/java/grep/neogulcoder/domain/study/service/StudySchedulerService.java b/src/main/java/grep/neogulcoder/domain/study/service/StudySchedulerService.java index 57f3c876..1523e98d 100644 --- a/src/main/java/grep/neogulcoder/domain/study/service/StudySchedulerService.java +++ b/src/main/java/grep/neogulcoder/domain/study/service/StudySchedulerService.java @@ -1,11 +1,12 @@ package grep.neogulcoder.domain.study.service; +import grep.neogulcoder.domain.buddy.entity.BuddyEnergy; +import grep.neogulcoder.domain.buddy.repository.BuddyEnergyRepository; import grep.neogulcoder.domain.buddy.service.BuddyEnergyService; import grep.neogulcoder.domain.study.Study; import grep.neogulcoder.domain.study.StudyMember; import grep.neogulcoder.domain.study.event.StudyExtensionReminderEvent; import grep.neogulcoder.domain.study.repository.StudyMemberQueryRepository; -import grep.neogulcoder.domain.study.repository.StudyMemberRepository; import grep.neogulcoder.domain.study.repository.StudyRepository; import lombok.RequiredArgsConstructor; import org.springframework.context.ApplicationEventPublisher; @@ -16,6 +17,7 @@ import java.time.LocalDateTime; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; @Transactional(readOnly = true) @@ -25,9 +27,9 @@ public class StudySchedulerService { private final StudyRepository studyRepository; private final BuddyEnergyService buddyEnergyService; - private final StudyMemberRepository studyMemberRepository; private final ApplicationEventPublisher eventPublisher; private final StudyMemberQueryRepository studyMemberQueryRepository; + private final BuddyEnergyRepository buddyEnergyRepository; @Transactional public void findStudiesEndingIn7Days() { @@ -48,14 +50,15 @@ public void finalizeStudies() { List studiesToBeFinished = studyRepository.findStudiesToBeFinished(now); Map> memberMap = getActivatedMemberMap(studiesToBeFinished); + Map energyMap = getBuddyEnergyMap(memberMap); for (Study study : studiesToBeFinished) { study.finish(); - // 스터디 멤버들 조회 후 버디에너지 업데이트 List members = memberMap.getOrDefault(study.getId(), List.of()); for (StudyMember member : members) { - buddyEnergyService.updateEnergyByStudy(member.getUserId(), member.isLeader()); + BuddyEnergy energy = energyMap.get(member.getUserId()); + buddyEnergyService.updateEnergyByStudy(energy, member.isLeader()); } } } @@ -70,4 +73,19 @@ private Map> getActivatedMemberMap(List studies) return allActivatedMembers.stream() .collect(Collectors.groupingBy(studyMember -> studyMember.getStudy().getId())); } + + private Map getBuddyEnergyMap(Map> memberMap) { + Set userIds = memberMap.values().stream() + .flatMap(List::stream) + .map(StudyMember::getUserId) + .collect(Collectors.toSet()); + + Map energyMap = buddyEnergyRepository.findAllByUserIdIn(userIds).stream() + .collect(Collectors.toMap( + BuddyEnergy::getUserId, + energy -> energy + )); + + return energyMap; + } } diff --git a/src/main/java/grep/neogulcoder/domain/study/service/StudyService.java b/src/main/java/grep/neogulcoder/domain/study/service/StudyService.java index b97b427c..e4e33ae6 100644 --- a/src/main/java/grep/neogulcoder/domain/study/service/StudyService.java +++ b/src/main/java/grep/neogulcoder/domain/study/service/StudyService.java @@ -38,11 +38,10 @@ import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.List; -import java.util.Optional; -import static grep.neogulcoder.domain.study.enums.StudyMemberRole.*; +import static grep.neogulcoder.domain.study.enums.StudyMemberRole.LEADER; import static grep.neogulcoder.domain.study.exception.code.StudyErrorCode.*; -import static grep.neogulcoder.domain.users.exception.code.UserErrorCode.*; +import static grep.neogulcoder.domain.users.exception.code.UserErrorCode.USER_NOT_FOUND; @Transactional(readOnly = true) @RequiredArgsConstructor @@ -179,7 +178,7 @@ private Study getStudyById(Long studyId) { } private StudyMember getStudyMemberById(Long studyId, Long userId) { - return Optional.ofNullable(studyMemberQueryRepository.findByStudyIdAndUserId(studyId, userId)) + return studyMemberRepository.findByStudyIdAndUserIdAndActivatedTrue(studyId, userId) .orElseThrow(() -> new NotFoundException(STUDY_MEMBER_NOT_FOUND)); }