diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index c49ad4d..3e8a1e0 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -1,19 +1,29 @@ class HomeController < ApplicationController STORIES_PER_PAGE = 25 + # for rss feeds, load the user's tag filters if a token is passed + before_filter :find_user_from_rss_token, :only => [ :index, :newest ] + def index @stories = find_stories_for_user_and_tag_and_newest_and_by_user(@user, nil, false, nil) @rss_link ||= "" + "title=\"RSS 2.0\" href=\"/rss" << + (@user ? "?token=#{@user.rss_token}" : "") << "\" />" @heading = @title = "" @cur_url = "/" respond_to do |format| format.html { render :action => "index" } - format.rss { render :action => "rss", :layout => false } + format.rss { + if @user && params[:token].present? + @title = "Private feed for #{@user.username}" + end + + render :action => "rss", :layout => false + } end end @@ -25,13 +35,20 @@ class HomeController < ApplicationController @cur_url = "/newest" @rss_link = "" + "title=\"RSS 2.0 - Newest Items\" href=\"/newest.rss" << + (@user ? "?token=#{@user.rss_token}" : "") << "\" />" @newest = true respond_to do |format| format.html { render :action => "index" } - format.rss { render :action => "rss", :layout => false } + format.rss { + if @user && params[:token].present? + @title += " - Private feed for #{@user.username}" + end + + render :action => "rss", :layout => false + } end end @@ -168,4 +185,10 @@ private [ stories, show_more ] end + + def find_user_from_rss_token + if !@user && request[:format] == "rss" && params[:token].to_s.present? + @user = User.find_by_rss_token(params[:token]) + end + end end diff --git a/app/models/user.rb b/app/models/user.rb index 25d0605..2a7ebf7 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -28,7 +28,7 @@ class User < ActiveRecord::Base :pushover_mentions before_save :check_session_token - after_create :create_default_tag_filters + after_create :create_default_tag_filters, :create_rss_token def check_session_token if self.session_token.blank? @@ -45,6 +45,12 @@ class User < ActiveRecord::Base end end + def create_rss_token + if self.rss_token.blank? + self.rss_token = Utils.random_str(60) + end + end + def unread_message_count Keystore.value_for("user:#{self.id}:unread_messages").to_i end diff --git a/db/migrate/20120918152116_private_rss_feed.rb b/db/migrate/20120918152116_private_rss_feed.rb new file mode 100644 index 0000000..07c7498 --- /dev/null +++ b/db/migrate/20120918152116_private_rss_feed.rb @@ -0,0 +1,9 @@ +class PrivateRssFeed < ActiveRecord::Migration + def up + add_column :users, :rss_token, :string + end + + def down + remove_column :users, :rss_token + end +end diff --git a/db/schema.rb b/db/schema.rb index c74936e..00a5690 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20120910172514) do +ActiveRecord::Schema.define(:version => 20120918152116) do create_table "comments", :force => true do |t| t.datetime "created_at", :null => false @@ -139,6 +139,7 @@ ActiveRecord::Schema.define(:version => 20120910172514) do t.boolean "is_moderator", :default => false t.boolean "email_mentions", :default => false t.boolean "pushover_mentions", :default => false + t.string "rss_token" end add_index "users", ["session_token"], :name => "session_hash", :unique => true