mirror of
https://github.com/hmaxnl/SharpRSS.git
synced 2025-01-18 21:04:21 +01:00
Fixed database backend now workinggit add .
This commit is contained in:
parent
29f9abd5de
commit
898e649697
|
@ -5,7 +5,7 @@ namespace SharpRss.Models
|
||||||
public class FeedItemModel
|
public class FeedItemModel
|
||||||
{
|
{
|
||||||
public string Id { get; set; } = string.Empty;
|
public string Id { get; set; } = string.Empty;
|
||||||
public string? FeedId { get; set; }
|
public string FeedId { get; set; } = string.Empty;
|
||||||
public bool Read { get; set; }
|
public bool Read { get; set; }
|
||||||
public string Type { get; set; } = string.Empty;
|
public string Type { get; set; } = string.Empty;
|
||||||
public string Title { get; set; } = string.Empty;
|
public string Title { get; set; } = string.Empty;
|
||||||
|
|
|
@ -4,23 +4,22 @@ namespace SharpRss.Models
|
||||||
{
|
{
|
||||||
public class FeedModel
|
public class FeedModel
|
||||||
{
|
{
|
||||||
public FeedModel() { }
|
|
||||||
public FeedModel(string rssUrl)
|
public FeedModel(string rssUrl)
|
||||||
{
|
{
|
||||||
Url = rssUrl;
|
Url = rssUrl;
|
||||||
Id = Guid.NewGuid().ToString();
|
Id = Guid.NewGuid().ToString();
|
||||||
Copyright = "EMPTY";
|
|
||||||
ImageUrl = "EMPTY";
|
|
||||||
}
|
}
|
||||||
public string Id { get; set; } = string.Empty;
|
public string Id { get; set; }
|
||||||
public string Url { get; set; } = string.Empty;
|
public string Url { get; set; }
|
||||||
public string? GroupId { get; set; }
|
public string Title { get; set; } = string.Empty;
|
||||||
|
public string GroupId { get; set; } = string.Empty;
|
||||||
public string FeedType { get; set; } = string.Empty;
|
public string FeedType { get; set; } = string.Empty;
|
||||||
public string Description { get; set; } = string.Empty;
|
public string Description { get; set; } = string.Empty;
|
||||||
public string Language { get; set; } = string.Empty;
|
public string Language { get; set; } = string.Empty;
|
||||||
public string Copyright { get; set; } = "EMPTY";
|
public string Copyright { get; set; } = string.Empty;
|
||||||
public DateTimeOffset DateAdded { get; set; }
|
public DateTimeOffset DateAdded { get; set; }
|
||||||
public DateTimeOffset LastUpdated { get; set; }
|
public DateTimeOffset LastUpdated { get; set; }
|
||||||
public string ImageUrl { get; set; } = "EMPTY";
|
public string ImageUrl { get; set; } = string.Empty;
|
||||||
|
public string OriginalDocument { get; set; } = string.Empty;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ namespace SharpRss.Services
|
||||||
internal DatabaseService()
|
internal DatabaseService()
|
||||||
{
|
{
|
||||||
_sqlConn = new SqliteConnection(_connectionString);
|
_sqlConn = new SqliteConnection(_connectionString);
|
||||||
InitializeDb();
|
//InitializeDb();
|
||||||
}
|
}
|
||||||
private readonly SqliteConnection _sqlConn;
|
private readonly SqliteConnection _sqlConn;
|
||||||
private readonly string _connectionString = $"Data Source={Path.Combine(Environment.CurrentDirectory, "sharp_rss.sqlite")};";
|
private readonly string _connectionString = $"Data Source={Path.Combine(Environment.CurrentDirectory, "sharp_rss.sqlite")};";
|
||||||
|
@ -109,10 +109,10 @@ namespace SharpRss.Services
|
||||||
await using SqliteDataReader reader = await cmd.ExecuteReaderAsync();
|
await using SqliteDataReader reader = await cmd.ExecuteReaderAsync();
|
||||||
while (reader.Read())
|
while (reader.Read())
|
||||||
{
|
{
|
||||||
feeds.Add(new FeedModel()
|
feeds.Add(new FeedModel(reader["url"].ToString())
|
||||||
{
|
{
|
||||||
Id = reader["id"].ToString(),
|
Id = reader["id"].ToString(),
|
||||||
Url = reader["url"].ToString(),
|
Title = reader["group_id"].ToString(),
|
||||||
GroupId = reader["group_id"].ToString(),
|
GroupId = reader["group_id"].ToString(),
|
||||||
FeedType = reader["feed_type"].ToString(),
|
FeedType = reader["feed_type"].ToString(),
|
||||||
Description = reader["description"].ToString(),
|
Description = reader["description"].ToString(),
|
||||||
|
@ -120,7 +120,8 @@ namespace SharpRss.Services
|
||||||
Copyright = reader["copyright"].ToString(),
|
Copyright = reader["copyright"].ToString(),
|
||||||
DateAdded = DateTimeOffset.FromUnixTimeMilliseconds(long.TryParse(reader["date_added"].ToString(), out long parsedVal) ? parsedVal : 0),
|
DateAdded = DateTimeOffset.FromUnixTimeMilliseconds(long.TryParse(reader["date_added"].ToString(), out long parsedVal) ? parsedVal : 0),
|
||||||
LastUpdated = DateTimeOffset.FromUnixTimeMilliseconds(long.TryParse(reader["last_updated"].ToString(), out long lastUpdated) ? lastUpdated : 0),
|
LastUpdated = DateTimeOffset.FromUnixTimeMilliseconds(long.TryParse(reader["last_updated"].ToString(), out long lastUpdated) ? lastUpdated : 0),
|
||||||
ImageUrl = reader["image_url"].ToString()
|
ImageUrl = reader["image_url"].ToString(),
|
||||||
|
OriginalDocument = reader["original_document"].ToString()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
_sqlConn.Close();
|
_sqlConn.Close();
|
||||||
|
@ -131,20 +132,22 @@ namespace SharpRss.Services
|
||||||
{
|
{
|
||||||
bool result = false;
|
bool result = false;
|
||||||
_sqlConn.Open();
|
_sqlConn.Open();
|
||||||
using SqliteCommand cmd = new SqliteCommand($"INSERT OR REPLACE INTO {_feedTable} (id, url, group_id, feed_type, description, language, copyright, date_added, last_updated, image_url) VALUES (IFNULL((SELECT id FROM {_feedTable} WHERE url=@url), @id), @url, @groupId, @feedType, @description, @language, @copyright, @dateAdded, @lastUpdated, @imageUrl)", _sqlConn)
|
using SqliteCommand cmd = new SqliteCommand($"INSERT OR REPLACE INTO {_feedTable} (id, url, title, group_id, feed_type, description, language, copyright, date_added, last_updated, image_url, original_document) VALUES (IFNULL((SELECT id FROM {_feedTable} WHERE url=@url), @id), @url, @title, @groupId, @feedType, @description, @language, @copyright, @dateAdded, @lastUpdated, @imageUrl, @originalDoc)", _sqlConn)
|
||||||
{
|
{
|
||||||
Parameters =
|
Parameters =
|
||||||
{
|
{
|
||||||
new SqliteParameter("id", feedModel.Id),
|
new SqliteParameter("id", feedModel.Id ?? string.Empty),
|
||||||
new SqliteParameter("url", feedModel.Url),
|
new SqliteParameter("url", feedModel.Url ?? string.Empty),
|
||||||
new SqliteParameter("groupId", feedModel.GroupId),
|
new SqliteParameter("title", feedModel.Title ?? string.Empty),
|
||||||
new SqliteParameter("feedType", feedModel.FeedType),
|
new SqliteParameter("groupId", feedModel.GroupId ?? string.Empty),
|
||||||
new SqliteParameter("description", feedModel.Description),
|
new SqliteParameter("feedType", feedModel.FeedType ?? string.Empty),
|
||||||
new SqliteParameter("language", feedModel.Language),
|
new SqliteParameter("description", feedModel.Description ?? string.Empty),
|
||||||
new SqliteParameter("copyright", "EMPTY"),
|
new SqliteParameter("language", feedModel.Language ?? string.Empty),
|
||||||
|
new SqliteParameter("copyright", feedModel.Copyright ?? string.Empty),
|
||||||
new SqliteParameter("dateAdded", feedModel.DateAdded.ToUnixTimeMilliseconds()),
|
new SqliteParameter("dateAdded", feedModel.DateAdded.ToUnixTimeMilliseconds()),
|
||||||
new SqliteParameter("lastUpdated", feedModel.LastUpdated.ToUnixTimeMilliseconds()),
|
new SqliteParameter("lastUpdated", feedModel.LastUpdated.ToUnixTimeMilliseconds()),
|
||||||
new SqliteParameter("imageUrl", "EMPTY")
|
new SqliteParameter("imageUrl", feedModel.ImageUrl ?? string.Empty),
|
||||||
|
new SqliteParameter("originalDoc", feedModel.OriginalDocument ?? string.Empty)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
int affected = await cmd.ExecuteNonQueryAsync();
|
int affected = await cmd.ExecuteNonQueryAsync();
|
||||||
|
@ -202,26 +205,26 @@ namespace SharpRss.Services
|
||||||
{
|
{
|
||||||
int result = 0;
|
int result = 0;
|
||||||
_sqlConn.Open();
|
_sqlConn.Open();
|
||||||
using SqliteCommand cmd = new SqliteCommand($"INSERT OR REPLACE INTO {_feedItemTable} (id, feed_id, read, type, title, description, link, last_updated, publishing_date, author, categories, content)" +
|
using SqliteCommand cmd = new SqliteCommand($"INSERT OR REPLACE INTO {_feedItemTable} (id, feed_id, read, title, description, link, last_updated, publishing_date, author, categories, content)" +
|
||||||
$"VALUES (IFNULL((SELECT id FROM {_feedItemTable} WHERE url=@url), @id), @feedId, @read, @type, @title, @description, @link, @lastUpdated, @publishingDate, @author, @categories, @content)", _sqlConn);
|
$"VALUES (IFNULL((SELECT id FROM {_feedItemTable} WHERE link=@link), @id), @feedId, @read, @title, @description, @link, @lastUpdated, @publishingDate, @author, @categories, @content)", _sqlConn);
|
||||||
foreach (FeedItemModel item in items)
|
foreach (FeedItemModel item in items)
|
||||||
{
|
{
|
||||||
cmd.Parameters.Clear();
|
cmd.Parameters.Clear();
|
||||||
cmd.Parameters.Add(new SqliteParameter("id", item.Id));
|
cmd.Parameters.Add(new SqliteParameter("id", item.Id ?? string.Empty));
|
||||||
cmd.Parameters.Add(new SqliteParameter("feedid", item.FeedId));
|
cmd.Parameters.Add(new SqliteParameter("feedId", item.FeedId ?? string.Empty));
|
||||||
cmd.Parameters.Add(new SqliteParameter("read", item.Read ? 1 : 0));
|
cmd.Parameters.Add(new SqliteParameter("read", item.Read ? 1 : 0));
|
||||||
cmd.Parameters.Add(new SqliteParameter("type", item.Type));
|
cmd.Parameters.Add(new SqliteParameter("type", item.Type ?? string.Empty));
|
||||||
cmd.Parameters.Add(new SqliteParameter("title", item.Title));
|
cmd.Parameters.Add(new SqliteParameter("title", item.Title ?? string.Empty));
|
||||||
cmd.Parameters.Add(new SqliteParameter("description", item.Description));
|
cmd.Parameters.Add(new SqliteParameter("description", item.Description ?? string.Empty));
|
||||||
cmd.Parameters.Add(new SqliteParameter("link", item.Link));
|
cmd.Parameters.Add(new SqliteParameter("link", item.Link ?? string.Empty));
|
||||||
cmd.Parameters.Add(new SqliteParameter("lastUpdated", item.LastUpdated.ToUnixTimeMilliseconds()));
|
cmd.Parameters.Add(new SqliteParameter("lastUpdated", item.LastUpdated.ToUnixTimeMilliseconds()));
|
||||||
cmd.Parameters.Add(new SqliteParameter("publishingDate", item.PublishingDate?.ToUnixTimeMilliseconds() ?? 0));
|
cmd.Parameters.Add(new SqliteParameter("publishingDate", item.PublishingDate?.ToUnixTimeMilliseconds() ?? 0));
|
||||||
cmd.Parameters.Add(new SqliteParameter("author", item.Author));
|
cmd.Parameters.Add(new SqliteParameter("author", item.Author ?? string.Empty));
|
||||||
cmd.Parameters.Add(new SqliteParameter("categories", string.Join(',', item.Categories)));
|
cmd.Parameters.Add(new SqliteParameter("categories", item.Categories != null ? string.Join(',', item.Categories) : string.Empty));
|
||||||
cmd.Parameters.Add(new SqliteParameter("content", item.Content));
|
cmd.Parameters.Add(new SqliteParameter("content", item.Content ?? string.Empty));
|
||||||
int affected = await cmd.ExecuteNonQueryAsync();
|
int affected = await cmd.ExecuteNonQueryAsync();
|
||||||
if (affected == 0)
|
if (affected == 0)
|
||||||
Log.Verbose($"Could not set feed item: {item.Link}");
|
Log.Verbose("Could not set feed item: {FeedLink}", item.Link);
|
||||||
else
|
else
|
||||||
result += affected;
|
result += affected;
|
||||||
}
|
}
|
||||||
|
@ -256,11 +259,11 @@ namespace SharpRss.Services
|
||||||
if (queryResponse.Any()) failed.Add("category_data");
|
if (queryResponse.Any()) failed.Add("category_data");
|
||||||
|
|
||||||
Log.Verbose("Checking table: {Table}", _feedTable);
|
Log.Verbose("Checking table: {Table}", _feedTable);
|
||||||
queryResponse = await _sqlConn.QueryAsync($"CREATE TABLE IF NOT EXISTS {_feedTable} (id STRING PRIMARY KEY, url STRING NOT NULL, group_id STRING DEFAULT NULL, feed_type STRING, description STRING, language STRING, copyright STRING, date_added INT, last_updated INT, image_url STRING)");
|
queryResponse = await _sqlConn.QueryAsync($"CREATE TABLE IF NOT EXISTS {_feedTable} (id STRING PRIMARY KEY, url STRING NOT NULL, title STRING, group_id STRING, feed_type STRING, description STRING, language STRING, copyright STRING, date_added INT, last_updated INT, image_url STRING, original_document STRING)");
|
||||||
if (queryResponse.Any()) failed.Add("feed_data");
|
if (queryResponse.Any()) failed.Add("feed_data");
|
||||||
|
|
||||||
Log.Verbose("Checking table: {Table}", _feedItemTable);
|
Log.Verbose("Checking table: {Table}", _feedItemTable);
|
||||||
queryResponse = await _sqlConn.QueryAsync($"CREATE TABLE IF NOT EXISTS {_feedItemTable} (id STRING PRIMARY KEY, feed_id STRING DEFAULT NULL, read INT, type STRING, title STRING, description STRING, link STRING, last_updated INT, publishing_date INT, author STRING, categories STRING, content STRING)");
|
queryResponse = await _sqlConn.QueryAsync($"CREATE TABLE IF NOT EXISTS {_feedItemTable} (id STRING PRIMARY KEY, feed_id STRING, read INT, title STRING, description STRING, link STRING, last_updated INT, publishing_date INT, author STRING, categories STRING, content STRING)");
|
||||||
if (queryResponse.Any()) failed.Add("feed_item_data");
|
if (queryResponse.Any()) failed.Add("feed_item_data");
|
||||||
|
|
||||||
_sqlConn.Close();
|
_sqlConn.Close();
|
||||||
|
|
|
@ -5,7 +5,6 @@ using System.Threading.Tasks;
|
||||||
using CodeHollow.FeedReader;
|
using CodeHollow.FeedReader;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
using SharpRss.Models;
|
using SharpRss.Models;
|
||||||
using ToolQit.Extensions;
|
|
||||||
|
|
||||||
namespace SharpRss.Services
|
namespace SharpRss.Services
|
||||||
{
|
{
|
||||||
|
@ -16,23 +15,24 @@ namespace SharpRss.Services
|
||||||
{
|
{
|
||||||
public RssService()
|
public RssService()
|
||||||
{
|
{
|
||||||
SetupTestCategoriesAndFeedsAsync();
|
SetupTestCategoriesAndFeedsAsync();
|
||||||
}
|
}
|
||||||
private readonly DatabaseService _dbService = new DatabaseService();
|
private readonly DatabaseService _dbService = new DatabaseService();
|
||||||
|
|
||||||
|
public async Task<bool> CreateGroupAsync(GroupModel group) => await _dbService.SetGroupAsync(group);
|
||||||
public async Task<bool> CreateGroupAsync(GroupModel group) => await _dbService.SetGroupAsync(group);
|
|
||||||
public async Task<HashSet<GroupModel>> GetGroupsAsync() => await _dbService.GetGroupsAsync();
|
public async Task<HashSet<GroupModel>> GetGroupsAsync() => await _dbService.GetGroupsAsync();
|
||||||
|
|
||||||
public async Task<bool> AddFeed(string rssUrl, GroupModel? group = null)
|
public async Task<bool> AddFeed(string rssUrl, GroupModel? group = null)
|
||||||
{
|
{
|
||||||
bool result = false;
|
bool result = false;
|
||||||
Feed fetched = await FetchFeed(rssUrl);
|
Feed fetched = await FetchFeed(rssUrl);
|
||||||
|
|
||||||
if (fetched == null)
|
if (fetched == null)
|
||||||
return result;
|
return result;
|
||||||
FeedModel feedModel = new FeedModel(rssUrl)
|
FeedModel feedModel = new FeedModel(rssUrl)
|
||||||
{
|
{
|
||||||
GroupId = group?.Id,
|
Title = fetched.Title,
|
||||||
|
GroupId = group?.Id ?? string.Empty,
|
||||||
FeedType = fetched.Type.ToString(),
|
FeedType = fetched.Type.ToString(),
|
||||||
Description = fetched.Description,
|
Description = fetched.Description,
|
||||||
Language = fetched.Language,
|
Language = fetched.Language,
|
||||||
|
@ -40,12 +40,13 @@ namespace SharpRss.Services
|
||||||
DateAdded = DateTimeOffset.Now,
|
DateAdded = DateTimeOffset.Now,
|
||||||
LastUpdated = DateTimeOffset.Now,
|
LastUpdated = DateTimeOffset.Now,
|
||||||
ImageUrl = fetched.ImageUrl,
|
ImageUrl = fetched.ImageUrl,
|
||||||
|
OriginalDocument = fetched.OriginalDocument
|
||||||
};
|
};
|
||||||
result = await _dbService.SetFeedAsync(feedModel);
|
result = await _dbService.SetFeedAsync(feedModel);
|
||||||
if (!result)
|
if (!result)
|
||||||
return result;
|
return result;
|
||||||
if (await AddFeedItems(fetched.Items, feedModel) == 0)
|
if (await AddFeedItems(fetched.Items, feedModel) == 0)
|
||||||
Log.Warning($"No feed items added to feed: {feedModel.Url}");
|
Log.Warning("No feed items added to feed: {FeedUrl}", feedModel.Url);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
public async Task<HashSet<FeedModel>> GetFeedsAsync(GroupModel? group = null) => await _dbService.GetFeedsAsync(group);
|
public async Task<HashSet<FeedModel>> GetFeedsAsync(GroupModel? group = null) => await _dbService.GetFeedsAsync(group);
|
||||||
|
@ -85,37 +86,16 @@ namespace SharpRss.Services
|
||||||
}
|
}
|
||||||
private async void SetupTestCategoriesAndFeedsAsync()
|
private async void SetupTestCategoriesAndFeedsAsync()
|
||||||
{
|
{
|
||||||
|
var groupRes = await CreateGroupAsync(new GroupModel() { Name = "Test" });
|
||||||
|
groupRes = await CreateGroupAsync(new GroupModel() { Name = "News" });
|
||||||
|
groupRes = await CreateGroupAsync(new GroupModel() { Name = "Tech" });
|
||||||
|
groupRes = await CreateGroupAsync(new GroupModel() { Name = "Science" });
|
||||||
var groups = await GetGroupsAsync();
|
var groups = await GetGroupsAsync();
|
||||||
GroupModel testGroup = groups.Single(x => x.Name == "Test");
|
GroupModel testGroup = groups.Single(x => x.Name == "Test");
|
||||||
var res = await AddFeed("http://fedoramagazine.org/feed/", testGroup);
|
var res = await AddFeed("http://fedoramagazine.org/feed/", testGroup);
|
||||||
res = await AddFeed("https://www.nasa.gov/rss/dyn/breaking_news.rss", testGroup);
|
res = await AddFeed("https://www.nasa.gov/rss/dyn/breaking_news.rss", testGroup);
|
||||||
res = await AddFeed("https://journals.plos.org/plosone/feed/atom", testGroup);
|
res = await AddFeed("https://journals.plos.org/plosone/feed/atom", testGroup);
|
||||||
res = await AddFeed("https://itsfoss.com/feed", testGroup);
|
res = await AddFeed("https://itsfoss.com/feed", testGroup);
|
||||||
|
|
||||||
/*bool result = await _dbService.SetGroupAsync(new GroupModel() { Name = "News" });
|
|
||||||
result = await _dbService.SetGroupAsync(new GroupModel() { Name = "Tech" });
|
|
||||||
result = await _dbService.SetGroupAsync(new GroupModel() { Name = "Science" });
|
|
||||||
result = await _dbService.SetGroupAsync(new GroupModel() { Name = "Test" });*/
|
|
||||||
|
|
||||||
/*GroupModel? editGroup = await _dbService.GetGroupsAsync("Test");
|
|
||||||
if (editGroup != null)
|
|
||||||
{
|
|
||||||
bool result2 = await _dbService.RemoveGroupAsync(editGroup);
|
|
||||||
}*/
|
|
||||||
/*await _dbService.AddCategoriesAsync(new HashSet<CategoryModel>()
|
|
||||||
{
|
|
||||||
new CategoryModel() { Name = "All" },
|
|
||||||
new CategoryModel() { Name = "RSS" },
|
|
||||||
new CategoryModel() { Name = "Tech" },
|
|
||||||
new CategoryModel() { Name = "News" }
|
|
||||||
});
|
|
||||||
await _dbService.AddFeedsAsync(new HashSet<FeedModel>()
|
|
||||||
{
|
|
||||||
new FeedModel("http://fedoramagazine.org/feed/"),
|
|
||||||
new FeedModel("https://www.nasa.gov/rss/dyn/breaking_news.rss"),
|
|
||||||
new FeedModel("https://journals.plos.org/plosone/feed/atom"),
|
|
||||||
new FeedModel("https://itsfoss.com/feed")
|
|
||||||
});*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue
Block a user