From 13ba13215929a3c7dfca1c2e242ee69cdd38a7a0 Mon Sep 17 00:00:00 2001 From: Dennis Date: Sun, 24 Aug 2025 22:28:17 +0200 Subject: [PATCH] feat: inserts last 10 articles into DB on feed add --- cmd/add.go | 4 +- internal/database/article.go | 61 ++++++++++++++++++++++ internal/database/migrations/2_article.sql | 1 - internal/feed.go | 30 +++++++---- internal/feed_test.go | 11 ---- 5 files changed, 84 insertions(+), 23 deletions(-) create mode 100644 internal/database/article.go delete mode 100644 internal/feed_test.go diff --git a/cmd/add.go b/cmd/add.go index 664a64e..9621764 100644 --- a/cmd/add.go +++ b/cmd/add.go @@ -18,7 +18,7 @@ package cmd import ( "fmt" - feed "freed/internal" + "freed/internal" "os" "github.com/spf13/cobra" @@ -35,7 +35,7 @@ Supported types currently are: - RSS - Youtube Channel links`, Run: func(cmd *cobra.Command, args []string) { - if err := feed.Add(args[0]); err != nil { + if err := internal.AddFeed(args[0]); err != nil { // TODO: Prettify this/all errors fmt.Printf("Error adding feed: %v\n", err) os.Exit(1) diff --git a/internal/database/article.go b/internal/database/article.go new file mode 100644 index 0000000..c58a87b --- /dev/null +++ b/internal/database/article.go @@ -0,0 +1,61 @@ +package database + +import ( + "fmt" + "time" +) + +type Article struct { + Name string + Url string + ReadAt *time.Time + FeedId int64 +} + +func (a Article) Insert() (int64, error) { + result, err := db.Exec("INSERT INTO article (name, url, readAt, feedId) VALUES (?, ?, ?, ?)", a.Name, a.Url, a.ReadAt, a.FeedId) + + if err != nil { + return 0, err + } + + id, err := result.LastInsertId() + + if err != nil { + return 0, err + } + + return id, nil +} + +func InsertMultipleArticles(articles []Article) error { + if len(articles) == 0 { + return nil + } + + tx, err := db.Begin() + + if err != nil { + return err + } + + defer tx.Rollback() + + stmt, err := tx.Prepare("INSERT INTO article (name, url, readAt, feedId) VALUES (?, ?, ?, ?)") + + if err != nil { + return err + } + + defer stmt.Close() + + for _, article := range articles { + fmt.Printf("article %+v", article) + _, err := stmt.Exec(article.Name, article.Url, article.ReadAt, article.FeedId) + if err != nil { + return err + } + } + + return tx.Commit() +} diff --git a/internal/database/migrations/2_article.sql b/internal/database/migrations/2_article.sql index 8027680..396694f 100644 --- a/internal/database/migrations/2_article.sql +++ b/internal/database/migrations/2_article.sql @@ -3,7 +3,6 @@ CREATE table article ( id INTEGER PRIMARY KEY, name text NOT NULL, url text NOT NULL UNIQUE, - read INTEGER DEFAULT 0, readAt text, feedId INTEGER, FOREIGN KEY (feedId) REFERENCES feed(id) diff --git a/internal/feed.go b/internal/feed.go index 2eda21b..bee5907 100644 --- a/internal/feed.go +++ b/internal/feed.go @@ -1,4 +1,4 @@ -package feed +package internal import ( "fmt" @@ -8,7 +8,7 @@ import ( "github.com/mmcdole/gofeed" ) -func Add(feedUrl string) error { +func AddFeed(feedUrl string) error { if _, err := url.ParseRequestURI(feedUrl); err != nil { return fmt.Errorf("The given URL does not seem to be valid: %s", err) } @@ -19,27 +19,39 @@ func Add(feedUrl string) error { return err } - fmt.Printf("feed: %+v", feed) - - // TODO: I have everything here (feed), might as well store it right away - // So, implement a loop to do that here - f := database.Feed{ Name: feed.Title, Url: feedUrl, } - if _, err := f.Insert(); err != nil { + feedId, err := f.Insert() + if err != nil { return err } + articles := make([]database.Article, 0, 10) + + for i, v := range feed.Items { + if i < 10 { + a := database.Article{ + Name: v.Title, + Url: v.Link, + FeedId: feedId, + } + + articles = append(articles, a) + } + } + + database.InsertMultipleArticles(articles) + return nil } func parseByUrl(u string) (*gofeed.Feed, error) { fp := gofeed.NewParser() - feed, err := fp.ParseURL(u) + feed, err := fp.ParseURL(u) if err != nil { return nil, err } diff --git a/internal/feed_test.go b/internal/feed_test.go deleted file mode 100644 index f8ac96c..0000000 --- a/internal/feed_test.go +++ /dev/null @@ -1,11 +0,0 @@ -package feed - -import "testing" - -func TestAdd(t *testing.T) { - gotErr := Add("gibberish") - - if gotErr == nil { - t.Errorf("Expected Add function to throw an error if an invalid URL is provided") - } -}