Skip to content

Commit

Permalink
adjust sort order for feed entries so that new entries with older pub…
Browse files Browse the repository at this point in the history
…lished dates don't get buried
  • Loading branch information
mawise committed Oct 14, 2021
1 parent 9d9a299 commit c1e791d
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 10 deletions.
4 changes: 2 additions & 2 deletions app/controllers/feeds_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,14 @@ def destroy
# fetch content from feeds for reading
def read
UpdateFeedJob.perform_later
@entries = current_user.feed_entries.order(published: :desc).page params[:page]
@entries = current_user.feed_entries.order(sort_date: :desc).page params[:page]
end

def read_feed
@feed = Feed.find(params[:id])
@entries=[]
if ( (!@feed.nil?) and (current_user == @feed.user) )
@entries = @feed.feed_entries.order(published: :desc).page params[:page]
@entries = @feed.feed_entries.order(sort_date: :desc).page params[:page]
UpdateFeedJob.perform_later(@feed)
render :read
else
Expand Down
31 changes: 24 additions & 7 deletions app/jobs/update_feed_job.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,25 @@ class UpdateFeedJob < ApplicationJob
ERROR_INVALID = "Invalid Feed"

def perform(*feeds)
if feeds.empty?
latest_time = Time.zone.now # latest a new feed_entry can be
earliest_time = nil
if FeedEntry.count > 0
earliest_time = FeedEntry.order(sort_date: :desc).first.sort_date # earliest a new feed_entry can be
end
if feeds.empty? # updating all feeds, enforce sort_date restrictions
Feed.find_each do |feed|
update_feed(feed)
update_feed(feed, earliest_time, latest_time)
end
else
else # updating a single feed on creation, allow older sort_dates
feeds.each do |feed|
update_feed(feed)
update_feed(feed, nil, latest_time)
end
end
end

private

def update_feed(feed)
def update_feed(feed, earliest_time, latest_time)
# update feed title if not yet set
if feed.name.nil?
begin
Expand Down Expand Up @@ -63,14 +68,26 @@ def update_feed(feed)
if published.nil?
published = Time.zone.now
end
sort_date = published
unless earliest_time.nil?
if sort_date < earliest_time
sort_date = earliest_time
end
end
unless latest_time.nil?
if sort_date > latest_time
sort_date = latest_time
end
end
content = entry[ENTRY_CONTENT]
guid = entry[ENTRY_GUID]
matching_entry = feed.feed_entries.find_by(guid: guid)
record_data = {title: title, link: link, published: published, content: content, guid: guid}
record_data = {title: title, link: link, published: published, sort_date: sort_date, content: content, guid: guid}
update_data = {title: title, link: link, content: content}
if matching_entry.nil?
feed.feed_entries.create(record_data)
else
matching_entry.update(record_data) #Consider: exclude changes to published?
matching_entry.update(update_data)
end
end
feed.fetch_succeeded!
Expand Down
18 changes: 18 additions & 0 deletions db/migrate/20211013212351_add_sort_date_to_feed_entries.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
class AddSortDateToFeedEntries < ActiveRecord::Migration[5.2]
def change
add_column :feed_entries, :sort_date, :datetime
add_index :feed_entries, :sort_date

reversible do |dir|
dir.up do
FeedEntry.find_each do |f|
f.sort_date = f.published
f.save!
end
end
dir.down do
end
end

end
end
4 changes: 3 additions & 1 deletion db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 2021_08_30_223255) do
ActiveRecord::Schema.define(version: 2021_10_13_212351) do

# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
Expand Down Expand Up @@ -55,9 +55,11 @@
t.bigint "feed_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.datetime "sort_date"
t.index ["feed_id"], name: "index_feed_entries_on_feed_id"
t.index ["guid"], name: "index_feed_entries_on_guid"
t.index ["published"], name: "index_feed_entries_on_published"
t.index ["sort_date"], name: "index_feed_entries_on_sort_date"
end

create_table "feeds", force: :cascade do |t|
Expand Down

0 comments on commit c1e791d

Please sign in to comment.