news page

This commit is contained in:
Phuoc Nguyen
2025-11-03 11:48:41 +07:00
parent 21c1c3372c
commit ea485d8c3a
14 changed files with 2017 additions and 13 deletions

View File

@@ -0,0 +1,87 @@
/// Repository Implementation: News Repository
///
/// Concrete implementation of the NewsRepository interface.
/// Coordinates between local and remote data sources.
library;
import 'package:worker/features/news/data/datasources/news_local_datasource.dart';
import 'package:worker/features/news/domain/entities/news_article.dart';
import 'package:worker/features/news/domain/repositories/news_repository.dart';
/// News Repository Implementation
class NewsRepositoryImpl implements NewsRepository {
/// Local data source
final NewsLocalDataSource localDataSource;
/// Constructor
NewsRepositoryImpl({required this.localDataSource});
@override
Future<List<NewsArticle>> getAllArticles() async {
try {
final models = await localDataSource.getAllArticles();
final entities = models.map((model) => model.toEntity()).toList();
// Sort by published date (newest first)
entities.sort((a, b) => b.publishedDate.compareTo(a.publishedDate));
return entities;
} catch (e) {
print('[NewsRepository] Error getting articles: $e');
return [];
}
}
@override
Future<NewsArticle?> getFeaturedArticle() async {
try {
final model = await localDataSource.getFeaturedArticle();
return model?.toEntity();
} catch (e) {
print('[NewsRepository] Error getting featured article: $e');
return null;
}
}
@override
Future<List<NewsArticle>> getArticlesByCategory(NewsCategory category) async {
try {
final categoryString = category.filterName;
final models = await localDataSource.getArticlesByCategory(
categoryString,
);
final entities = models.map((model) => model.toEntity()).toList();
// Sort by published date (newest first)
entities.sort((a, b) => b.publishedDate.compareTo(a.publishedDate));
return entities;
} catch (e) {
print('[NewsRepository] Error getting articles by category: $e');
return [];
}
}
@override
Future<NewsArticle?> getArticleById(String articleId) async {
try {
final model = await localDataSource.getArticleById(articleId);
return model?.toEntity();
} catch (e) {
print('[NewsRepository] Error getting article by id: $e');
return null;
}
}
@override
Future<List<NewsArticle>> refreshArticles() async {
try {
await localDataSource.clearCache();
return getAllArticles();
} catch (e) {
print('[NewsRepository] Error refreshing articles: $e');
return [];
}
}
}