From f05f0fa8084543ee5a4e6e6eda5ccc286d7f9c6d Mon Sep 17 00:00:00 2001 From: Sylvain UTARD Date: Sat, 7 Mar 2015 11:39:06 +0100 Subject: [PATCH] Tag items that are on the front page every minute --- app/assets/templates/api.html.haml | 3 +++ app/controllers/home_controller.rb | 4 +--- app/models/item.rb | 1 + app/workers/hacker_news_realtime_crawler.rb | 10 ++++++++++ config/schedule.rb | 1 + db/migrate/20150307103111_add_front_page_flag.rb | 6 ++++++ db/schema.rb | 4 +++- 7 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 db/migrate/20150307103111_add_front_page_flag.rb diff --git a/app/assets/templates/api.html.haml b/app/assets/templates/api.html.haml index 22816a4d..a698c10e 100644 --- a/app/assets/templates/api.html.haml +++ b/app/assets/templates/api.html.haml @@ -59,6 +59,7 @@ %li pollopt %li show_hn %li ask_hn + %li front_page %li author_:USERNAME %li story_:ID %td @@ -95,6 +96,8 @@ %dd #{api_v1_search_url(host: 'hn.algolia.com')}?query=bar&tags=comment %dt All URLs matching bar %dd #{api_v1_search_url(host: 'hn.algolia.com')}?query=bar&restrictSearchableAttributes=url + %dt All stories that are on the front/home page right now + %dd #{api_v1_search_url(host: 'hn.algolia.com')}?tags=front_page %dt Last stories %dd #{api_v1_search_by_date_url(host: 'hn.algolia.com')}?tags=story %dt Last stories OR polls diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index c01b751d..48cbb658 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -18,9 +18,7 @@ def popular end def front_page - @stories = SimpleRSS.parse(Net::HTTP.get(URI.parse('https://news.ycombinator.com/rss'))).items.map do |item| - Item.find(item[:comments].split('=').last) rescue nil - end.compact + @stories = Item.where(front_page: true).all @updated_at = DateTime.now @title = "HN's home page" feed diff --git a/app/models/item.rb b/app/models/item.rb index 99bdfded..532b45d2 100644 --- a/app/models/item.rb +++ b/app/models/item.rb @@ -38,6 +38,7 @@ class Item < ActiveRecord::Base t << 'ask_hn' end end + t << 'front_page' if front_page t end queryType 'prefixLast' diff --git a/app/workers/hacker_news_realtime_crawler.rb b/app/workers/hacker_news_realtime_crawler.rb index 63417cdd..0e614df3 100644 --- a/app/workers/hacker_news_realtime_crawler.rb +++ b/app/workers/hacker_news_realtime_crawler.rb @@ -58,6 +58,16 @@ def indexing_check RestClient.post(ENV['HN_STATUS_API'], status: status, name: 'Indexing') rescue nil # not fatal end + def self.refresh_home_page! + old_front_pages = Item.where(front_page: true).select(:id).map(&:id) + Item.where(id: old_front_pages).update_all front_page: false + + new_front_pages = SimpleRSS.parse(Net::HTTP.get(URI.parse('https://news.ycombinator.com/rss'))).items.map { |item| item[:comments].split('=').last.to_i } + Item.where(id: new_front_pages).update_all front_page: true + + Item.where(id: (old_front_pages + new_front_pages)).reindex! + end + private def refresh(data = {}) diff --git a/config/schedule.rb b/config/schedule.rb index 3b51d088..449d4267 100644 --- a/config/schedule.rb +++ b/config/schedule.rb @@ -5,6 +5,7 @@ every 1.minute, roles: [:cron] do runner "HackerNewsRealtimeCrawler.new.sanity_check(100)" + runner "HackerNewsRealtimeCrawler.refresh_home_page!" runner "User.where('updated_at >= ?', 5.minute.ago).reindex!" runner "Item.where('updated_at >= ?', 5.minute.ago).reindex!" end diff --git a/db/migrate/20150307103111_add_front_page_flag.rb b/db/migrate/20150307103111_add_front_page_flag.rb new file mode 100644 index 00000000..91a8fc29 --- /dev/null +++ b/db/migrate/20150307103111_add_front_page_flag.rb @@ -0,0 +1,6 @@ +class AddFrontPageFlag < ActiveRecord::Migration + def change + add_column :items, :front_page, :boolean + add_index :items, :front_page + end +end diff --git a/db/schema.rb b/db/schema.rb index e3500d0b..03115fd7 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20141009182754) do +ActiveRecord::Schema.define(version: 20150307103111) do create_table "delayed_jobs", force: true do |t| t.integer "priority", default: 0, null: false @@ -42,11 +42,13 @@ t.integer "parent_id" t.integer "story_id" t.datetime "updated_at" + t.boolean "front_page" end add_index "items", ["author"], name: "index_items_on_author" add_index "items", ["dead"], name: "index_items_on_dead" add_index "items", ["deleted"], name: "index_items_on_deleted" + add_index "items", ["front_page"], name: "index_items_on_front_page" add_index "items", ["item_type_cd"], name: "index_items_on_item_type_cd" add_index "items", ["parent_id"], name: "index_items_on_parent_id" add_index "items", ["story_id"], name: "index_items_on_story_id"