2012-06-17 01:15:46 +00:00
|
|
|
class HomeController < ApplicationController
|
2018-06-23 04:46:06 +00:00
|
|
|
include IntervalHelper
|
|
|
|
|
2022-02-20 00:34:37 +00:00
|
|
|
caches_page :index, :newest, :newest_by_user, :recent, :top, if: CACHE_PAGE
|
2018-05-10 15:09:47 +00:00
|
|
|
|
2012-09-18 15:38:03 +00:00
|
|
|
# for rss feeds, load the user's tag filters if a token is passed
|
2020-06-19 22:13:27 +00:00
|
|
|
before_action :find_user_from_rss_token, :only => [:index, :newest, :saved, :upvoted]
|
2017-06-18 16:04:32 +00:00
|
|
|
before_action { @page = page }
|
2022-02-24 03:18:50 +00:00
|
|
|
before_action :require_logged_in_user, :only => [:hidden, :saved, :upvoted]
|
|
|
|
before_action :show_title_h1, only: [:top]
|
|
|
|
|
|
|
|
def active
|
|
|
|
@stories, @show_more = get_from_cache(active: true) {
|
|
|
|
paginate stories.active
|
|
|
|
}
|
|
|
|
|
|
|
|
@title = 'Active Discussions'
|
2022-02-27 03:13:56 +00:00
|
|
|
@above = 'active'
|
2022-02-24 03:18:50 +00:00
|
|
|
|
|
|
|
respond_to do |format|
|
|
|
|
format.html { render action: :index }
|
|
|
|
format.json { render json: @stories }
|
|
|
|
end
|
|
|
|
end
|
2012-09-18 15:38:03 +00:00
|
|
|
|
2014-03-03 23:14:33 +00:00
|
|
|
def hidden
|
2014-08-04 01:47:13 +00:00
|
|
|
@stories, @show_more = get_from_cache(hidden: true) {
|
|
|
|
paginate stories.hidden
|
|
|
|
}
|
2014-03-03 23:14:33 +00:00
|
|
|
|
2022-02-11 14:07:58 +00:00
|
|
|
@title = "Hidden Stories"
|
2022-02-27 03:13:56 +00:00
|
|
|
@above = 'saved/subnav'
|
2014-03-03 23:14:33 +00:00
|
|
|
|
|
|
|
render :action => "index"
|
|
|
|
end
|
|
|
|
|
2012-06-30 22:43:45 +00:00
|
|
|
def index
|
2014-08-04 01:47:13 +00:00
|
|
|
@stories, @show_more = get_from_cache(hottest: true) {
|
|
|
|
paginate stories.hottest
|
|
|
|
}
|
2012-06-17 01:15:46 +00:00
|
|
|
|
2018-03-14 13:01:14 +00:00
|
|
|
@rss_link ||= {
|
|
|
|
:title => "RSS 2.0",
|
2018-03-18 00:00:47 +00:00
|
|
|
:href => user_token_link("/rss"),
|
2018-03-14 13:01:14 +00:00
|
|
|
}
|
|
|
|
@comments_rss_link ||= {
|
|
|
|
:title => "Comments - RSS 2.0",
|
2018-03-18 00:00:47 +00:00
|
|
|
:href => user_token_link("/comments.rss"),
|
2018-03-14 13:01:14 +00:00
|
|
|
}
|
2012-06-17 01:15:46 +00:00
|
|
|
|
2022-02-11 14:07:58 +00:00
|
|
|
@title = ""
|
2022-02-26 23:57:06 +00:00
|
|
|
@root_path = true
|
2012-07-11 20:34:53 +00:00
|
|
|
|
2012-06-30 23:42:53 +00:00
|
|
|
respond_to do |format|
|
|
|
|
format.html { render :action => "index" }
|
2012-09-18 15:38:03 +00:00
|
|
|
format.rss {
|
2017-06-05 14:49:59 +00:00
|
|
|
if @user
|
2012-09-18 15:38:03 +00:00
|
|
|
@title = "Private feed for #{@user.username}"
|
2017-06-05 14:49:59 +00:00
|
|
|
render :action => "rss", :layout => false
|
|
|
|
else
|
|
|
|
content = Rails.cache.fetch("rss", :expires_in => (60 * 2)) {
|
|
|
|
render_to_string :action => "rss", :layout => false
|
|
|
|
}
|
2017-06-18 16:04:32 +00:00
|
|
|
render :plain => content, :layout => false
|
2012-09-18 15:38:03 +00:00
|
|
|
end
|
|
|
|
}
|
2012-12-17 02:05:27 +00:00
|
|
|
format.json { render :json => @stories }
|
2012-06-17 01:15:46 +00:00
|
|
|
end
|
2012-06-30 23:42:53 +00:00
|
|
|
end
|
2012-06-17 01:15:46 +00:00
|
|
|
|
2012-06-30 23:42:53 +00:00
|
|
|
def newest
|
2014-08-04 01:47:13 +00:00
|
|
|
@stories, @show_more = get_from_cache(newest: true) {
|
|
|
|
paginate stories.newest
|
|
|
|
}
|
2012-06-17 01:15:46 +00:00
|
|
|
|
2022-02-11 14:07:58 +00:00
|
|
|
@title = "Newest Stories"
|
2022-02-27 03:13:56 +00:00
|
|
|
@above = 'stories/subnav'
|
2012-06-17 01:15:46 +00:00
|
|
|
|
2018-03-14 13:01:14 +00:00
|
|
|
@rss_link = {
|
|
|
|
:title => "RSS 2.0 - Newest Items",
|
2018-03-18 00:00:47 +00:00
|
|
|
:href => user_token_link("/newest.rss"),
|
2018-03-14 13:01:14 +00:00
|
|
|
}
|
2012-06-17 01:15:46 +00:00
|
|
|
|
2012-06-30 23:42:53 +00:00
|
|
|
respond_to do |format|
|
|
|
|
format.html { render :action => "index" }
|
2012-09-18 15:38:03 +00:00
|
|
|
format.rss {
|
|
|
|
if @user && params[:token].present?
|
|
|
|
@title += " - Private feed for #{@user.username}"
|
|
|
|
end
|
|
|
|
|
|
|
|
render :action => "rss", :layout => false
|
|
|
|
}
|
2012-12-17 02:05:27 +00:00
|
|
|
format.json { render :json => @stories }
|
2012-06-30 23:42:53 +00:00
|
|
|
end
|
2012-06-30 19:14:35 +00:00
|
|
|
end
|
|
|
|
|
2012-09-03 22:21:41 +00:00
|
|
|
def newest_by_user
|
2018-10-02 19:13:38 +00:00
|
|
|
by_user = User.find_by!(username: params[:user])
|
2012-09-03 22:21:41 +00:00
|
|
|
|
2014-08-04 01:47:13 +00:00
|
|
|
@stories, @show_more = get_from_cache(by_user: by_user) {
|
2018-10-02 19:13:38 +00:00
|
|
|
if @user && @user.is_moderator?
|
|
|
|
paginate stories.newest_including_deleted_by_user(by_user)
|
|
|
|
else
|
|
|
|
paginate stories.newest_by_user(by_user)
|
|
|
|
end
|
2014-08-04 01:47:13 +00:00
|
|
|
}
|
2013-02-14 00:50:51 +00:00
|
|
|
|
2022-02-11 14:07:58 +00:00
|
|
|
@title = "Newest Stories by #{by_user.username}"
|
2022-02-24 03:18:50 +00:00
|
|
|
@newest_by_user = by_user
|
2022-02-27 03:13:56 +00:00
|
|
|
@above = 'newest_by_user'
|
2012-09-03 22:21:41 +00:00
|
|
|
|
2016-04-29 16:39:04 +00:00
|
|
|
respond_to do |format|
|
|
|
|
format.html { render :action => "index" }
|
|
|
|
format.rss {
|
|
|
|
render :action => "rss", :layout => false
|
|
|
|
}
|
|
|
|
format.json { render :json => @stories }
|
|
|
|
end
|
2012-09-03 22:21:41 +00:00
|
|
|
end
|
|
|
|
|
2014-01-25 17:13:14 +00:00
|
|
|
def recent
|
2014-08-04 01:47:13 +00:00
|
|
|
@stories, @show_more = get_from_cache(recent: true) {
|
2018-04-26 15:07:53 +00:00
|
|
|
paginate Story.recent(@user, filtered_tag_ids)
|
2014-08-04 01:47:13 +00:00
|
|
|
}
|
2014-01-25 17:13:14 +00:00
|
|
|
|
2022-02-11 14:07:58 +00:00
|
|
|
@title = "Recent Stories"
|
2022-03-04 14:12:28 +00:00
|
|
|
@above = 'stories/subnav'
|
2022-02-27 03:13:56 +00:00
|
|
|
@below = 'recent'
|
2014-01-25 17:13:14 +00:00
|
|
|
|
2018-04-26 15:07:53 +00:00
|
|
|
# our list is unstable because upvoted stories get removed, so point at /newest.rss
|
|
|
|
@rss_link = { :title => "RSS 2.0 - Newest Items", :href => user_token_link("/newest.rss") }
|
2014-03-12 22:50:51 +00:00
|
|
|
|
2014-01-25 17:13:14 +00:00
|
|
|
render :action => "index"
|
|
|
|
end
|
|
|
|
|
2017-07-13 20:38:33 +00:00
|
|
|
def saved
|
|
|
|
@stories, @show_more = get_from_cache(hidden: true) {
|
|
|
|
paginate stories.saved
|
|
|
|
}
|
|
|
|
|
2018-03-14 13:01:14 +00:00
|
|
|
@rss_link ||= {
|
|
|
|
:title => "RSS 2.0",
|
2018-03-18 00:00:47 +00:00
|
|
|
:href => user_token_link("/saved.rss"),
|
2018-03-14 13:01:14 +00:00
|
|
|
}
|
2017-07-13 20:38:33 +00:00
|
|
|
|
2022-02-11 14:07:58 +00:00
|
|
|
@title = "Saved Stories"
|
2022-02-27 03:13:56 +00:00
|
|
|
@above = 'saved/subnav'
|
2017-07-13 20:38:33 +00:00
|
|
|
|
|
|
|
respond_to do |format|
|
|
|
|
format.html { render :action => "index" }
|
|
|
|
format.rss {
|
|
|
|
if @user
|
|
|
|
@title = "Private feed of saved stories for #{@user.username}"
|
|
|
|
end
|
2018-03-19 21:15:24 +00:00
|
|
|
render :action => "rss", :layout => false
|
2017-07-13 20:38:33 +00:00
|
|
|
}
|
|
|
|
format.json { render :json => @stories }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-08-09 04:46:42 +00:00
|
|
|
def category
|
|
|
|
category_params = params[:category].split(',')
|
|
|
|
@categories = Category.where(category: category_params)
|
|
|
|
|
|
|
|
raise ActiveRecord::RecordNotFound unless @categories.length == category_params.length
|
|
|
|
|
|
|
|
@stories, @show_more = get_from_cache(categories: category_params.sort.join(',')) do
|
|
|
|
paginate stories.categories(@categories)
|
|
|
|
end
|
|
|
|
|
|
|
|
@title = @categories.map(&:category).join(' ')
|
2022-02-27 03:13:56 +00:00
|
|
|
@above = 'category'
|
2020-08-09 04:46:42 +00:00
|
|
|
|
|
|
|
@rss_link = {
|
|
|
|
title: "RSS 2.0 - Categorized #{@title}",
|
|
|
|
href: category_url(params[:category], format: 'rss'),
|
|
|
|
}
|
|
|
|
|
|
|
|
respond_to do |format|
|
|
|
|
format.html { render :action => "index" }
|
|
|
|
format.rss { render :action => "rss", :layout => false }
|
|
|
|
format.json { render :json => @stories }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-03-17 02:46:24 +00:00
|
|
|
def single_tag
|
|
|
|
@tag = Tag.find_by!(tag: params[:tag])
|
|
|
|
|
|
|
|
@stories, @show_more = get_from_cache(tag: @tag.tag) do
|
|
|
|
paginate stories.tagged([@tag])
|
|
|
|
end
|
|
|
|
|
|
|
|
@title = [@tag.tag, @tag.description].compact.join(' - ')
|
|
|
|
@above = 'single_tag'
|
|
|
|
@related = Rails.cache.fetch("related_#{@tag.tag}", expires_in: 1.day) {
|
|
|
|
Tag.related(@tag)
|
|
|
|
}
|
|
|
|
@below = 'tags/multi_tag_tip'
|
|
|
|
|
|
|
|
@rss_link = {
|
|
|
|
title: "RSS 2.0 - Tagged #{@tag.tag} (#{@tag.description})",
|
|
|
|
href: "/t/#{@tag.tag}.rss",
|
|
|
|
}
|
|
|
|
|
|
|
|
respond_to do |format|
|
|
|
|
format.html { render :action => "index" }
|
|
|
|
format.rss { render :action => "rss", :layout => false }
|
|
|
|
format.json { render :json => @stories }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def multi_tag
|
2019-05-01 13:59:58 +00:00
|
|
|
tag_params = params[:tag].split(',')
|
|
|
|
@tags = Tag.where(tag: tag_params)
|
|
|
|
raise ActiveRecord::RecordNotFound unless @tags.length == tag_params.length
|
|
|
|
|
|
|
|
@stories, @show_more = get_from_cache(tags: tag_params.sort.join(',')) do
|
|
|
|
paginate stories.tagged(@tags)
|
|
|
|
end
|
2012-06-30 23:42:53 +00:00
|
|
|
|
2019-05-01 13:59:58 +00:00
|
|
|
@title = @tags.map do |tag|
|
|
|
|
[tag.tag, tag.description].compact.join(' - ')
|
|
|
|
end.join(' ')
|
2022-03-17 02:46:24 +00:00
|
|
|
@above = 'multi_tag'
|
2012-06-17 01:15:46 +00:00
|
|
|
|
2018-03-14 13:01:14 +00:00
|
|
|
@rss_link = {
|
2019-05-01 13:59:58 +00:00
|
|
|
title: "RSS 2.0 - Tagged #{tags_with_description_for_rss(@tags)}",
|
|
|
|
href: "/t/#{params[:tag]}.rss",
|
2018-03-14 13:01:14 +00:00
|
|
|
}
|
2012-06-30 23:42:53 +00:00
|
|
|
|
|
|
|
respond_to do |format|
|
|
|
|
format.html { render :action => "index" }
|
|
|
|
format.rss { render :action => "rss", :layout => false }
|
2015-08-04 00:12:39 +00:00
|
|
|
format.json { render :json => @stories }
|
2012-06-30 23:42:53 +00:00
|
|
|
end
|
2012-06-17 01:15:46 +00:00
|
|
|
end
|
2012-07-06 22:33:27 +00:00
|
|
|
|
2020-01-22 14:30:31 +00:00
|
|
|
def for_domain
|
2022-09-01 12:36:59 +00:00
|
|
|
@domain = Domain.find_by!(domain: params[:id])
|
2020-01-22 14:30:31 +00:00
|
|
|
|
|
|
|
@stories, @show_more = get_from_cache(domain: @domain.domain) do
|
2022-05-06 13:38:40 +00:00
|
|
|
paginate @domain.stories.base(@user).order('id desc')
|
2020-01-22 14:30:31 +00:00
|
|
|
end
|
|
|
|
|
2022-02-11 14:07:58 +00:00
|
|
|
@title = @domain.domain
|
2022-02-27 03:13:56 +00:00
|
|
|
@above = 'for_domain'
|
2020-01-22 14:30:31 +00:00
|
|
|
|
|
|
|
@rss_link = {
|
2022-01-24 13:02:32 +00:00
|
|
|
title: "RSS 2.0 - For #{@domain.domain}",
|
|
|
|
href: "/domain/#{@domain.domain}.rss",
|
2020-01-22 14:30:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
respond_to do |format|
|
|
|
|
format.html { render :action => "index" }
|
|
|
|
format.rss { render :action => "rss", :layout => false }
|
|
|
|
format.json { render :json => @stories }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-04-03 18:20:24 +00:00
|
|
|
def top
|
2018-06-23 04:46:06 +00:00
|
|
|
length = time_interval(params[:length])
|
2014-04-03 18:20:24 +00:00
|
|
|
|
2014-08-04 01:47:13 +00:00
|
|
|
@stories, @show_more = get_from_cache(top: true, length: length) {
|
|
|
|
paginate stories.top(length)
|
|
|
|
}
|
2014-04-03 18:20:24 +00:00
|
|
|
|
|
|
|
if length[:dur] > 1
|
2022-02-11 14:07:58 +00:00
|
|
|
@title = "Top Stories of the Past #{length[:dur]} #{length[:intv]}"
|
2014-04-03 18:20:24 +00:00
|
|
|
else
|
2022-02-11 14:07:58 +00:00
|
|
|
@title = "Top Stories of the Past #{length[:intv]}"
|
2014-04-03 18:20:24 +00:00
|
|
|
end
|
2022-03-04 14:48:49 +00:00
|
|
|
@above = 'stories/subnav'
|
2014-04-03 18:20:24 +00:00
|
|
|
|
2020-01-22 14:17:55 +00:00
|
|
|
@rss_link ||= {
|
2022-02-11 14:07:58 +00:00
|
|
|
:title => "RSS 2.0 - " + @title,
|
2020-01-22 14:17:55 +00:00
|
|
|
:href => "/top/rss",
|
|
|
|
}
|
|
|
|
|
|
|
|
respond_to do |format|
|
|
|
|
format.html { render :action => "index" }
|
|
|
|
format.rss { render :action => "rss", :layout => false }
|
|
|
|
end
|
2014-04-03 18:20:24 +00:00
|
|
|
end
|
|
|
|
|
2013-03-11 18:19:26 +00:00
|
|
|
def upvoted
|
|
|
|
@stories, @show_more = get_from_cache(upvoted: true, user: @user) {
|
2019-07-03 11:22:27 +00:00
|
|
|
paginate @user.upvoted_stories.includes(:tags).order('votes.id DESC')
|
2013-03-11 18:19:26 +00:00
|
|
|
}
|
|
|
|
|
2022-02-11 14:07:58 +00:00
|
|
|
@title = "Upvoted Stories"
|
2022-02-27 03:13:56 +00:00
|
|
|
@above = 'saved/subnav'
|
2013-03-11 18:19:26 +00:00
|
|
|
|
2018-03-14 13:01:14 +00:00
|
|
|
@rss_link = {
|
2019-07-03 12:52:05 +00:00
|
|
|
:title => "RSS 2.0 - Upvoted Stories",
|
2018-03-18 00:00:47 +00:00
|
|
|
:href => user_token_link("/upvoted.rss"),
|
2018-03-14 13:01:14 +00:00
|
|
|
}
|
2013-03-11 18:19:26 +00:00
|
|
|
|
|
|
|
respond_to do |format|
|
2022-02-11 14:07:58 +00:00
|
|
|
format.html { render action: :index }
|
2013-03-11 18:19:26 +00:00
|
|
|
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
|
|
|
|
|
2012-07-06 22:33:27 +00:00
|
|
|
private
|
2018-03-02 04:50:11 +00:00
|
|
|
|
2014-07-07 16:05:53 +00:00
|
|
|
def filtered_tag_ids
|
|
|
|
if @user
|
2018-03-18 05:51:58 +00:00
|
|
|
@user.tag_filters.map(&:tag_id)
|
2012-07-10 19:43:51 +00:00
|
|
|
else
|
2018-03-18 05:51:58 +00:00
|
|
|
tags_filtered_by_cookie.map(&:id)
|
2012-07-10 19:43:51 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-07-07 16:05:53 +00:00
|
|
|
def stories
|
|
|
|
StoryRepository.new(@user, exclude_tags: filtered_tag_ids)
|
|
|
|
end
|
2012-07-06 22:33:27 +00:00
|
|
|
|
2014-07-07 16:05:53 +00:00
|
|
|
def page
|
2016-07-31 17:36:28 +00:00
|
|
|
p = params[:page].to_i
|
|
|
|
if p == 0
|
|
|
|
p = 1
|
|
|
|
elsif p < 0 || p > (2 ** 32)
|
|
|
|
raise ActionController::RoutingError.new("page out of bounds")
|
|
|
|
end
|
|
|
|
p
|
2014-07-07 16:05:53 +00:00
|
|
|
end
|
2012-07-06 22:33:27 +00:00
|
|
|
|
2014-07-07 16:05:53 +00:00
|
|
|
def paginate(scope)
|
|
|
|
StoriesPaginator.new(scope, page, @user).get
|
|
|
|
end
|
2013-02-07 23:35:20 +00:00
|
|
|
|
2018-03-19 19:30:49 +00:00
|
|
|
def get_from_cache(opts = {}, &block)
|
2014-07-07 16:05:53 +00:00
|
|
|
if Rails.env.development? || @user || tags_filtered_by_cookie.any?
|
|
|
|
yield
|
2014-04-07 01:43:16 +00:00
|
|
|
else
|
2018-03-19 01:21:55 +00:00
|
|
|
key = opts.merge(page: page).sort.map {|k, v| "#{k}=#{v.to_param}" }.join(" ")
|
2017-03-09 17:20:32 +00:00
|
|
|
begin
|
|
|
|
Rails.cache.fetch("stories #{key}", :expires_in => 45, &block)
|
|
|
|
rescue Errno::ENOENT => e
|
|
|
|
Rails.logger.error "error fetching stories #{key}: #{e}"
|
|
|
|
yield
|
|
|
|
end
|
2012-07-06 22:33:27 +00:00
|
|
|
end
|
|
|
|
end
|
2018-03-18 00:00:47 +00:00
|
|
|
|
|
|
|
def user_token_link(url)
|
2018-03-21 20:56:07 +00:00
|
|
|
@user ? "#{url}?token=#{@user.rss_token}" : url
|
2018-03-18 00:00:47 +00:00
|
|
|
end
|
2019-05-01 13:59:58 +00:00
|
|
|
|
|
|
|
def tags_with_description_for_rss(tags)
|
|
|
|
tags.map {|tag| "#{tag.tag} (#{tag.description})" }.join(' ')
|
|
|
|
end
|
2012-06-17 01:15:46 +00:00
|
|
|
end
|