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 string Id { get; set; } = string.Empty;
|
||||
public string? FeedId { get; set; }
|
||||
public string FeedId { get; set; } = string.Empty;
|
||||
public bool Read { get; set; }
|
||||
public string Type { get; set; } = string.Empty;
|
||||
public string Title { get; set; } = string.Empty;
|
||||
|
|
|
@ -4,23 +4,22 @@ namespace SharpRss.Models
|
|||
{
|
||||
public class FeedModel
|
||||
{
|
||||
public FeedModel() { }
|
||||
public FeedModel(string rssUrl)
|
||||
{
|
||||
Url = rssUrl;
|
||||
Id = Guid.NewGuid().ToString();
|
||||
Copyright = "EMPTY";
|
||||
ImageUrl = "EMPTY";
|
||||
}
|
||||
public string Id { get; set; } = string.Empty;
|
||||
public string Url { get; set; } = string.Empty;
|
||||
public string? GroupId { get; set; }
|
||||
public string Id { get; set; }
|
||||
public string Url { 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 Description { 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 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()
|
||||
{
|
||||
_sqlConn = new SqliteConnection(_connectionString);
|
||||
InitializeDb();
|
||||
//InitializeDb();
|
||||
}
|
||||
private readonly SqliteConnection _sqlConn;
|
||||
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();
|
||||
while (reader.Read())
|
||||
{
|
||||
feeds.Add(new FeedModel()
|
||||
feeds.Add(new FeedModel(reader["url"].ToString())
|
||||
{
|
||||
Id = reader["id"].ToString(),
|
||||
Url = reader["url"].ToString(),
|
||||
Title = reader["group_id"].ToString(),
|
||||
GroupId = reader["group_id"].ToString(),
|
||||
FeedType = reader["feed_type"].ToString(),
|
||||
Description = reader["description"].ToString(),
|
||||
|
@ -120,7 +120,8 @@ namespace SharpRss.Services
|
|||
Copyright = reader["copyright"].ToString(),
|
||||
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),
|
||||
ImageUrl = reader["image_url"].ToString()
|
||||
ImageUrl = reader["image_url"].ToString(),
|
||||
OriginalDocument = reader["original_document"].ToString()
|
||||
});
|
||||
}
|
||||
_sqlConn.Close();
|
||||
|
@ -131,20 +132,22 @@ namespace SharpRss.Services
|
|||
{
|
||||
bool result = false;
|
||||
_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 =
|
||||
{
|
||||
new SqliteParameter("id", feedModel.Id),
|
||||
new SqliteParameter("url", feedModel.Url),
|
||||
new SqliteParameter("groupId", feedModel.GroupId),
|
||||
new SqliteParameter("feedType", feedModel.FeedType),
|
||||
new SqliteParameter("description", feedModel.Description),
|
||||
new SqliteParameter("language", feedModel.Language),
|
||||
new SqliteParameter("copyright", "EMPTY"),
|
||||
new SqliteParameter("id", feedModel.Id ?? string.Empty),
|
||||
new SqliteParameter("url", feedModel.Url ?? string.Empty),
|
||||
new SqliteParameter("title", feedModel.Title ?? string.Empty),
|
||||
new SqliteParameter("groupId", feedModel.GroupId ?? string.Empty),
|
||||
new SqliteParameter("feedType", feedModel.FeedType ?? string.Empty),
|
||||
new SqliteParameter("description", feedModel.Description ?? string.Empty),
|
||||
new SqliteParameter("language", feedModel.Language ?? string.Empty),
|
||||
new SqliteParameter("copyright", feedModel.Copyright ?? string.Empty),
|
||||
new SqliteParameter("dateAdded", feedModel.DateAdded.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();
|
||||
|
@ -202,26 +205,26 @@ namespace SharpRss.Services
|
|||
{
|
||||
int result = 0;
|
||||
_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)" +
|
||||
$"VALUES (IFNULL((SELECT id FROM {_feedItemTable} WHERE url=@url), @id), @feedId, @read, @type, @title, @description, @link, @lastUpdated, @publishingDate, @author, @categories, @content)", _sqlConn);
|
||||
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 link=@link), @id), @feedId, @read, @title, @description, @link, @lastUpdated, @publishingDate, @author, @categories, @content)", _sqlConn);
|
||||
foreach (FeedItemModel item in items)
|
||||
{
|
||||
cmd.Parameters.Clear();
|
||||
cmd.Parameters.Add(new SqliteParameter("id", item.Id));
|
||||
cmd.Parameters.Add(new SqliteParameter("feedid", item.FeedId));
|
||||
cmd.Parameters.Add(new SqliteParameter("id", item.Id ?? string.Empty));
|
||||
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("type", item.Type));
|
||||
cmd.Parameters.Add(new SqliteParameter("title", item.Title));
|
||||
cmd.Parameters.Add(new SqliteParameter("description", item.Description));
|
||||
cmd.Parameters.Add(new SqliteParameter("link", item.Link));
|
||||
cmd.Parameters.Add(new SqliteParameter("type", item.Type ?? string.Empty));
|
||||
cmd.Parameters.Add(new SqliteParameter("title", item.Title ?? string.Empty));
|
||||
cmd.Parameters.Add(new SqliteParameter("description", item.Description ?? string.Empty));
|
||||
cmd.Parameters.Add(new SqliteParameter("link", item.Link ?? string.Empty));
|
||||
cmd.Parameters.Add(new SqliteParameter("lastUpdated", item.LastUpdated.ToUnixTimeMilliseconds()));
|
||||
cmd.Parameters.Add(new SqliteParameter("publishingDate", item.PublishingDate?.ToUnixTimeMilliseconds() ?? 0));
|
||||
cmd.Parameters.Add(new SqliteParameter("author", item.Author));
|
||||
cmd.Parameters.Add(new SqliteParameter("categories", string.Join(',', item.Categories)));
|
||||
cmd.Parameters.Add(new SqliteParameter("content", item.Content));
|
||||
cmd.Parameters.Add(new SqliteParameter("author", item.Author ?? string.Empty));
|
||||
cmd.Parameters.Add(new SqliteParameter("categories", item.Categories != null ? string.Join(',', item.Categories) : string.Empty));
|
||||
cmd.Parameters.Add(new SqliteParameter("content", item.Content ?? string.Empty));
|
||||
int affected = await cmd.ExecuteNonQueryAsync();
|
||||
if (affected == 0)
|
||||
Log.Verbose($"Could not set feed item: {item.Link}");
|
||||
Log.Verbose("Could not set feed item: {FeedLink}", item.Link);
|
||||
else
|
||||
result += affected;
|
||||
}
|
||||
|
@ -256,11 +259,11 @@ namespace SharpRss.Services
|
|||
if (queryResponse.Any()) failed.Add("category_data");
|
||||
|
||||
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");
|
||||
|
||||
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");
|
||||
|
||||
_sqlConn.Close();
|
||||
|
|
|
@ -5,7 +5,6 @@ using System.Threading.Tasks;
|
|||
using CodeHollow.FeedReader;
|
||||
using Serilog;
|
||||
using SharpRss.Models;
|
||||
using ToolQit.Extensions;
|
||||
|
||||
namespace SharpRss.Services
|
||||
{
|
||||
|
@ -20,7 +19,6 @@ namespace SharpRss.Services
|
|||
}
|
||||
private readonly DatabaseService _dbService = new DatabaseService();
|
||||
|
||||
|
||||
public async Task<bool> CreateGroupAsync(GroupModel group) => await _dbService.SetGroupAsync(group);
|
||||
public async Task<HashSet<GroupModel>> GetGroupsAsync() => await _dbService.GetGroupsAsync();
|
||||
|
||||
|
@ -28,11 +26,13 @@ namespace SharpRss.Services
|
|||
{
|
||||
bool result = false;
|
||||
Feed fetched = await FetchFeed(rssUrl);
|
||||
|
||||
if (fetched == null)
|
||||
return result;
|
||||
FeedModel feedModel = new FeedModel(rssUrl)
|
||||
{
|
||||
GroupId = group?.Id,
|
||||
Title = fetched.Title,
|
||||
GroupId = group?.Id ?? string.Empty,
|
||||
FeedType = fetched.Type.ToString(),
|
||||
Description = fetched.Description,
|
||||
Language = fetched.Language,
|
||||
|
@ -40,12 +40,13 @@ namespace SharpRss.Services
|
|||
DateAdded = DateTimeOffset.Now,
|
||||
LastUpdated = DateTimeOffset.Now,
|
||||
ImageUrl = fetched.ImageUrl,
|
||||
OriginalDocument = fetched.OriginalDocument
|
||||
};
|
||||
result = await _dbService.SetFeedAsync(feedModel);
|
||||
if (!result)
|
||||
return result;
|
||||
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;
|
||||
}
|
||||
public async Task<HashSet<FeedModel>> GetFeedsAsync(GroupModel? group = null) => await _dbService.GetFeedsAsync(group);
|
||||
|
@ -85,37 +86,16 @@ namespace SharpRss.Services
|
|||
}
|
||||
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();
|
||||
GroupModel testGroup = groups.Single(x => x.Name == "Test");
|
||||
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://journals.plos.org/plosone/feed/atom", 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()
|
||||
|
|
Binary file not shown.
Loading…
Reference in New Issue
Block a user