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

@@ -56,17 +56,14 @@ type FeverFavicon struct {
func writeFeverJSON(c *router.Context, data map[string]any, lastRefreshed int64) {
data["api_version"] = 3
data["auth"] = 1
// TODO: remove duplicates
data["last_refreshed_on_time"] = lastRefreshed
c.JSON(http.StatusOK, data)
}
func getLastRefreshedOnTime(httpStates map[int64]storage.HTTPState) int64 {
if len(httpStates) == 0 {
return 0
}
func getLastRefreshedOnTime(feedStates []storage.FeedState) int64 {
var lastRefreshed int64
for _, state := range httpStates {
for _, state := range feedStates {
if state.LastRefreshed.Unix() > lastRefreshed {
lastRefreshed = state.LastRefreshed.Unix()
}
@@ -123,10 +120,11 @@ func (s *Server) handleFever(c *router.Context) {
case formHasValue(c.Req.Form, "mark"):
s.feverMarkHandler(c)
default:
states, _ := s.db.ListFeedStates()
c.JSON(http.StatusOK, map[string]any{
"api_version": 3,
"auth": 1,
"last_refreshed_on_time": getLastRefreshedOnTime(s.db.ListHTTPStates()),
"last_refreshed_on_time": getLastRefreshedOnTime(states),
})
}
}
@@ -168,20 +166,25 @@ func (s *Server) feverGroupsHandler(c *router.Context) {
for i, folder := range folders {
groups[i] = &FeverGroup{ID: folder.Id, Title: folder.Title}
}
states, _ := s.db.ListFeedStates()
writeFeverJSON(c, map[string]any{
"groups": groups,
"feeds_groups": feedGroups(s.db),
}, getLastRefreshedOnTime(s.db.ListHTTPStates()))
}, getLastRefreshedOnTime(states))
}
func (s *Server) feverFeedsHandler(c *router.Context) {
feeds := s.db.ListFeeds()
httpStates := s.db.ListHTTPStates()
states, _ := s.db.ListFeedStates()
statesMap := make(map[int64]storage.FeedState)
for _, state := range states {
statesMap[state.FeedID] = state
}
feverFeeds := make([]*FeverFeed, len(feeds))
for i, feed := range feeds {
var lastUpdated int64
if state, ok := httpStates[feed.Id]; ok {
if state, ok := statesMap[feed.Id]; ok {
lastUpdated = state.LastRefreshed.Unix()
}
feverFeeds[i] = &FeverFeed{
@@ -197,7 +200,7 @@ func (s *Server) feverFeedsHandler(c *router.Context) {
writeFeverJSON(c, map[string]any{
"feeds": feverFeeds,
"feeds_groups": feedGroups(s.db),
}, getLastRefreshedOnTime(httpStates))
}, getLastRefreshedOnTime(states))
}
func (s *Server) feverFaviconsHandler(c *router.Context) {
@@ -216,9 +219,10 @@ func (s *Server) feverFaviconsHandler(c *router.Context) {
favicons[i] = &FeverFavicon{ID: feed.Id, Data: data}
}
states, _ := s.db.ListFeedStates()
writeFeverJSON(c, map[string]any{
"favicons": favicons,
}, getLastRefreshedOnTime(s.db.ListHTTPStates()))
}, getLastRefreshedOnTime(states))
}
// for memory pressure reasons, we only return a limited number of items
@@ -280,16 +284,18 @@ func (s *Server) feverItemsHandler(c *router.Context) {
totalItems := s.db.CountItems()
states, _ := s.db.ListFeedStates()
writeFeverJSON(c, map[string]any{
"items": feverItems,
"total_items": totalItems,
}, getLastRefreshedOnTime(s.db.ListHTTPStates()))
}, getLastRefreshedOnTime(states))
}
func (s *Server) feverLinksHandler(c *router.Context) {
states, _ := s.db.ListFeedStates()
writeFeverJSON(c, map[string]any{
"links": make([]any, 0),
}, getLastRefreshedOnTime(s.db.ListHTTPStates()))
}, getLastRefreshedOnTime(states))
}
func (s *Server) feverUnreadItemIDsHandler(c *router.Context) {
@@ -309,9 +315,10 @@ func (s *Server) feverUnreadItemIDsHandler(c *router.Context) {
}
itemFilter.After = &items[len(items)-1].Id
}
states, _ := s.db.ListFeedStates()
writeFeverJSON(c, map[string]any{
"unread_item_ids": joinInts(itemIds),
}, getLastRefreshedOnTime(s.db.ListHTTPStates()))
}, getLastRefreshedOnTime(states))
}
func (s *Server) feverSavedItemIDsHandler(c *router.Context) {
@@ -331,9 +338,10 @@ func (s *Server) feverSavedItemIDsHandler(c *router.Context) {
}
itemFilter.After = &items[len(items)-1].Id
}
states, _ := s.db.ListFeedStates()
writeFeverJSON(c, map[string]any{
"saved_item_ids": joinInts(itemIds),
}, getLastRefreshedOnTime(s.db.ListHTTPStates()))
}, getLastRefreshedOnTime(states))
}
func (s *Server) feverMarkHandler(c *router.Context) {
@@ -378,7 +386,7 @@ func (s *Server) feverMarkHandler(c *router.Context) {
markFilter := storage.MarkFilter{}
if id > 0 {
markFilter.FolderID = &id
}
}
x, _ := strconv.ParseInt(c.Req.Form.Get("before"), 10, 64)
if x > 0 {
before := time.Unix(x, 0).UTC()

View File

@@ -162,7 +162,15 @@ func (s *Server) handleFeedRefresh(c *router.Context) {
}
func (s *Server) handleFeedErrors(c *router.Context) {
errors := s.db.GetFeedErrors()
errors := make(map[int64]string)
states, err := s.db.ListFeedStates()
if err == nil {
for _, state := range states {
if state.LastError != "" {
errors[state.FeedID] = state.LastError
}
}
}
c.JSON(http.StatusOK, errors)
}