YahooFinanceService.java

package com.tdmconsult.ete.services.yahoo;

import com.tdmconsult.ete.masterdata.SecurityDto;
import com.tdmconsult.ete.masterdata.SecurityMapper;
import com.tdmconsult.ete.masterdata.SecurityYahooFinanceAddonRepository;
import com.tdmconsult.ete.services.yahoo.dto.QuoteSummaryResponse;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jspecify.annotations.Nullable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;

@Service
@RequiredArgsConstructor
@Slf4j
public class YahooFinanceService {

    private final RestTemplate yahooFinanceRestTemplate;
    private final SecurityYahooFinanceAddonRepository securityYahooFinanceAddonRepository;

    public @Nullable QuoteSummaryResponse queryQuoteSummary(final String symbol) {
        return yahooFinanceRestTemplate.getForObject(
                "quoteSummary/%s?modules=calendarEvents,summaryDetail".formatted(symbol),
                QuoteSummaryResponse.class);
    }

    public record UpcomingEarningsEvent(
            String publicId,
            long version,
            SecurityDto security,
            LocalDate earningsDate,
            boolean isConfirmed,
            LocalDateTime createdAt,
            LocalDateTime updatedAt) {
    }

    @Transactional(readOnly = true)
    public List<UpcomingEarningsEvent> getUpcomingEarningsEvents() {

        return securityYahooFinanceAddonRepository.findAll().stream()
                .filter(a -> a.getNextEarningsDate() != null)
                .filter(a -> !a.getNextEarningsDate().isBefore(LocalDate.now()))
                .map(a ->
                    new UpcomingEarningsEvent(
                            a.getPublicId(),
                            a.getVersion(),
                            SecurityMapper.toDto(a.getSecurity()),
                            a.getNextEarningsDate(),
                            !Boolean.TRUE.equals(a.getIsEarningsDateEstimate()),
                            a.getCreatedAt(),
                            a.getUpdatedAt()
                    )).toList();
    }
}