Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -9,4 +12,5 @@
public interface BuddyEnergyRepository extends JpaRepository<BuddyEnergy, Long> {
Optional<BuddyEnergy> findByUserId(Long userId);

List<BuddyEnergy> findAllByUserIdIn(Collection<Long> userIds);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

// 회원가입 시 기본 에너지 생성
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,9 +129,11 @@ public List<StudyMember> findActivatedMembersByStudyIds(List<Long> 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();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,6 @@ public interface StudyMemberRepository extends JpaRepository<StudyMember, Long>
@Query("update StudyMember m set m.activated = false where m.study.id = :studyId")
void deactivateByStudyId(@Param("studyId") Long studyId);

Optional<StudyMember> findByStudyIdAndUserId(Long studyId, Long userId);

Optional<StudyMember> findByStudyIdAndUserIdAndActivatedTrue(Long studyId, Long userId);

@Query("select m from StudyMember m where m.study.id = :studyId and m.role = 'MEMBER' and m.activated = true")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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)
Expand All @@ -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() {
Expand All @@ -48,14 +50,15 @@ public void finalizeStudies() {
List<Study> studiesToBeFinished = studyRepository.findStudiesToBeFinished(now);

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

for (Study study : studiesToBeFinished) {
study.finish();

// 스터디 멤버들 조회 후 버디에너지 업데이트
List<StudyMember> 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());
}
}
}
Expand All @@ -70,4 +73,19 @@ private Map<Long, List<StudyMember>> getActivatedMemberMap(List<Study> studies)
return allActivatedMembers.stream()
.collect(Collectors.groupingBy(studyMember -> studyMember.getStudy().getId()));
}

private Map<Long, BuddyEnergy> getBuddyEnergyMap(Map<Long, List<StudyMember>> memberMap) {
Set<Long> userIds = memberMap.values().stream()
.flatMap(List::stream)
.map(StudyMember::getUserId)
.collect(Collectors.toSet());

Map<Long, BuddyEnergy> energyMap = buddyEnergyRepository.findAllByUserIdIn(userIds).stream()
.collect(Collectors.toMap(
BuddyEnergy::getUserId,
energy -> energy
));

return energyMap;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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));
}

Expand Down