import 'package:equatable/equatable.dart'; import 'finbert_result_model.dart'; import 'matched_asset_model.dart'; class NewsArticleModel extends Equatable { final String id; final String title; final String author; final String summary; final String contentRaw; final String sourceUrl; final DateTime scrapedAt; final DateTime publishedAt; final String status; // Flatted sentiment properties final String sentiment; final double sentimentScore; final double confidence; final FinbertResultModel? finbertResult; final List matchedAssets; const NewsArticleModel({ required this.id, required this.title, required this.author, required this.summary, required this.contentRaw, required this.sourceUrl, required this.scrapedAt, required this.publishedAt, required this.status, required this.sentiment, required this.sentimentScore, required this.confidence, this.finbertResult, this.matchedAssets = const [], }); factory NewsArticleModel.fromJson(Map json) { List assets = []; final mList = json['matchedAssets']; if (mList != null && mList is List) { assets = mList .whereType>() .map((e) => MatchedAssetModel.fromJson(e)) .toList(); } return NewsArticleModel( id: json['id']?.toString() ?? '', title: json['title']?.toString() ?? 'No Title', author: json['author']?.toString() ?? 'Unknown', summary: json['summary']?.toString() ?? '', contentRaw: json['contentRaw']?.toString() ?? '', sourceUrl: json['sourceUrl']?.toString() ?? '', scrapedAt: DateTime.tryParse(json['scrapedAt']?.toString() ?? '') ?? DateTime.now(), publishedAt: DateTime.tryParse(json['publishedAt']?.toString() ?? '') ?? DateTime.now(), status: json['status']?.toString() ?? 'Completed', sentiment: json['sentiment']?.toString() ?? '', sentimentScore: (json['sentimentScore'] as num?)?.toDouble() ?? 0.0, confidence: (json['confidence'] as num?)?.toDouble() ?? 0.0, finbertResult: json['finbertResult'] != null ? FinbertResultModel.fromJson(json['finbertResult'] as Map) : null, matchedAssets: assets, ); } Map toJson() { return { 'id': id, 'title': title, 'author': author, 'summary': summary, 'contentRaw': contentRaw, 'sourceUrl': sourceUrl, 'scrapedAt': scrapedAt.toIso8601String(), 'publishedAt': publishedAt.toIso8601String(), 'status': status, 'sentiment': sentiment, 'sentimentScore': sentimentScore, 'confidence': confidence, 'finbertResult': finbertResult != null ? { 'label': finbertResult!.label, 'score': finbertResult!.score, 'positiveProbability': finbertResult!.positiveProbability, 'negativeProbability': finbertResult!.negativeProbability, 'neutralProbability': finbertResult!.neutralProbability, 'processingTimeMs': finbertResult!.processingTimeMs, } : null, }; } @override List get props => [ id, title, author, summary, contentRaw, sourceUrl, scrapedAt, publishedAt, status, sentiment, sentimentScore, confidence, finbertResult, ]; }