61 lines
1.9 KiB
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;
|
|
}
|
|
}
|
|
}
|