aboutsummaryrefslogtreecommitdiffhomepage
path: root/storage/entry.go
diff options
context:
space:
mode:
Diffstat (limited to 'storage/entry.go')
-rw-r--r--storage/entry.go124
1 files changed, 124 insertions, 0 deletions
diff --git a/storage/entry.go b/storage/entry.go
new file mode 100644
index 0000000..84cfb0f
--- /dev/null
+++ b/storage/entry.go
@@ -0,0 +1,124 @@
+// Copyright 2017 Frédéric Guillot. All rights reserved.
+// Use of this source code is governed by the Apache 2.0
+// license that can be found in the LICENSE file.
+
+package storage
+
+import (
+ "errors"
+ "fmt"
+ "github.com/miniflux/miniflux2/helper"
+ "github.com/miniflux/miniflux2/model"
+ "time"
+
+ "github.com/lib/pq"
+)
+
+func (s *Storage) GetEntryQueryBuilder(userID int64, timezone string) *EntryQueryBuilder {
+ return NewEntryQueryBuilder(s, userID, timezone)
+}
+
+func (s *Storage) CreateEntry(entry *model.Entry) error {
+ query := `
+ INSERT INTO entries
+ (title, hash, url, published_at, content, author, user_id, feed_id)
+ VALUES
+ ($1, $2, $3, $4, $5, $6, $7, $8)
+ RETURNING id
+ `
+ err := s.db.QueryRow(
+ query,
+ entry.Title,
+ entry.Hash,
+ entry.URL,
+ entry.Date,
+ entry.Content,
+ entry.Author,
+ entry.UserID,
+ entry.FeedID,
+ ).Scan(&entry.ID)
+
+ if err != nil {
+ return fmt.Errorf("Unable to create entry: %v", err)
+ }
+
+ entry.Status = "unread"
+ for i := 0; i < len(entry.Enclosures); i++ {
+ entry.Enclosures[i].EntryID = entry.ID
+ entry.Enclosures[i].UserID = entry.UserID
+ err := s.CreateEnclosure(entry.Enclosures[i])
+ if err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
+func (s *Storage) UpdateEntry(entry *model.Entry) error {
+ query := `
+ UPDATE entries SET
+ title=$1, url=$2, published_at=$3, content=$4, author=$5
+ WHERE user_id=$6 AND feed_id=$7 AND hash=$8
+ `
+ _, err := s.db.Exec(
+ query,
+ entry.Title,
+ entry.URL,
+ entry.Date,
+ entry.Content,
+ entry.Author,
+ entry.UserID,
+ entry.FeedID,
+ entry.Hash,
+ )
+
+ return err
+}
+
+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)
+ return result >= 1
+}
+
+func (s *Storage) UpdateEntries(userID, feedID int64, entries model.Entries) (err error) {
+ for _, entry := range entries {
+ entry.UserID = userID
+ entry.FeedID = feedID
+
+ if s.EntryExists(entry) {
+ err = s.UpdateEntry(entry)
+ } else {
+ err = s.CreateEntry(entry)
+ }
+
+ if err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
+func (s *Storage) SetEntriesStatus(userID int64, entryIDs []int64, status string) error {
+ defer helper.ExecutionTime(time.Now(), fmt.Sprintf("[Storage:SetEntriesStatus] userID=%d, entryIDs=%v, status=%s", userID, entryIDs, status))
+
+ query := `UPDATE entries SET status=$1 WHERE user_id=$2 AND id=ANY($3)`
+ result, err := s.db.Exec(query, status, userID, pq.Array(entryIDs))
+ if err != nil {
+ return fmt.Errorf("Unable to update entry status: %v", err)
+ }
+
+ count, err := result.RowsAffected()
+ if err != nil {
+ return fmt.Errorf("Unable to update this entry: %v", err)
+ }
+
+ if count == 0 {
+ return errors.New("Nothing has been updated")
+ }
+
+ return nil
+}