From 87f46e2178891b275ab9ebd3efcbb9803038c9d3 Mon Sep 17 00:00:00 2001 From: Max <51083570+DRdrProfessor@users.noreply.github.com> Date: Fri, 12 May 2023 23:58:49 +0200 Subject: [PATCH] Working on feed caching & models. --- SharpRss/FeedCache.cs | 42 ++++++++++++++ SharpRss/Models/CategoryModel.cs | 19 ++++-- SharpRss/Models/FeedModel.cs | 46 ++++++++++++--- .../Models/IGuideItem.cs | 4 +- SharpRss/RssService.cs | 20 ++++++- WebSharpRSS/Bootstrapper.cs | 14 ++++- WebSharpRSS/Models/CategoryGuideItem.cs | 22 ------- WebSharpRSS/Models/CategoryItem.cs | 15 ----- WebSharpRSS/Models/FeedGuideItem.cs | 15 ----- WebSharpRSS/Program.cs | 3 +- WebSharpRSS/Settings.json | 12 ++++ WebSharpRSS/Shared/CategoryGuide.razor | 58 +++++++++++-------- WebSharpRSS/Shared/SideGuide.razor | 18 +++--- WebSharpRSS/WebSharpRSS.csproj | 5 ++ 14 files changed, 188 insertions(+), 105 deletions(-) create mode 100644 SharpRss/FeedCache.cs rename WebSharpRSS/Models/ISelectableGuideItem.cs => SharpRss/Models/IGuideItem.cs (59%) delete mode 100644 WebSharpRSS/Models/CategoryGuideItem.cs delete mode 100644 WebSharpRSS/Models/CategoryItem.cs delete mode 100644 WebSharpRSS/Models/FeedGuideItem.cs create mode 100644 WebSharpRSS/Settings.json diff --git a/SharpRss/FeedCache.cs b/SharpRss/FeedCache.cs new file mode 100644 index 0000000..62809cd --- /dev/null +++ b/SharpRss/FeedCache.cs @@ -0,0 +1,42 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using CodeHollow.FeedReader; +using Serilog; +using ToolQit.Extensions; + +namespace SharpRss +{ + /// + /// Global memory feed cache. + /// + public static class FeedCache + { + private static readonly Dictionary CachedFeeds = new Dictionary(); + + public static async Task GetFeed(string urlKey) + { + Log.Verbose("Request for: {UrlKey}", urlKey); + if (urlKey.IsNullEmptyWhiteSpace()) + { + Log.Error("RSS Url is empty!"); + return new Feed(); + } + + if (CachedFeeds.TryGetValue(urlKey, out Feed? fModel)) + return fModel; + string feedUrl; + var urls = await FeedReader.GetFeedUrlsFromUrlAsync(urlKey); + if (!urls.Any()) + feedUrl = urlKey; + else + feedUrl = urls.First().Url; + + Feed feed = await FeedReader.ReadAsync(feedUrl); + if (feed == null) + Log.Warning("Could not get feed: {FeedUrl}", feedUrl); + CachedFeeds.Add(urlKey, feed); + return feed; + } + } +} \ No newline at end of file diff --git a/SharpRss/Models/CategoryModel.cs b/SharpRss/Models/CategoryModel.cs index af405bd..bdf2dc8 100644 --- a/SharpRss/Models/CategoryModel.cs +++ b/SharpRss/Models/CategoryModel.cs @@ -1,15 +1,26 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Collections.Generic; namespace SharpRss.Models { /// /// To store and load data from file/database /// - public class CategoryModel + public class CategoryModel : IGuideItem { + public CategoryModel(CategoryModel model) + { + Name = model.Name; + Feeds = model.Feeds; + } + public CategoryModel(string name, HashSet feeds) + { + Name = name; + Feeds = feeds; + } + public string Name { get; set; } public HashSet Feeds { get; set; } + public bool IsSelected { get; set; } + public bool IsExpanded { get; set; } } } diff --git a/SharpRss/Models/FeedModel.cs b/SharpRss/Models/FeedModel.cs index b611530..8bb4c93 100644 --- a/SharpRss/Models/FeedModel.cs +++ b/SharpRss/Models/FeedModel.cs @@ -1,15 +1,43 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Dynamic; +using System.Linq; +using System.Threading.Tasks; +using CodeHollow.FeedReader; +using Serilog; +using ToolQit.Extensions; namespace SharpRss.Models { - public class FeedModel + public class FeedModel : IGuideItem { - public string Type { get; set; } - public string Text { get; set; } - public string Title { get; set; } - public string XmlUrl { get; set; } - public string HtmlUrl { get; set; } + public FeedModel(string rssUrl) + { + _rssUrl = rssUrl; + Task.Run(async () => Base = await FeedCache.GetFeed(_rssUrl)); + } + + public Feed Base { get; private set; } + public bool IsSelected { get; set; } + public bool IsExpanded { get; set; } + public bool IsReady { get; private set; } + private readonly string _rssUrl; + /*public async void Load(bool reload = false) + { + if (Base != null && !reload || !IsReady) return; + if (_rssUrl.IsNullEmptyWhiteSpace()) + { + Log.Error("RSS Url is empty!"); + return; + } + IsReady = false; + string feedUrl; + var urls = await FeedReader.GetFeedUrlsFromUrlAsync(_rssUrl); + if (!urls.Any()) + feedUrl = _rssUrl; + else + feedUrl = urls.First().Url; + Log.Verbose("Creating feed: {FeedUrl}", feedUrl); + Base = await FeedReader.ReadAsync(feedUrl); + IsReady = true; + }*/ } } diff --git a/WebSharpRSS/Models/ISelectableGuideItem.cs b/SharpRss/Models/IGuideItem.cs similarity index 59% rename from WebSharpRSS/Models/ISelectableGuideItem.cs rename to SharpRss/Models/IGuideItem.cs index 03542d7..0489b2f 100644 --- a/WebSharpRSS/Models/ISelectableGuideItem.cs +++ b/SharpRss/Models/IGuideItem.cs @@ -1,6 +1,6 @@ -namespace WebSharpRSS.Models +namespace SharpRss.Models { - public interface ISelectableGuideItem + public interface IGuideItem { public bool IsSelected { get; set; } public bool IsExpanded { get; set; } diff --git a/SharpRss/RssService.cs b/SharpRss/RssService.cs index cd7f1aa..c52a1ac 100644 --- a/SharpRss/RssService.cs +++ b/SharpRss/RssService.cs @@ -19,9 +19,27 @@ namespace SharpRss /// - Memory } + private static HashSet feedSet = new HashSet() + { + new FeedModel("http://fedoramagazine.org/feed/"), + new FeedModel("https://www.nasa.gov/rss/dyn/breaking_news.rss") + }; + private static HashSet feedSet2 = new HashSet() + { + new FeedModel("https://journals.plos.org/plosone/feed/atom"), + new FeedModel("https://cyberciti.biz/feed"), + new FeedModel("https://itsfoss.com/feed") + }; + + HashSet set = new HashSet() + { + new CategoryModel("RSS", feedSet), + new CategoryModel("Tech", feedSet2) + }; + public async Task> GetCategories() { - return new HashSet(); + return set; } public async Task> GetAllFeeds() diff --git a/WebSharpRSS/Bootstrapper.cs b/WebSharpRSS/Bootstrapper.cs index e8fef47..9beead8 100644 --- a/WebSharpRSS/Bootstrapper.cs +++ b/WebSharpRSS/Bootstrapper.cs @@ -11,8 +11,15 @@ namespace WebSharpRSS { public static void SetAppDefaultSettings(this DataContainer dataCon) { - dataCon.Set("FaviconResolveUrl", "https://icons.duckduckgo.com/ip3/{0}.ico", false); - dataCon.Set("LogPath", Path.Combine(Environment.CurrentDirectory, "logs", "log_.json"), false); + var paths = dataCon["Paths"]; + paths.Set("FaviconResolveUrl", "https://icons.duckduckgo.com/ip3/{0}.ico", false); + paths.Set("LogPath", Path.Combine(Environment.CurrentDirectory, "logs", "log_.json"), false); + + var dbSql = dataCon["SQL"]; + dbSql.Set("Host", "localhost", false); + dbSql.Set("Port", "6969", false); + dbSql.Set("Username", "sharpUser", false); + dbSql.Set("Password", "sh@rP@s$", false); } private static LoggerConfiguration? _configuration; @@ -21,8 +28,9 @@ namespace WebSharpRSS if (_configuration != null) return; _configuration = new LoggerConfiguration() .WriteTo.Console() - .WriteTo.File(new JsonFormatter(), Caretaker.Settings.GetString("LogPath"), rollingInterval: RollingInterval.Day) + .WriteTo.File(new JsonFormatter(), Caretaker.Settings["Paths"].GetString("LogPath"), rollingInterval: RollingInterval.Day) .MinimumLevel.Verbose(); + Log.Logger = _configuration.CreateLogger(); } } diff --git a/WebSharpRSS/Models/CategoryGuideItem.cs b/WebSharpRSS/Models/CategoryGuideItem.cs deleted file mode 100644 index 46553b4..0000000 --- a/WebSharpRSS/Models/CategoryGuideItem.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Collections.Generic; -using CodeHollow.FeedReader; - -namespace WebSharpRSS.Models -{ - public class CategoryGuideItem : ISelectableGuideItem - { - public string CategoryTitle { get; set; } - public string CategoryIcon { get; set; } - private string _hexColor; - - public string CategoryHexColor - { - get => _hexColor; - set => _hexColor = value.Insert(7, "80"); - } - - public bool IsExpanded { get; set; } - public bool IsSelected { get; set; } - public HashSet FeedItems { get; set; } = new HashSet() { new FeedGuideItem(FeedReader.ReadAsync("http://fedoramagazine.org/feed/").Result) }; - } -} \ No newline at end of file diff --git a/WebSharpRSS/Models/CategoryItem.cs b/WebSharpRSS/Models/CategoryItem.cs deleted file mode 100644 index bc062dd..0000000 --- a/WebSharpRSS/Models/CategoryItem.cs +++ /dev/null @@ -1,15 +0,0 @@ -using SharpRss.Models; - -namespace WebSharpRSS.Models -{ - public class CategoryItem : CategoryModel, ISelectableGuideItem - { - public CategoryItem(CategoryModel model) - { - Name = model.Name; - Feeds = model.Feeds; - } - public bool IsSelected { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } - public bool IsExpanded { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } - } -} diff --git a/WebSharpRSS/Models/FeedGuideItem.cs b/WebSharpRSS/Models/FeedGuideItem.cs deleted file mode 100644 index e9fda25..0000000 --- a/WebSharpRSS/Models/FeedGuideItem.cs +++ /dev/null @@ -1,15 +0,0 @@ -using CodeHollow.FeedReader; - -namespace WebSharpRSS.Models -{ - public class FeedGuideItem : ISelectableGuideItem - { - public FeedGuideItem(Feed feed) - { - Feed = feed; - } - public readonly Feed Feed; - public bool IsSelected { get; set; } - public bool IsExpanded { get; set; } - } -} \ No newline at end of file diff --git a/WebSharpRSS/Program.cs b/WebSharpRSS/Program.cs index 9215ffd..4a6e225 100644 --- a/WebSharpRSS/Program.cs +++ b/WebSharpRSS/Program.cs @@ -10,7 +10,7 @@ using WebSharpRSS; Caretaker.Settings.SetAppDefaultSettings(); Bootstrapper.SetupLogging(); -Log.Information("Starting app...."); +Log.Information("Starting application...."); var builder = WebApplication.CreateBuilder(args); builder.Services.AddRazorPages(); @@ -18,7 +18,6 @@ builder.Services.AddServerSideBlazor(); builder.Services.AddTransient(); builder.Services.AddMudServices(config => { - Log.Debug("Configuring MudServices"); config.SnackbarConfiguration.PositionClass = Defaults.Classes.Position.BottomRight; config.SnackbarConfiguration.PreventDuplicates = true; config.SnackbarConfiguration.ShowCloseIcon = true; diff --git a/WebSharpRSS/Settings.json b/WebSharpRSS/Settings.json new file mode 100644 index 0000000..07a6c68 --- /dev/null +++ b/WebSharpRSS/Settings.json @@ -0,0 +1,12 @@ +{ + "Paths": { + "FaviconResolveUrl": "https://icons.duckduckgo.com/ip3/{0}.ico", + "LogPath": "/home/max/GitHub/SharpRSS/WebSharpRSS/logs/log_.json" + }, + "SQL": { + "Host": "localhost", + "Port": "6969", + "Username": "sharpUser", + "Password": "sh@rP@s$" + } +} \ No newline at end of file diff --git a/WebSharpRSS/Shared/CategoryGuide.razor b/WebSharpRSS/Shared/CategoryGuide.razor index 720b822..52ff5fd 100644 --- a/WebSharpRSS/Shared/CategoryGuide.razor +++ b/WebSharpRSS/Shared/CategoryGuide.razor @@ -1,5 +1,8 @@ -@using WebSharpRSS.Models @using CodeHollow.FeedReader +@using SharpRss.Models +@using ToolQit +@using ToolQit.Containers +@using ToolQit.Extensions