DateBalanceScheduler.java

package com.distasilucas.cryptobalancetracker.scheduler;

import com.distasilucas.cryptobalancetracker.entity.DateBalance;
import com.distasilucas.cryptobalancetracker.repository.DateBalanceRepository;
import com.distasilucas.cryptobalancetracker.service.InsightsService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.Clock;
import java.time.LocalDate;

@Slf4j
@Component
@RequiredArgsConstructor
public class DateBalanceScheduler {

    private final DateBalanceRepository dateBalancesRepository;
    private final InsightsService insightsService;
    private final Clock clock;

    @Scheduled(cron = "${save-day-balance-cron}")
    public void saveDateBalance() {
        log.info("Running cron to save daily balance");

        var now = LocalDate.now(clock);
        var totalBalances = insightsService.retrieveTotalBalancesInsights();
        var optionalDateBalance = dateBalancesRepository.findDateBalanceByDate(now);

        optionalDateBalance.ifPresentOrElse(dateBalance -> {
            var updatedDateBalances = new DateBalance(dateBalance.getId(), now, totalBalances);
            log.info("Updating balances for date {}. Old Balance: {}. New balances {}", now, dateBalance, updatedDateBalances);
            dateBalancesRepository.save(updatedDateBalances);
        }, () -> {
            log.info("Saving balances {} for date {}", totalBalances, now);
            dateBalancesRepository.save(new DateBalance(now, totalBalances));
        });
    }
}