Skip to content

Commit

Permalink
Add enclosures to /v1/entries API endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
fguillot committed Oct 6, 2023
1 parent fccc25f commit 6dd090a
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 11 deletions.
1 change: 1 addition & 0 deletions internal/api/entry.go
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ func (h *handler) findEntries(w http.ResponseWriter, r *http.Request, feedID int
builder.WithOffset(offset)
builder.WithLimit(limit)
builder.WithTags(tags)
builder.WithEnclosures()
configureFilters(builder, r)

entries, err := builder.GetEntries()
Expand Down
4 changes: 4 additions & 0 deletions internal/model/entry.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ func NewEntry() *Entry {
return &Entry{
Enclosures: make(EnclosureList, 0),
Tags: make([]string, 0),
Feed: &Feed{
Category: &Category{},
Icon: &FeedIcon{},
},
}
}

Expand Down
37 changes: 26 additions & 11 deletions internal/storage/entry_query_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,13 @@ type EntryQueryBuilder struct {
sortExpressions []string
limit int
offset int
fetchEnclosures bool
}

// WithEnclosures fetches enclosures for each entry.
func (e *EntryQueryBuilder) WithEnclosures() *EntryQueryBuilder {
e.fetchEnclosures = true
return e
}

// WithSearchQuery adds full-text search query to the condition.
Expand Down Expand Up @@ -223,7 +230,7 @@ func (e *EntryQueryBuilder) CountEntries() (count int, err error) {

err = e.store.db.QueryRow(fmt.Sprintf(query, condition), e.args...).Scan(&count)
if err != nil {
return 0, fmt.Errorf("unable to count entries: %v", err)
return 0, fmt.Errorf("store: unable to count entries: %v", err)
}

return count, nil
Expand Down Expand Up @@ -270,11 +277,13 @@ func (e *EntryQueryBuilder) GetEntries() (model.Entries, error) {
e.created_at,
e.changed_at,
e.tags,
(SELECT true FROM enclosures WHERE entry_id=e.id LIMIT 1) as has_enclosure,
f.title as feed_title,
f.feed_url,
f.site_url,
f.checked_at,
f.category_id, c.title as category_title,
f.category_id,
c.title as category_title,
f.scraper_rules,
f.rewrite_rules,
f.crawler,
Expand Down Expand Up @@ -303,19 +312,17 @@ func (e *EntryQueryBuilder) GetEntries() (model.Entries, error) {

rows, err := e.store.db.Query(query, e.args...)
if err != nil {
return nil, fmt.Errorf("unable to get entries: %v", err)
return nil, fmt.Errorf("store: unable to get entries: %v", err)
}
defer rows.Close()

entries := make(model.Entries, 0)
for rows.Next() {
var entry model.Entry
var iconID sql.NullInt64
var tz string
var hasEnclosure sql.NullBool

entry.Feed = &model.Feed{}
entry.Feed.Category = &model.Category{}
entry.Feed.Icon = &model.FeedIcon{}
entry := model.NewEntry()

err := rows.Scan(
&entry.ID,
Expand All @@ -335,6 +342,7 @@ func (e *EntryQueryBuilder) GetEntries() (model.Entries, error) {
&entry.CreatedAt,
&entry.ChangedAt,
pq.Array(&entry.Tags),
&hasEnclosure,
&entry.Feed.Title,
&entry.Feed.FeedURL,
&entry.Feed.SiteURL,
Expand All @@ -353,7 +361,14 @@ func (e *EntryQueryBuilder) GetEntries() (model.Entries, error) {
)

if err != nil {
return nil, fmt.Errorf("unable to fetch entry row: %v", err)
return nil, fmt.Errorf("store: unable to fetch entry row: %v", err)
}

if hasEnclosure.Valid && hasEnclosure.Bool && e.fetchEnclosures {
entry.Enclosures, err = e.store.GetEnclosures(entry.ID)
if err != nil {
return nil, fmt.Errorf("store: unable to fetch enclosures for entry #%d: %w", entry.ID, err)
}
}

if iconID.Valid {
Expand All @@ -372,7 +387,7 @@ func (e *EntryQueryBuilder) GetEntries() (model.Entries, error) {
entry.Feed.UserID = entry.UserID
entry.Feed.Icon.FeedID = entry.FeedID
entry.Feed.Category.UserID = entry.UserID
entries = append(entries, &entry)
entries = append(entries, entry)
}

return entries, nil
Expand All @@ -387,7 +402,7 @@ func (e *EntryQueryBuilder) GetEntryIDs() ([]int64, error) {

rows, err := e.store.db.Query(query, e.args...)
if err != nil {
return nil, fmt.Errorf("unable to get entries: %v", err)
return nil, fmt.Errorf("store: unable to get entries: %v", err)
}
defer rows.Close()

Expand All @@ -397,7 +412,7 @@ func (e *EntryQueryBuilder) GetEntryIDs() ([]int64, error) {

err := rows.Scan(&entryID)
if err != nil {
return nil, fmt.Errorf("unable to fetch entry row: %v", err)
return nil, fmt.Errorf("store: unable to fetch entry row: %v", err)
}

entryIDs = append(entryIDs, entryID)
Expand Down

0 comments on commit 6dd090a

Please sign in to comment.