StockModel.fromYahooJson constructor

StockModel.fromYahooJson(
  1. Map<String, dynamic> json
)

Implementation

factory StockModel.fromYahooJson(Map<String, dynamic> json) {
  if (json['chart'] == null ||
      json['chart']['result'] == null ||
      json['chart']['result'].isEmpty) {
    throw Exception('Invalid data format from Yahoo Finance API');
  }
  final result = json['chart']['result'][0];
  final meta = result['meta'];
  final quote = result['indicators']['quote'][0];

  final regularMarketPrice = (meta['regularMarketPrice'] as num?)?.toDouble();
  final previousClose = (meta['chartPreviousClose'] as num?)?.toDouble() ??
      (meta['previousClose'] as num?)?.toDouble();

  // API에서 직접 제공하는 등락 정보를 우선 사용
  double? change = (meta['change'] as num?)?.toDouble();
  double? changeInPercent = (meta['changePercent'] as num?)?.toDouble();

  // 만약 API에서 등락 정보를 제공하지 않으면 직접 계산
  if (change == null || changeInPercent == null) {
    if (regularMarketPrice != null && previousClose != null && previousClose != 0) {
      change = regularMarketPrice - previousClose;
      changeInPercent = (change / previousClose) * 100;
    }
  }

  return StockModel(
    ticker: meta['symbol'],
    name: meta['shortName'] ?? meta['symbol'],
    currentPrice: regularMarketPrice ?? (quote['close']?.last as num?)?.toDouble() ?? 0.0,
    previousClose: previousClose,
    change: change,
    changeInPercent: changeInPercent,
    lastUpdated: DateTime.fromMillisecondsSinceEpoch((meta['regularMarketTime'] as int) * 1000),
  );
}