Skip to content

Commit 8bf4b17

Browse files
authored
Merge pull request #303 from prgrms-web-devcourse-final-project/refactor/EA3-195-study
[EA3-195] refactor: 스터디 종료 로직 수정 및 쿼리 수정
2 parents f54880b + c070d8c commit 8bf4b17

File tree

8 files changed

+47
-28
lines changed

8 files changed

+47
-28
lines changed

src/main/java/grep/neogulcoder/domain/buddy/entity/BuddyEnergy.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,16 @@ public void updateLevel(int newLevel) {
4343
// 리뷰 타입 기반 에너지 변경 //
4444
public void updateEnergy(ReviewType reviewType) {
4545
if (reviewType == ReviewType.GOOD || reviewType == ReviewType.EXCELLENT) {
46-
this.level += 1;
46+
this.level += BuddyEnergyReason.POSITIVE_REVIEW.getPoint();
4747
} else if (reviewType == ReviewType.BAD) {
48-
this.level -= 1;
48+
this.level += BuddyEnergyReason.NEGATIVE_REVIEW.getPoint();
49+
}
50+
}
51+
52+
public void updateEnergy(boolean isLeader) {
53+
this.level += BuddyEnergyReason.STUDY_DONE.getPoint();
54+
if (isLeader) {
55+
this.level += BuddyEnergyReason.TEAM_LEADER_BONUS.getPoint();
4956
}
5057
}
5158

src/main/java/grep/neogulcoder/domain/buddy/repository/BuddyEnergyRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package grep.neogulcoder.domain.buddy.repository;
22

33
import grep.neogulcoder.domain.buddy.entity.BuddyEnergy;
4+
5+
import java.util.Collection;
6+
import java.util.List;
47
import java.util.Optional;
58
import org.springframework.data.jpa.repository.JpaRepository;
69
import org.springframework.stereotype.Repository;
@@ -9,4 +12,5 @@
912
public interface BuddyEnergyRepository extends JpaRepository<BuddyEnergy, Long> {
1013
Optional<BuddyEnergy> findByUserId(Long userId);
1114

15+
List<BuddyEnergy> findAllByUserIdIn(Collection<Long> userIds);
1216
}

src/main/java/grep/neogulcoder/domain/buddy/service/BuddyEnergyService.java

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -46,23 +46,14 @@ public BuddyEnergyResponse updateEnergyByReview(Long userId, ReviewType reviewTy
4646

4747
// 스터디 종료 시 +1, 리더면 +2
4848
@Transactional
49-
public BuddyEnergyResponse updateEnergyByStudy(Long userId, boolean isLeader) {
50-
BuddyEnergy energy = buddyEnergyRepository.findByUserId(userId)
51-
.orElseThrow(() -> new BuddyEnergyNotFoundException(BUDDY_ENERGY_NOT_FOUND));
52-
53-
int points = BuddyEnergyReason.STUDY_DONE.getPoint();
54-
BuddyEnergyReason reason = BuddyEnergyReason.STUDY_DONE;
49+
public void updateEnergyByStudy(BuddyEnergy energy, boolean isLeader) {
50+
energy.updateEnergy(isLeader);
5551

52+
buddyEnergyLogRepository.save(BuddyLog.of(energy, BuddyEnergyReason.STUDY_DONE));
5653
if (isLeader) {
57-
points += BuddyEnergyReason.TEAM_LEADER_BONUS.getPoint();
58-
reason = BuddyEnergyReason.TEAM_LEADER_BONUS;
54+
buddyEnergyLogRepository.save(BuddyLog.of(energy, BuddyEnergyReason.TEAM_LEADER_BONUS));
5955
}
60-
61-
energy.updateLevel(energy.getLevel() + points);
62-
buddyEnergyLogRepository.save(BuddyLog.of(energy, reason));
63-
buddyEnergyRepository.save(energy);
64-
65-
return BuddyEnergyResponse.from(energy);
56+
BuddyEnergyResponse.from(energy);
6657
}
6758

6859
// 회원가입 시 기본 에너지 생성

src/main/java/grep/neogulcoder/domain/study/repository/StudyMemberQueryRepository.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,11 @@ public List<StudyMember> findActivatedMembersByStudyIds(List<Long> studyIds) {
129129
return queryFactory
130130
.selectFrom(studyMember)
131131
.join(studyMember.study, study).fetchJoin()
132+
.join(user).on(user.id.eq(studyMember.userId)).fetchJoin()
132133
.where(
133134
studyMember.study.id.in(studyIds),
134-
studyMember.activated.isTrue()
135+
studyMember.activated.isTrue(),
136+
user.activated.isTrue()
135137
)
136138
.fetch();
137139
}

src/main/java/grep/neogulcoder/domain/study/repository/StudyMemberRepository.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@ public interface StudyMemberRepository extends JpaRepository<StudyMember, Long>
2929
@Query("update StudyMember m set m.activated = false where m.study.id = :studyId")
3030
void deactivateByStudyId(@Param("studyId") Long studyId);
3131

32-
Optional<StudyMember> findByStudyIdAndUserId(Long studyId, Long userId);
33-
3432
Optional<StudyMember> findByStudyIdAndUserIdAndActivatedTrue(Long studyId, Long userId);
3533

3634
@Query("select m from StudyMember m where m.study.id = :studyId and m.role = 'MEMBER' and m.activated = true")

src/main/java/grep/neogulcoder/domain/study/service/StudyManagementService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ private Study getStudyById(Long studyId) {
175175
}
176176

177177
private StudyMember getStudyMemberById(Long studyId, Long userId) {
178-
return studyMemberRepository.findByStudyIdAndUserId(studyId, userId)
178+
return studyMemberRepository.findByStudyIdAndUserIdAndActivatedTrue(studyId, userId)
179179
.orElseThrow(() -> new NotFoundException(STUDY_MEMBER_NOT_FOUND));
180180
}
181181

src/main/java/grep/neogulcoder/domain/study/service/StudySchedulerService.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package grep.neogulcoder.domain.study.service;
22

3+
import grep.neogulcoder.domain.buddy.entity.BuddyEnergy;
4+
import grep.neogulcoder.domain.buddy.repository.BuddyEnergyRepository;
35
import grep.neogulcoder.domain.buddy.service.BuddyEnergyService;
46
import grep.neogulcoder.domain.study.Study;
57
import grep.neogulcoder.domain.study.StudyMember;
68
import grep.neogulcoder.domain.study.event.StudyExtensionReminderEvent;
79
import grep.neogulcoder.domain.study.repository.StudyMemberQueryRepository;
8-
import grep.neogulcoder.domain.study.repository.StudyMemberRepository;
910
import grep.neogulcoder.domain.study.repository.StudyRepository;
1011
import lombok.RequiredArgsConstructor;
1112
import org.springframework.context.ApplicationEventPublisher;
@@ -16,6 +17,7 @@
1617
import java.time.LocalDateTime;
1718
import java.util.List;
1819
import java.util.Map;
20+
import java.util.Set;
1921
import java.util.stream.Collectors;
2022

2123
@Transactional(readOnly = true)
@@ -25,9 +27,9 @@ public class StudySchedulerService {
2527

2628
private final StudyRepository studyRepository;
2729
private final BuddyEnergyService buddyEnergyService;
28-
private final StudyMemberRepository studyMemberRepository;
2930
private final ApplicationEventPublisher eventPublisher;
3031
private final StudyMemberQueryRepository studyMemberQueryRepository;
32+
private final BuddyEnergyRepository buddyEnergyRepository;
3133

3234
@Transactional
3335
public void findStudiesEndingIn7Days() {
@@ -48,14 +50,15 @@ public void finalizeStudies() {
4850
List<Study> studiesToBeFinished = studyRepository.findStudiesToBeFinished(now);
4951

5052
Map<Long, List<StudyMember>> memberMap = getActivatedMemberMap(studiesToBeFinished);
53+
Map<Long, BuddyEnergy> energyMap = getBuddyEnergyMap(memberMap);
5154

5255
for (Study study : studiesToBeFinished) {
5356
study.finish();
5457

55-
// 스터디 멤버들 조회 후 버디에너지 업데이트
5658
List<StudyMember> members = memberMap.getOrDefault(study.getId(), List.of());
5759
for (StudyMember member : members) {
58-
buddyEnergyService.updateEnergyByStudy(member.getUserId(), member.isLeader());
60+
BuddyEnergy energy = energyMap.get(member.getUserId());
61+
buddyEnergyService.updateEnergyByStudy(energy, member.isLeader());
5962
}
6063
}
6164
}
@@ -70,4 +73,19 @@ private Map<Long, List<StudyMember>> getActivatedMemberMap(List<Study> studies)
7073
return allActivatedMembers.stream()
7174
.collect(Collectors.groupingBy(studyMember -> studyMember.getStudy().getId()));
7275
}
76+
77+
private Map<Long, BuddyEnergy> getBuddyEnergyMap(Map<Long, List<StudyMember>> memberMap) {
78+
Set<Long> userIds = memberMap.values().stream()
79+
.flatMap(List::stream)
80+
.map(StudyMember::getUserId)
81+
.collect(Collectors.toSet());
82+
83+
Map<Long, BuddyEnergy> energyMap = buddyEnergyRepository.findAllByUserIdIn(userIds).stream()
84+
.collect(Collectors.toMap(
85+
BuddyEnergy::getUserId,
86+
energy -> energy
87+
));
88+
89+
return energyMap;
90+
}
7391
}

src/main/java/grep/neogulcoder/domain/study/service/StudyService.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,10 @@
3838
import java.time.LocalDateTime;
3939
import java.time.temporal.ChronoUnit;
4040
import java.util.List;
41-
import java.util.Optional;
4241

43-
import static grep.neogulcoder.domain.study.enums.StudyMemberRole.*;
42+
import static grep.neogulcoder.domain.study.enums.StudyMemberRole.LEADER;
4443
import static grep.neogulcoder.domain.study.exception.code.StudyErrorCode.*;
45-
import static grep.neogulcoder.domain.users.exception.code.UserErrorCode.*;
44+
import static grep.neogulcoder.domain.users.exception.code.UserErrorCode.USER_NOT_FOUND;
4645

4746
@Transactional(readOnly = true)
4847
@RequiredArgsConstructor
@@ -179,7 +178,7 @@ private Study getStudyById(Long studyId) {
179178
}
180179

181180
private StudyMember getStudyMemberById(Long studyId, Long userId) {
182-
return Optional.ofNullable(studyMemberQueryRepository.findByStudyIdAndUserId(studyId, userId))
181+
return studyMemberRepository.findByStudyIdAndUserIdAndActivatedTrue(studyId, userId)
183182
.orElseThrow(() -> new NotFoundException(STUDY_MEMBER_NOT_FOUND));
184183
}
185184

0 commit comments

Comments
 (0)