diff options
| author | AKP <abi@tdpain.net> | 2025-02-09 23:29:13 +0000 |
|---|---|---|
| committer | AKP <abi@tdpain.net> | 2025-02-09 23:29:13 +0000 |
| commit | 59b1fb1753b199de9d7fb38310cf28b30470064b (patch) | |
| tree | 4fb7a9d42e4c7190223e0864bdd2b5dc225d57de | |
| parent | 0a94d685fd437bb27abc301ce9b1b72496316eaf (diff) | |
Cache feed items when adding new feed
| -rw-r--r-- | walrss/internal/core/feedItems.go | 28 | ||||
| -rw-r--r-- | walrss/internal/db/20250209224630_feeditems.up.sql | 7 | ||||
| -rw-r--r-- | walrss/internal/db/db.go | 9 | ||||
| -rw-r--r-- | walrss/internal/http/new.go | 7 | ||||
| -rw-r--r-- | walrss/internal/rss/setup.go | 23 |
5 files changed, 73 insertions, 1 deletions
diff --git a/walrss/internal/core/feedItems.go b/walrss/internal/core/feedItems.go new file mode 100644 index 0000000..a0ad14f --- /dev/null +++ b/walrss/internal/core/feedItems.go @@ -0,0 +1,28 @@ +package core + +import ( + "context" + "github.com/codemicro/walrss/walrss/internal/db" + "github.com/codemicro/walrss/walrss/internal/state" +) + +func NewFeedItem(st *state.State, feedID, itemID string) (*db.FeedItem, error) { + fi := &db.FeedItem{ + FeedID: feedID, + ItemID: itemID, + } + return fi, NewFeedItems(st, []*db.FeedItem{fi}) +} + +func NewFeedItems(st *state.State, fis []*db.FeedItem) error { + _, err := st.Data.NewInsert().Model(&fis).Exec(context.Background()) + return err +} + +func GetFeedItemsForFeed(st *state.State, feedID string) (res []*db.FeedItem, err error) { + err = st.Data.NewSelect(). + Model(&res). + Where("feed_id = ?", feedID). + Scan(context.Background()) + return +} diff --git a/walrss/internal/db/20250209224630_feeditems.up.sql b/walrss/internal/db/20250209224630_feeditems.up.sql new file mode 100644 index 0000000..7373416 --- /dev/null +++ b/walrss/internal/db/20250209224630_feeditems.up.sql @@ -0,0 +1,7 @@ +CREATE TABLE "feed_items" +( + feed_id VARCHAR NOT NULL, + item_id VARCHAR NOT NULL, + PRIMARY KEY ("feed_id", "item_id"), + FOREIGN KEY ("feed_id") REFERENCES "feeds"("id") ON DELETE CASCADE +); diff --git a/walrss/internal/db/db.go b/walrss/internal/db/db.go index 7d36896..37e093a 100644 --- a/walrss/internal/db/db.go +++ b/walrss/internal/db/db.go @@ -88,3 +88,12 @@ func (f FeedSlice) Less(i, j int) bool { func (f FeedSlice) Swap(i, j int) { f[i], f[j] = f[j], f[i] } + +type FeedItem struct { + bun.BaseModel `bun:"table:feed_items"` + + FeedID string `bun:"feed_id,notnull"` + ItemID string `bun:"item_id,notnull"` + + // Feed *Feed `bun:",rel:belongs-to,join:feed_id=id"` // don't think this is needed but here in case?? +} diff --git a/walrss/internal/http/new.go b/walrss/internal/http/new.go index 0932123..89c02dc 100644 --- a/walrss/internal/http/new.go +++ b/walrss/internal/http/new.go @@ -1,8 +1,10 @@ package http import ( + "fmt" "github.com/codemicro/walrss/walrss/internal/core" "github.com/codemicro/walrss/walrss/internal/http/views" + "github.com/codemicro/walrss/walrss/internal/rss" "github.com/codemicro/walrss/walrss/internal/urls" "github.com/gofiber/fiber/v2" ) @@ -24,11 +26,14 @@ func (s *Server) newFeedItem(ctx *fiber.Ctx) error { ctx.FormValue("name"), ctx.FormValue("url"), ) - if err != nil { return err } + if err := rss.LoadInitialItems(s.state, feed); err != nil { + return fmt.Errorf("load initial items for new feed %s: %w", feed.ID, err) + } + return ctx.SendString(views.RenderFeedRow(feed.ID, feed.Name, feed.URL)) } diff --git a/walrss/internal/rss/setup.go b/walrss/internal/rss/setup.go new file mode 100644 index 0000000..27f62ad --- /dev/null +++ b/walrss/internal/rss/setup.go @@ -0,0 +1,23 @@ +package rss + +import ( + "fmt" + "github.com/codemicro/walrss/walrss/internal/core" + "github.com/codemicro/walrss/walrss/internal/db" + "github.com/codemicro/walrss/walrss/internal/state" +) + +func LoadInitialItems(st *state.State, feed *db.Feed) error { + content, err := getFeedContent(st, feed) + if err != nil { + return core.AsUserError(400, fmt.Errorf("get feed content: %w", err)) + } + + var fis []*db.FeedItem + + for _, item := range content.Items { + fis = append(fis, &db.FeedItem{FeedID: feed.ID, ItemID: item.GUID}) + } + + return core.NewFeedItems(st, fis) +} |
