From 722f6f132a064857d8d7ce66820388b1860c0df7 Mon Sep 17 00:00:00 2001 From: Max <51083570+DRdrProfessor@users.noreply.github.com> Date: Thu, 15 Jun 2023 20:04:15 +0200 Subject: [PATCH] Added feedcache for fetching feed items to give every item a parent. --- SharpRss/Core/FeedCache.cs | 26 +++++++++++++++++++++++++ SharpRss/DbAccess.cs | 6 ++++++ SharpRss/Models/FeedItemModel.cs | 1 + SharpRss/Models/FeedModel.cs | 7 +++++++ SharpRss/Services/SyndicationService.cs | 2 +- SharpRss/SharpRss.csproj | 4 ---- 6 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 SharpRss/Core/FeedCache.cs diff --git a/SharpRss/Core/FeedCache.cs b/SharpRss/Core/FeedCache.cs new file mode 100644 index 0000000..d43a2ff --- /dev/null +++ b/SharpRss/Core/FeedCache.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; +using System.Linq; +using SharpRss.Models; +using SharpRss.Services; + +namespace SharpRss.Core +{ + public class FeedCache + { + public FeedCache() + { + FetchFeeds(); + } + private readonly SyndicationService _syndicationService = new SyndicationService(); + private Dictionary _cachedFeeds = new Dictionary(); + + private async void FetchFeeds() + { + HashSet fetchedFeeds = await _syndicationService.GetFeedsAsync(); + _cachedFeeds = fetchedFeeds.ToDictionary(x => x.EncodedUrl); + } + + public FeedModel? CacheFeed(string encodedUrl) => _cachedFeeds.TryGetValue(encodedUrl, out FeedModel model) ? model : null; + + } +} \ No newline at end of file diff --git a/SharpRss/DbAccess.cs b/SharpRss/DbAccess.cs index 357689c..ffc983b 100644 --- a/SharpRss/DbAccess.cs +++ b/SharpRss/DbAccess.cs @@ -7,7 +7,9 @@ using System.Threading.Tasks; using Dapper; using Microsoft.Data.Sqlite; using Serilog; +using SharpRss.Core; using SharpRss.Models; +using ToolQit.Containers; namespace SharpRss { @@ -187,11 +189,13 @@ namespace SharpRss } dbTransaction.Commit(); } + public static async Task> GetFeedItemsAsync(string[]? encodedFeedUrls) { await using SqliteConnection dbc = new SqliteConnection(ConnectionString); dbc.Open(); HashSet items = new HashSet(); + FeedCache fCache = new FeedCache(); await using DbDataReader reader = await dbc.ExecuteReaderAsync(encodedFeedUrls == null ? "SELECT * FROM feed_item" : $"SELECT * FROM feed_item WHERE encoded_feed_url IN({FormatParametersFromArray(encodedFeedUrls)})"); //NOTE(dbg): While debugging this part of the function the code below (Reader.ReadAsync) will return 0, because the debugger already reads the items from the reader. while (await reader.ReadAsync()) @@ -210,6 +214,8 @@ namespace SharpRss Categories = reader["categories"].ToString().Split(','), Content = reader["content"].ToString() }; + feedItemModel.ParentFeed = fCache.CacheFeed(feedItemModel.EncodedFeedUrl); + // Get feed items.Add(feedItemModel); } Log.Debug("Fetching feed items resulted: {ItemCount} item(s)", items.Count); diff --git a/SharpRss/Models/FeedItemModel.cs b/SharpRss/Models/FeedItemModel.cs index b92151a..a843376 100644 --- a/SharpRss/Models/FeedItemModel.cs +++ b/SharpRss/Models/FeedItemModel.cs @@ -4,6 +4,7 @@ namespace SharpRss.Models { public class FeedItemModel { + public FeedModel? ParentFeed { get; set; } public string? Id { get; set; } = string.Empty; public string EncodedFeedUrl { get; set; } = string.Empty; public bool Read { get; set; } diff --git a/SharpRss/Models/FeedModel.cs b/SharpRss/Models/FeedModel.cs index af3a8a8..595e10a 100644 --- a/SharpRss/Models/FeedModel.cs +++ b/SharpRss/Models/FeedModel.cs @@ -33,5 +33,12 @@ namespace SharpRss.Models _imageUrl = value; } } + + public override bool Equals(object obj) + { + if (obj is FeedModel objModel) + return EncodedUrl.Equals(objModel.EncodedUrl); + return false; + } } } diff --git a/SharpRss/Services/SyndicationService.cs b/SharpRss/Services/SyndicationService.cs index aa89029..ad7cfa3 100644 --- a/SharpRss/Services/SyndicationService.cs +++ b/SharpRss/Services/SyndicationService.cs @@ -57,7 +57,7 @@ namespace SharpRss.Services public async Task> GetFeedsAsync(string? categoryId = null) => await DbAccess.GetFeedsAsync(categoryId == null ? null : new[]{ categoryId }); public async Task> GetUngroupedFeedsAsync() => await DbAccess.GetFeedsAsync(new []{""}); public async Task> GetFeedItemsAsync(string feedId, string? groupId = null) => await GetFeedItemsFromFeedsAsync(new[] { feedId }, groupId); - public async Task> GetFeedItemsFromFeedsAsync(string[] feedIds, string? groupId = null) + public async Task> GetFeedItemsFromFeedsAsync(string[] feedIds, string? categoryId = null) { var items = await DbAccess.GetFeedItemsAsync(feedIds); return items; diff --git a/SharpRss/SharpRss.csproj b/SharpRss/SharpRss.csproj index 1da7f5a..52fbb39 100644 --- a/SharpRss/SharpRss.csproj +++ b/SharpRss/SharpRss.csproj @@ -22,8 +22,4 @@ - - - -