ReadingProgressHistoryInitializer.java
package qwerty.chaekit.global.init;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import qwerty.chaekit.domain.ebook.history.ReadingProgressHistory;
import qwerty.chaekit.domain.ebook.history.ReadingProgressHistoryRepository;
import qwerty.chaekit.domain.ebook.purchase.EbookPurchase;
import qwerty.chaekit.domain.ebook.purchase.repository.EbookPurchaseRepository;
import qwerty.chaekit.domain.group.activity.Activity;
import qwerty.chaekit.domain.group.activity.activitymember.ActivityMember;
import qwerty.chaekit.domain.group.activity.activitymember.ActivityMemberRepository;
import qwerty.chaekit.domain.group.activity.repository.ActivityRepository;
import java.time.LocalDate;
import java.util.List;
import java.util.Optional;
@Slf4j
@Component
@RequiredArgsConstructor
@Order(3)
public class ReadingProgressHistoryInitializer implements ApplicationRunner {
private final ActivityRepository activityRepository;
private final ActivityMemberRepository activityMemberRepository;
private final EbookPurchaseRepository ebookPurchaseRepository;
private final ReadingProgressHistoryRepository historyRepository;
@Override
@Transactional
public void run(ApplicationArguments args) throws Exception {
LocalDate yesterday = LocalDate.now().minusDays(1);
List<Activity> activeActivities = activityRepository
.findByStartTimeLessThanEqualAndEndTimeGreaterThanEqual(yesterday, yesterday);
for (Activity activity : activeActivities) {
List<ActivityMember> members = activityMemberRepository.findByActivity(activity);
for (ActivityMember member : members) {
log.info("activityId: {}, userId: {}", member.getActivity().getId(), member.getUser().getId());
boolean alreadyExists = historyRepository.existsByActivityAndUserAndCreatedAtBetween(
activity,
member.getUser(),
yesterday.plusDays(1).atStartOfDay(),
yesterday.plusDays(2).atStartOfDay()
);
if (!alreadyExists) {
Optional<EbookPurchase> purchaseOpt = ebookPurchaseRepository.findByUserAndEbook(
member.getUser(), activity.getBook());
long percentage = purchaseOpt.map(EbookPurchase::getPercentage).orElse(0L);
historyRepository.save(ReadingProgressHistory.builder()
.activity(activity)
.user(member.getUser())
.percentage(percentage)
.build());
}
}
}
}
}