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();
}
}