refactor feedstate + swap implementation

This commit is contained in:
nkanaev
2026-05-18 20:06:41 +01:00
parent 7553824520
commit 85f3956b24
9 changed files with 101 additions and 167 deletions

View File

@@ -9,6 +9,7 @@ import (
"net/http"
"net/url"
"strings"
"time"
"github.com/nkanaev/yarr/src/content/scraper"
"github.com/nkanaev/yarr/src/parser"
@@ -162,9 +163,9 @@ func ConvertItems(items []parser.Item, feed storage.Feed) []storage.Item {
func listItems(f storage.Feed, db *storage.Storage) ([]storage.Item, error) {
lmod := ""
etag := ""
if state := db.GetHTTPState(f.Id); state != nil {
lmod = state.LastModified
etag = state.Etag
if state, _ := db.GetFeedState(f.Id); state != nil {
lmod = state.HTTPLastModified
etag = state.HTTPEtag
}
res, err := client.getConditional(f.FeedLink, lmod, etag)
@@ -190,8 +191,13 @@ func listItems(f storage.Feed, db *storage.Storage) ([]storage.Item, error) {
lmod = res.Header.Get("Last-Modified")
etag = res.Header.Get("Etag")
now := time.Now().UTC()
if lmod != "" || etag != "" {
db.SetHTTPState(f.Id, lmod, etag)
db.UpdateFeedState(f.Id, storage.UpdateFeedStateParams{
HTTPLastModified: &lmod,
HTTPEtag: &etag,
LastRefreshed: &now,
})
}
return ConvertItems(feed.Items, f), nil
}

View File

@@ -108,7 +108,7 @@ func (w *Worker) RefreshFeeds() {
}
func (w *Worker) refresher(feeds []storage.Feed) {
w.db.ResetFeedErrors()
// w.db.ResetFeedErrors()
srcqueue := make(chan storage.Feed, len(feeds))
dstqueue := make(chan []storage.Item)
@@ -136,9 +136,13 @@ func (w *Worker) refresher(feeds []storage.Feed) {
func (w *Worker) worker(srcqueue <-chan storage.Feed, dstqueue chan<- []storage.Item) {
for feed := range srcqueue {
empty := ""
w.db.UpdateFeedState(feed.Id, storage.UpdateFeedStateParams{LastError: &empty})
items, err := listItems(feed, w.db)
if err != nil {
w.db.SetFeedError(feed.Id, err)
errMsg := err.Error()
w.db.UpdateFeedState(feed.Id, storage.UpdateFeedStateParams{LastError: &errMsg})
}
dstqueue <- items
}