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