Files
danbooru/app/controllers/forum_topics_controller.rb
evazion b5603f0d39 forum: optimize unread forum topics on forum index.
Avoid doing one SQL query per topic when checking for new topics on the
forum index.

This also changes it so that forum topics aren't always marked as new
for anonymous users.
2020-01-21 00:12:03 -06:00

117 lines
3.4 KiB
Ruby

class ForumTopicsController < ApplicationController
respond_to :html, :xml, :json
respond_to :atom, only: [:index, :show]
before_action :member_only, :except => [:index, :show]
before_action :normalize_search, :only => :index
before_action :load_topic, :only => [:edit, :show, :update, :destroy, :undelete]
before_action :check_min_level, :only => [:show, :edit, :update, :destroy, :undelete]
skip_before_action :api_check
def new
@forum_topic = ForumTopic.new
@forum_topic.original_post = ForumPost.new
respond_with(@forum_topic)
end
def edit
check_privilege(@forum_topic)
respond_with(@forum_topic)
end
def index
params[:search] ||= {}
params[:search][:order] ||= "sticky" if request.format == Mime::Type.lookup("text/html")
params[:limit] ||= 40
@forum_topics = ForumTopic.paginated_search(params)
@read_forum_topics = @forum_topics.read_by_user(CurrentUser.user)
@forum_topics = @forum_topics.includes(:creator, :updater).load if request.format.html?
@forum_topics = @forum_topics.includes(:creator, :original_post).load if request.format.atom?
respond_with(@forum_topics)
end
def show
@current_item = @forum_topic
if request.format == Mime::Type.lookup("text/html")
@forum_topic.mark_as_read!(CurrentUser.user)
end
@forum_posts = ForumPost.search(:topic_id => @forum_topic.id).reorder("forum_posts.id").paginate(params[:page])
@forum_posts = @forum_posts.reverse_order.includes(:creator).load if request.format.atom?
respond_with(@forum_topic)
end
def create
@forum_topic = ForumTopic.new(forum_topic_params(:create))
@forum_topic.creator = CurrentUser.user
@forum_topic.original_post.creator = CurrentUser.user
@forum_topic.save
respond_with(@forum_topic)
end
def update
check_privilege(@forum_topic)
@forum_topic.update(forum_topic_params(:update))
respond_with(@forum_topic)
end
def destroy
check_privilege(@forum_topic)
@forum_topic.delete!
@forum_topic.create_mod_action_for_delete
flash[:notice] = "Topic deleted"
respond_with(@forum_topic)
end
def undelete
check_privilege(@forum_topic)
@forum_topic.undelete!
@forum_topic.create_mod_action_for_undelete
flash[:notice] = "Topic undeleted"
respond_with(@forum_topic)
end
def mark_all_as_read
CurrentUser.user.update_attribute(:last_forum_read_at, Time.now)
ForumTopicVisit.prune!(CurrentUser.user)
redirect_to forum_topics_path, :notice => "All topics marked as read"
end
private
def normalize_search
if params[:title_matches]
params[:search] ||= {}
params[:search][:title_matches] = params.delete(:title_matches)
end
if params[:title]
params[:search] ||= {}
params[:search][:title] = params.delete(:title)
end
end
def check_privilege(forum_topic)
if !forum_topic.editable_by?(CurrentUser.user)
raise User::PrivilegeError
end
end
def load_topic
@forum_topic = ForumTopic.find(params[:id])
end
def check_min_level
raise User::PrivilegeError if CurrentUser.user.level < @forum_topic.min_level
end
def forum_topic_params(context)
permitted_params = [:title, :category_id, { original_post_attributes: %i[id body] }]
permitted_params += %i[is_sticky is_locked min_level] if CurrentUser.is_moderator?
params.require(:forum_topic).permit(permitted_params)
end
end