From d5b8f2fb8839189bdf6893da0f86f3bb26001d3d Mon Sep 17 00:00:00 2001 From: Frédéric Guillot Date: Sun, 24 Dec 2017 18:04:34 -0800 Subject: Improve API --- storage/entry.go | 37 +++++++++++++++++++++++-------------- storage/feed.go | 32 +++++++++++++++----------------- storage/user.go | 3 ++- 3 files changed, 40 insertions(+), 32 deletions(-) (limited to 'storage') diff --git a/storage/entry.go b/storage/entry.go index 8a12f5e..7f3eaf4 100644 --- a/storage/entry.go +++ b/storage/entry.go @@ -21,8 +21,8 @@ func (s *Storage) GetEntryQueryBuilder(userID int64, timezone string) *EntryQuer return NewEntryQueryBuilder(s, userID, timezone) } -// CreateEntry add a new entry. -func (s *Storage) CreateEntry(entry *model.Entry) error { +// createEntry add a new entry. +func (s *Storage) createEntry(entry *model.Entry) error { query := ` INSERT INTO entries (title, hash, url, published_at, content, author, user_id, feed_id) @@ -76,8 +76,8 @@ func (s *Storage) UpdateEntryContent(entry *model.Entry) error { return err } -// UpdateEntry update an entry when a feed is refreshed. -func (s *Storage) UpdateEntry(entry *model.Entry) error { +// updateEntry update an entry when a feed is refreshed. +func (s *Storage) updateEntry(entry *model.Entry) error { query := ` UPDATE entries SET title=$1, url=$2, published_at=$3, content=$4, author=$5 @@ -108,8 +108,8 @@ func (s *Storage) UpdateEntry(entry *model.Entry) error { return s.UpdateEnclosures(entry.Enclosures) } -// EntryExists checks if an entry already exists based on its hash when refreshing a feed. -func (s *Storage) EntryExists(entry *model.Entry) bool { +// entryExists checks if an entry already exists based on its hash when refreshing a feed. +func (s *Storage) entryExists(entry *model.Entry) bool { var result int query := `SELECT count(*) as c FROM entries WHERE user_id=$1 AND feed_id=$2 AND hash=$3` s.db.QueryRow(query, entry.UserID, entry.FeedID, entry.Hash).Scan(&result) @@ -123,10 +123,10 @@ func (s *Storage) UpdateEntries(userID, feedID int64, entries model.Entries) (er entry.UserID = userID entry.FeedID = feedID - if s.EntryExists(entry) { - err = s.UpdateEntry(entry) + if s.entryExists(entry) { + err = s.updateEntry(entry) } else { - err = s.CreateEntry(entry) + err = s.createEntry(entry) } if err != nil { @@ -136,15 +136,15 @@ func (s *Storage) UpdateEntries(userID, feedID int64, entries model.Entries) (er entryHashes = append(entryHashes, entry.Hash) } - if err := s.CleanupEntries(feedID, entryHashes); err != nil { + if err := s.cleanupEntries(feedID, entryHashes); err != nil { logger.Error("[Storage:CleanupEntries] %v", err) } return nil } -// CleanupEntries deletes from the database entries marked as "removed" and not visible anymore in the feed. -func (s *Storage) CleanupEntries(feedID int64, entryHashes []string) error { +// cleanupEntries deletes from the database entries marked as "removed" and not visible anymore in the feed. +func (s *Storage) cleanupEntries(feedID int64, entryHashes []string) error { query := ` DELETE FROM entries WHERE feed_id=$1 AND @@ -184,9 +184,18 @@ func (s *Storage) ToggleBookmark(userID int64, entryID int64) error { defer helper.ExecutionTime(time.Now(), fmt.Sprintf("[Storage:ToggleBookmark] userID=%d, entryID=%d", userID, entryID)) query := `UPDATE entries SET starred = NOT starred WHERE user_id=$1 AND id=$2` - _, err := s.db.Exec(query, userID, entryID) + result, err := s.db.Exec(query, userID, entryID) if err != nil { - return fmt.Errorf("unable to update toggle bookmark: %v", err) + return fmt.Errorf("unable to toggle bookmark flag: %v", err) + } + + count, err := result.RowsAffected() + if err != nil { + return fmt.Errorf("unable to toogle bookmark flag: %v", err) + } + + if count == 0 { + return errors.New("nothing has been updated") } return nil diff --git a/storage/feed.go b/storage/feed.go index 602bec7..7221094 100644 --- a/storage/feed.go +++ b/storage/feed.go @@ -70,9 +70,8 @@ func (s *Storage) Feeds(userID int64) (model.Feeds, error) { for rows.Next() { var feed model.Feed - var iconID, errorMsg interface{} + var iconID interface{} feed.Category = &model.Category{UserID: userID} - feed.Icon = &model.FeedIcon{} err := rows.Scan( &feed.ID, @@ -84,7 +83,7 @@ func (s *Storage) Feeds(userID int64) (model.Feeds, error) { &feed.UserID, &feed.CheckedAt, &feed.ParsingErrorCount, - &errorMsg, + &feed.ParsingErrorMsg, &feed.ScraperRules, &feed.RewriteRules, &feed.Crawler, @@ -94,22 +93,13 @@ func (s *Storage) Feeds(userID int64) (model.Feeds, error) { ) if err != nil { - return nil, fmt.Errorf("Unable to fetch feeds row: %v", err) + return nil, fmt.Errorf("unable to fetch feeds row: %v", err) } - if iconID == nil { - feed.Icon.IconID = 0 - } else { - feed.Icon.IconID = iconID.(int64) + if iconID != nil { + feed.Icon = &model.FeedIcon{FeedID: feed.ID, IconID: iconID.(int64)} } - if errorMsg == nil { - feed.ParsingErrorMsg = "" - } else { - feed.ParsingErrorMsg = errorMsg.(string) - } - - feed.Icon.FeedID = feed.ID feeds = append(feeds, &feed) } @@ -121,6 +111,7 @@ func (s *Storage) FeedByID(userID, feedID int64) (*model.Feed, error) { defer helper.ExecutionTime(time.Now(), fmt.Sprintf("[Storage:FeedByID] feedID=%d", feedID)) var feed model.Feed + var iconID interface{} feed.Category = &model.Category{UserID: userID} query := ` @@ -128,9 +119,11 @@ func (s *Storage) FeedByID(userID, feedID int64) (*model.Feed, error) { f.id, f.feed_url, f.site_url, f.title, f.etag_header, f.last_modified_header, f.user_id, f.checked_at, f.parsing_error_count, f.parsing_error_msg, f.scraper_rules, f.rewrite_rules, f.crawler, - f.category_id, c.title as category_title + f.category_id, c.title as category_title, + fi.icon_id FROM feeds f LEFT JOIN categories c ON c.id=f.category_id + LEFT JOIN feed_icons fi ON fi.feed_id=f.id WHERE f.user_id=$1 AND f.id=$2` err := s.db.QueryRow(query, userID, feedID).Scan( @@ -149,6 +142,7 @@ func (s *Storage) FeedByID(userID, feedID int64) (*model.Feed, error) { &feed.Crawler, &feed.Category.ID, &feed.Category.Title, + &iconID, ) switch { @@ -158,6 +152,10 @@ func (s *Storage) FeedByID(userID, feedID int64) (*model.Feed, error) { return nil, fmt.Errorf("unable to fetch feed: %v", err) } + if iconID != nil { + feed.Icon = &model.FeedIcon{FeedID: feed.ID, IconID: iconID.(int64)} + } + return &feed, nil } @@ -189,7 +187,7 @@ func (s *Storage) CreateFeed(feed *model.Feed) error { for i := 0; i < len(feed.Entries); i++ { feed.Entries[i].FeedID = feed.ID feed.Entries[i].UserID = feed.UserID - err := s.CreateEntry(feed.Entries[i]) + err := s.createEntry(feed.Entries[i]) if err != nil { return err } diff --git a/storage/user.go b/storage/user.go index 06a50e2..427b391 100644 --- a/storage/user.go +++ b/storage/user.go @@ -72,13 +72,14 @@ func (s *Storage) CreateUser(user *model.User) (err error) { (username, password, is_admin, extra) VALUES ($1, $2, $3, $4) - RETURNING id, language, theme, timezone` + RETURNING id, language, theme, timezone, entry_direction` err = s.db.QueryRow(query, strings.ToLower(user.Username), password, user.IsAdmin, extra).Scan( &user.ID, &user.Language, &user.Theme, &user.Timezone, + &user.EntryDirection, ) if err != nil { return fmt.Errorf("unable to create user: %v", err) -- cgit v1.2.3