From 65a964b7eeae38b9b72237216b43af5179407af4 Mon Sep 17 00:00:00 2001 From: Max Holleman Date: Tue, 23 May 2023 15:04:02 +0200 Subject: [PATCH] Added guide load implmentation --- SharpRss/Models/GroupModel.cs | 1 + SharpRss/Services/DatabaseService.cs | 15 +++++++++---- SharpRss/Services/RssService.cs | 15 +++++++++---- WebSharpRSS/Models/TreeItemData.cs | 28 +++++++++++++----------- WebSharpRSS/Shared/SideGuide.razor | 32 +++++++++++++++++----------- WebSharpRSS/WebSharpRSS.csproj | 11 ++++++---- 6 files changed, 66 insertions(+), 36 deletions(-) diff --git a/SharpRss/Models/GroupModel.cs b/SharpRss/Models/GroupModel.cs index 3af821b..d6678e9 100644 --- a/SharpRss/Models/GroupModel.cs +++ b/SharpRss/Models/GroupModel.cs @@ -13,6 +13,7 @@ namespace SharpRss.Models public string Name { get; set; } = string.Empty; public string HexColor { get; set; } + public int FeedCount { get; set; } public string Icon { get; set; } = string.Empty; public string Id { get; set; } } diff --git a/SharpRss/Services/DatabaseService.cs b/SharpRss/Services/DatabaseService.cs index 10456fd..0c62451 100644 --- a/SharpRss/Services/DatabaseService.cs +++ b/SharpRss/Services/DatabaseService.cs @@ -36,11 +36,18 @@ namespace SharpRss.Services }; await using SqliteDataReader reader = await cmd.ExecuteReaderAsync(); HashSet groups = new HashSet(); + using SqliteCommand cmdFeedCount = new SqliteCommand($"SELECT COUNT(*) FROM {_feedTable} WHERE group_id=@groupId", _sqlConn); while (reader.Read()) { - groups.Add(new GroupModel() + cmdFeedCount.Parameters.Clear(); + cmdFeedCount.Parameters.Add(new SqliteParameter("groupId", reader["id"].ToString())); + using SqliteDataReader countReader = await cmdFeedCount.ExecuteReaderAsync(); + int count = countReader.Read() ? countReader.GetInt32(0) : 0; + + groups.Add(new GroupModel() { Name = reader["name"].ToString(), + FeedCount = count, HexColor = reader["hex_color"].ToString(), Icon = reader["icon"].ToString(), Id = reader["id"].ToString() @@ -95,15 +102,15 @@ namespace SharpRss.Services return result; } // Feeds - public async Task> GetFeedsAsync(GroupModel? group = null) + public async Task> GetFeedsAsync(string? groupId = null) { HashSet feeds = new HashSet(); _sqlConn.Open(); - using SqliteCommand cmd = new SqliteCommand(group != null ? $"SELECT * FROM {_feedTable} WHERE group_id=@groupid" : $"SELECT * FROM {_feedTable}", _sqlConn) + using SqliteCommand cmd = new SqliteCommand(groupId != null ? $"SELECT * FROM {_feedTable} WHERE group_id=@groupId" : $"SELECT * FROM {_feedTable}", _sqlConn) { Parameters = { - new SqliteParameter("groupId", group?.Id == string.Empty ? null : group?.Id) + new SqliteParameter("groupId", groupId == null ? string.Empty : groupId) } }; await using SqliteDataReader reader = await cmd.ExecuteReaderAsync(); diff --git a/SharpRss/Services/RssService.cs b/SharpRss/Services/RssService.cs index fbb11b9..94a0bc5 100644 --- a/SharpRss/Services/RssService.cs +++ b/SharpRss/Services/RssService.cs @@ -15,10 +15,17 @@ namespace SharpRss.Services { public RssService() { - SetupTestCategoriesAndFeedsAsync(); + //SetupTestCategoriesAndFeedsAsync(); } private readonly DatabaseService _dbService = new DatabaseService(); - + + public async Task> GetItemsAsync() + { + HashSet items = new HashSet(); + items.UnionWith(await GetGroupsAsync()); + items.UnionWith(await GetUngroupedFeedsAsync()); + return items; + } public async Task CreateGroupAsync(GroupModel group) => await _dbService.SetGroupAsync(group); public async Task> GetGroupsAsync() => await _dbService.GetGroupsAsync(); @@ -49,8 +56,8 @@ namespace SharpRss.Services Log.Warning("No feed items added to feed: {FeedUrl}", feedModel.Url); return result; } - public async Task> GetFeedsAsync(GroupModel? group = null) => await _dbService.GetFeedsAsync(group); - public async Task> GetUngroupedFeedsAsync() => await _dbService.GetFeedsAsync(new GroupModel() { Id = "" }); + public async Task> GetFeedsAsync(GroupModel? group = null) => await _dbService.GetFeedsAsync(group?.Id); + public async Task> GetUngroupedFeedsAsync() => await _dbService.GetFeedsAsync(""); private async Task AddFeedItems(IList items, FeedModel feedModel) { int result = 0; diff --git a/WebSharpRSS/Models/TreeItemData.cs b/WebSharpRSS/Models/TreeItemData.cs index a7a16b0..c0bb89b 100644 --- a/WebSharpRSS/Models/TreeItemData.cs +++ b/WebSharpRSS/Models/TreeItemData.cs @@ -1,33 +1,37 @@ +using CodeHollow.FeedReader; +using MudBlazor; using SharpRss.Models; using SharpRss.Services; +using ToolQit; namespace WebSharpRSS.Models { public class TreeItemData { - public TreeItemData(GroupModel catModel, RssService rssService) + public TreeItemData(GroupModel groupModel) { - _service = rssService; - CategoryModel = catModel; - } + GroupModel = groupModel; + Title = groupModel.Name; + Icon = groupModel.Icon == string.Empty ? Icons.Material.Filled.RssFeed : groupModel.Icon; + HasChild = groupModel.FeedCount > 0; + } - public TreeItemData(FeedModel feedModel, RssService rssService) + public TreeItemData(FeedModel feedModel) { - _service = rssService; FeedModel = feedModel; - } - - private readonly RssService _service; - public readonly GroupModel? CategoryModel; + Title = feedModel.Title; + FaviconUrl = string.Format(Caretaker.Settings["Paths"].GetString("FaviconResolveUrl"), feedModel.Url.Remove(feedModel.Url.IndexOf("http", StringComparison.Ordinal), feedModel.Url.IndexOf("://", StringComparison.Ordinal) + 3)); ; + } + public readonly GroupModel? GroupModel; public readonly FeedModel? FeedModel; + public HashSet? Children { get; set; } public string Title { get; set; } = string.Empty; public bool IsSelected { get; set; } public string? Icon { get; set; } public string? FaviconUrl { get; set; } - - // Category public bool HasChild { get; set; } + public bool Loading { get; set; } public bool IsExpanded { get; set; } } } \ No newline at end of file diff --git a/WebSharpRSS/Shared/SideGuide.razor b/WebSharpRSS/Shared/SideGuide.razor index 486acd4..1da075a 100644 --- a/WebSharpRSS/Shared/SideGuide.razor +++ b/WebSharpRSS/Shared/SideGuide.razor @@ -9,17 +9,17 @@ @inject FeedStateContainer _stateContainer; @inject RssService _rssService -@* + - +
- - @if (context.FaviconUrl.IsNullEmptyWhiteSpace() && context.Icon != null) + + @if (context.FaviconUrl == null && context.Icon != null) { - + } else { @@ -28,19 +28,19 @@ @context.Title
- @context.FeeditemCount + @*@context.FeeditemCount*@
-
*@ +
@code { private MudTheme Theme = new MudTheme(); private readonly HashSet _guideItems = new HashSet(); - /*private TreeItemData? _selectedItem; + private TreeItemData? _selectedItem; private TreeItemData? SelectedItem { get => _selectedItem; @@ -49,18 +49,26 @@ _selectedItem = value; ItemClicked(); } - }*/ + } private void ItemClicked() { - + } + //private async void ExpandedClicked(TreeItemData treeItemData) + //{ + // treeItemData.Loading = true; + // var groupedItems = await _rssService.GetFeedsAsync(treeItemData.GroupModel); + // treeItemData.Children = ModelToTreeItem(groupedItems); + // treeItemData.Loading = false; + //} protected override async void OnInitialized() { Log.Verbose("Loading guide data..."); - /*HashSet items = await _rssService.GetAllUnsortedAsync(); - _guideItems.UnionWith(items.Select(x => x is CategoryModel model ? new TreeItemData(model, _rssService) : x is FeedModel feedModel ? new TreeItemData(feedModel, _rssService) : throw new ArgumentException("Arg x is invalid!")));*/ + HashSet items = await _rssService.GetItemsAsync(); + _guideItems.UnionWith(ModelToTreeItem(items)); StateHasChanged(); Log.Verbose("Guide initialized!"); } + private HashSet ModelToTreeItem(HashSet model) => model.Select(x => x is GroupModel model ? new TreeItemData(model) : x is FeedModel feedModel ? new TreeItemData(feedModel) : throw new ArgumentException("Item arg is invalid!")).ToHashSet(); } \ No newline at end of file diff --git a/WebSharpRSS/WebSharpRSS.csproj b/WebSharpRSS/WebSharpRSS.csproj index 0d9ef5c..8283753 100644 --- a/WebSharpRSS/WebSharpRSS.csproj +++ b/WebSharpRSS/WebSharpRSS.csproj @@ -8,6 +8,13 @@ true + + + + + + + @@ -16,8 +23,4 @@ - - - -