import '../../core/utils/result.dart'; import '../models/post.dart'; import '../models/viewed_post.dart'; import '../repositories/post_repository.dart'; import '../repositories/viewed_post_repository.dart'; class ViewedHistoryService { ViewedHistoryService(this._repository, this._postRepository); final ViewedPostRepository _repository; final PostRepository _postRepository; Future> markViewed(Post post) async { final cacheResult = await _postRepository.cachePosts([post]); if (cacheResult is Error) return cacheResult; return _repository.markViewed(post.providerId, post.id); } Future> isViewed(String postId, String providerId) { return _repository.exists(providerId, postId); } Future>> getViewedKeys() { return _repository.keys(); } Future>> getViewedPosts() async { final viewedResult = await _repository.recent(); if (viewedResult is Error>) { return Error(viewedResult.failure); } final viewed = (viewedResult as Success>).data; return _postRepository.getCachedPostsByKeys( viewed.map((item) => item.viewedKey), ); } Future>> getViewedPostEntries() async { final viewedResult = await _repository.recent(); if (viewedResult is Error>) { return Error(viewedResult.failure); } final viewed = (viewedResult as Success>).data; final postsResult = await _postRepository.getCachedPostsByKeys( viewed.map((item) => item.viewedKey), ); if (postsResult is Error>) { return Error(postsResult.failure); } final postsByKey = { for (final post in (postsResult as Success>).data) post.cacheKey: post, }; return Success([ for (final item in viewed) if (postsByKey[item.viewedKey] != null) ViewedPostEntry( post: postsByKey[item.viewedKey]!, viewedAt: item.viewedAt), ]); } Future> deleteItem(String providerId, String postId) { return _repository.deleteItem(providerId, postId); } Future> clearHistory() { return _repository.clear(); } } class ViewedPostEntry { const ViewedPostEntry({required this.post, required this.viewedAt}); final Post post; final DateTime viewedAt; }