Auger/lib/models/watched_stock.dart

61 lines
1.9 KiB
Dart

import "package:capstone_project/models/event_signal.dart";
import "package:capstone_project/utils/agrigator.dart";
class WatchedStock {
final String ticker;
final String companyName;
EventSignal? latestSignal;
List<EventSignal> signalHistory;
WatchedStock({
required this.ticker,
required this.companyName,
this.latestSignal,
List<EventSignal>? signalHistory,
}) : signalHistory = signalHistory ?? [];
factory WatchedStock.fromJson(Map<String, dynamic> json) {
final signalHistoryJson = (json["signalHistory"] as List? ?? [])
.whereType<Map<String, dynamic>>()
.map(_eventSignalFromStoredJson)
.whereType<EventSignal>()
.toList();
final latestSignalJson = json["latestSignal"];
final latest = latestSignalJson is Map<String, dynamic>
? _eventSignalFromStoredJson(latestSignalJson)
: null;
return WatchedStock(
ticker: (json["ticker"] ?? "").toString(),
companyName: (json["companyName"] ?? "").toString(),
latestSignal: latest ?? (signalHistoryJson.isNotEmpty ? signalHistoryJson.first : null),
signalHistory: signalHistoryJson,
);
}
Map<String, dynamic> toJson() {
return {
"ticker": ticker,
"companyName": companyName,
"latestSignal": latestSignal?.toJson(),
"signalHistory": signalHistory.map((signal) => signal.toJson()).toList(),
};
}
// returns null (and logs) when the stored payload is from the pre-rework
// schema — we'd rather drop it than invent impact/direction values.
static EventSignal? _eventSignalFromStoredJson(Map<String, dynamic> json) {
final articles = (json["articles"] as List? ?? [])
.whereType<Map<String, dynamic>>()
.map(FeedItem.fromJson)
.toList();
try {
return EventSignal.fromJson(json, articles);
} on LegacySignalException catch (e) {
print("[watched_stock] dropping legacy signal: ${e.message}");
return null;
}
}
}