journalduhacker/app/controllers/home_controller.rb

185 lines
4.8 KiB
Ruby
Raw Normal View History

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 ]
2014-07-07 18:05:53 +02:00
before_filter { @page = page }
2014-04-03 17:26:10 +02:00
def about
begin
render :action => "about"
rescue
render :text => "<div class=\"box wide\">" <<
"A mystery." <<
"</div>", :layout => "application"
end
end
2014-07-07 18:05:53 +02:00
def privacy
begin
render :action => "privacy"
rescue
render :text => "<div class=\"box wide\">" <<
"You apparently have no privacy." <<
"</div>", :layout => "application"
end
end
def hidden
2014-07-07 18:05:53 +02:00
@stories, @show_more = get_from_cache(hidden: true) { paginate stories.hidden }
@heading = @title = "Hidden Stories"
@cur_url = "/hidden"
render :action => "index"
end
2012-07-01 00:43:45 +02:00
def index
2014-07-07 18:05:53 +02:00
@stories, @show_more = get_from_cache(hottest: true) { paginate stories.hottest }
2014-03-12 23:50:51 +01:00
@rss_link ||= { :title => "RSS 2.0",
:href => "/rss#{@user ? "?token=#{@user.rss_token}" : ""}" }
@heading = @title = ""
2012-07-11 22:34:53 +02:00
@cur_url = "/"
2012-07-01 01:42:53 +02:00
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
2012-07-01 01:42:53 +02:00
end
2012-07-01 01:42:53 +02:00
def newest
2014-07-07 18:05:53 +02:00
@stories, @show_more = get_from_cache(newest: true) { paginate stories.newest }
@heading = @title = "Newest Stories"
2012-07-11 22:34:53 +02:00
@cur_url = "/newest"
2014-03-12 23:50:51 +01:00
@rss_link = { :title => "RSS 2.0 - Newest Items",
:href => "/newest.rss#{@user ? "?token=#{@user.rss_token}" : ""}" }
2012-07-01 01:42:53 +02:00
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 }
2012-07-01 01:42:53 +02:00
end
2012-06-30 21:14:35 +02:00
end
def newest_by_user
2014-01-25 17:38:07 +01:00
by_user = User.where(:username => params[:user]).first!
2014-07-07 18:05:53 +02:00
@stories, @show_more = get_from_cache(by_user: by_user) { paginate stories.by_user(by_user) }
2013-02-14 01:50:51 +01:00
2014-01-25 17:38:07 +01:00
@heading = @title = "Newest Stories by #{by_user.username}"
@cur_url = "/newest/#{by_user.username}"
@newest = true
2014-01-25 17:38:07 +01:00
@for_user = by_user.username
render :action => "index"
end
def recent
2014-07-07 18:05:53 +02:00
@stories, @show_more = get_from_cache(recent: true) do
scope = if page == 1
stories.recent
else
stories.newest
end
paginate scope
end
@heading = @title = "Recent Stories"
@cur_url = "/recent"
2014-03-12 23:50:51 +01:00
# our content changes every page load, so point at /newest.rss to be stable
@rss_link = { :title => "RSS 2.0 - Newest Items",
:href => "/newest.rss#{@user ? "?token=#{@user.rss_token}" : ""}" }
render :action => "index"
end
def tagged
@tag = Tag.where(:tag => params[:tag]).first!
2014-01-25 17:38:07 +01:00
2014-07-07 18:05:53 +02:00
@stories, @show_more = get_from_cache(tag: @tag) { paginate stories.tagged(@tag) }
2012-07-01 01:42:53 +02:00
@heading = @title = @tag.description.blank?? @tag.tag : @tag.description
2012-07-11 22:34:53 +02:00
@cur_url = tag_url(@tag.tag)
2014-03-12 23:50:51 +01:00
@rss_link = { :title => "RSS 2.0 - Tagged #{@tag.tag} (#{@tag.description})",
:href => "/t/#{@tag.tag}.rss" }
2012-07-01 01:42:53 +02:00
respond_to do |format|
format.html { render :action => "index" }
format.rss { render :action => "rss", :layout => false }
end
end
2012-07-07 00:33:27 +02:00
TOP_INTVS = { "d" => "Day", "w" => "Week", "m" => "Month", "y" => "Year" }
def top
@cur_url = "/top"
length = { :dur => 1, :intv => "Week" }
if m = params[:length].to_s.match(/\A(\d+)([#{TOP_INTVS.keys.join}])\z/)
length[:dur] = m[1].to_i
length[:intv] = TOP_INTVS[m[2]]
@cur_url << "/#{params[:length]}"
end
2014-07-07 18:05:53 +02:00
@stories, @show_more = get_from_cache(top: true, length: length) { paginate stories.top(length) }
if length[:dur] > 1
@heading = @title = "Top Stories of the Past #{length[:dur]} " <<
length[:intv] << "s"
else
@heading = @title = "Top Stories of the Past " << length[:intv]
end
render :action => "index"
end
2012-07-07 00:33:27 +02:00
private
2014-07-07 18:05:53 +02:00
def filtered_tag_ids
if @user
@user.tag_filters.map{|tf| tf.tag_id }
else
2014-07-07 18:05:53 +02:00
tags_filtered_by_cookie.map{|t| t.id }
end
end
2014-07-07 18:05:53 +02:00
def stories
StoryRepository.new(@user, exclude_tags: filtered_tag_ids)
end
2012-07-07 00:33:27 +02:00
2014-07-07 18:05:53 +02:00
def page
params[:page].to_i > 0 ? params[:page].to_i : 1
end
2012-07-07 00:33:27 +02:00
2014-07-07 18:05:53 +02:00
def paginate(scope)
StoriesPaginator.new(scope, page, @user).get
end
2014-07-07 18:05:53 +02:00
def get_from_cache(opts={}, &block)
if Rails.env.development? || @user || tags_filtered_by_cookie.any?
yield
else
2014-07-07 18:05:53 +02:00
key = opts.merge(page: page).sort.map{|k,v| "#{k}=#{v.to_param}" }.join(" ")
Rails.cache.fetch("stories #{key}", :expires_in => 45, &block)
2012-07-07 00:33:27 +02:00
end
end
end