From ab8f8f3a728f7e6b8799544403fab1789cba4fef Mon Sep 17 00:00:00 2001 From: Fredrik Wallgren Date: Mon, 11 Mar 2013 14:19:26 -0400 Subject: [PATCH] Add upvoted route. Upvoted route shows all stories a logged in user have upvoted in reverse chronological order, latest upvote first. It is not shown in the gui, but reachable at /upvoted. --- app/controllers/home_controller.rb | 25 ++++++++++++++++++++++++ app/models/story.rb | 4 ++++ app/models/user.rb | 8 ++++++++ config/routes.rb | 3 +++ spec/controllers/home_controller_spec.rb | 11 ++++++++++- 5 files changed, 50 insertions(+), 1 deletion(-) diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 0be13de..3afb988 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -2,6 +2,7 @@ class HomeController < ApplicationController # for rss feeds, load the user's tag filters if a token is passed before_filter :find_user_from_rss_token, :only => [ :index, :newest ] before_filter { @page = page } + before_filter :require_logged_in_user, :only => [:upvoted] def about begin @@ -163,6 +164,30 @@ class HomeController < ApplicationController render :action => "index" end + def upvoted + @stories, @show_more = get_from_cache(upvoted: true, user: @user) { + paginate @user.upvoted_stories.order('votes.id DESC') + } + + @heading = @title = "Upvoted" + @cur_url = "/upvoted" + + @rss_link = { :title => "RSS 2.0 - Upvoted Items", + :href => "/upvoted.rss#{(@user ? "?token=#{@user.rss_token}" : "")}" } + + respond_to do |format| + format.html { render :action => "index" } + format.rss { + if @user && params[:token].present? + @title += " - Private feed for #{@user.username}" + end + + render :action => "rss", :layout => false + } + format.json { render :json => @stories } + end + end + private def filtered_tag_ids if @user diff --git a/app/models/story.rb b/app/models/story.rb index 5722bd3..3fed063 100644 --- a/app/models/story.rb +++ b/app/models/story.rb @@ -11,6 +11,10 @@ class Story < ActiveRecord::Base has_many :comments, :inverse_of => :story has_many :tags, :through => :taggings + has_many :votes, -> { where(:comment_id => nil) } + has_many :voters, -> { where('votes.comment_id' => nil) }, + :through => :votes, + :source => :user scope :unmerged, -> { where(:merged_story_id => nil) } diff --git a/app/models/user.rb b/app/models/user.rb index ebbc906..81e8caa 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -20,6 +20,14 @@ class User < ActiveRecord::Base :class_name => "User" has_many :invitations has_many :weblogs + has_many :votes + has_many :voted_stories, -> { where('votes.comment_id' => nil) }, + :through => :votes, + :source => :story + has_many :upvoted_stories, + -> { where('votes.comment_id' => nil, 'votes.vote' => 1) }, + :through => :votes, + :source => :story has_secure_password diff --git a/config/routes.rb b/config/routes.rb index e9fa5bd..3f72ff3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -28,6 +28,9 @@ Lobsters::Application.routes.draw do get "/hidden" => "home#hidden" get "/hidden/page/:page" => "home#hidden" + get "/upvoted(.format)" => "home#upvoted" + get "/upvoted/page/:page" => "home#upvoted" + get "/top" => "home#top" get "/top/page/:page" => "home#top" get "/top/:length" => "home#top" diff --git a/spec/controllers/home_controller_spec.rb b/spec/controllers/home_controller_spec.rb index a50d9cf..85f7a72 100644 --- a/spec/controllers/home_controller_spec.rb +++ b/spec/controllers/home_controller_spec.rb @@ -1,6 +1,10 @@ describe HomeController do before { Rails.cache.clear } - before { StoriesPaginator.any_instance.should_receive(:get).and_return [scope, true] } + before { + unless example.metadata[:skip_before] + StoriesPaginator.any_instance.should_receive(:get).and_return [scope, true] + end + } describe 'GET index' do let(:scope) { double 'Hottest Scope' } @@ -127,4 +131,9 @@ describe HomeController do end end end + + describe 'GET upvoted', skip_before: true do + before { get 'upvoted' } + it { should redirect_to(login_path) } + end end