aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--walrss/internal/core/feedItems.go28
-rw-r--r--walrss/internal/db/20250209224630_feeditems.up.sql7
-rw-r--r--walrss/internal/db/db.go9
-rw-r--r--walrss/internal/http/new.go7
-rw-r--r--walrss/internal/rss/setup.go23
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)
+}