Class: Thredded::TopicsController

Inherits:
ApplicationController show all
Includes:
NewPostParams, NewTopicParams
Defined in:
app/controllers/thredded/topics_controller.rb

Overview

rubocop:disable Metrics/ClassLength

Instance Method Summary collapse

Methods included from UrlsHelper

#delete_post_path, #edit_post_path, #edit_preferences_path, #edit_preferences_url, #mark_unread_path, #permalink_path, #post_path, #post_url, #quote_post_path, #search_path, #send_private_message_path, #topic_path, #topic_url, #unread_topics_path, #user_path

Instance Method Details

#categoryObject



74
75
76
77
78
79
80
81
82
83
84
85
# File 'app/controllers/thredded/topics_controller.rb', line 74

def category
  authorize_reading messageboard
  @category = messageboard.categories.friendly.find(params[:category_id])
  @topics = Thredded::TopicsPageView.new(
    thredded_current_user,
    policy_scope(@category.topics)
      .unstuck
      .order_recently_posted_first
      .send(Kaminari.config.page_method_name, current_page)
  )
  render :index
end

#createObject



87
88
89
90
91
92
93
94
95
# File 'app/controllers/thredded/topics_controller.rb', line 87

def create
  @new_topic = Thredded::TopicForm.new(new_topic_params)
  authorize_creating @new_topic.topic
  if @new_topic.save
    redirect_to next_page_after_create(params[:next_page])
  else
    render :new
  end
end

#destroyObject



123
124
125
126
127
128
# File 'app/controllers/thredded/topics_controller.rb', line 123

def destroy
  authorize topic, :destroy?
  topic.destroy!
  redirect_to messageboard_topics_path(messageboard),
              notice: t('thredded.topics.deleted_notice')
end

#editObject



97
98
99
100
101
# File 'app/controllers/thredded/topics_controller.rb', line 97

def edit
  authorize topic, :update?
  return redirect_to(canonical_topic_params) unless params_match?(canonical_topic_params)
  @edit_topic = Thredded::EditTopicForm.new(user: thredded_current_user, topic: topic)
end

#followObject



130
131
132
133
134
# File 'app/controllers/thredded/topics_controller.rb', line 130

def follow
  authorize topic, :read?
  Thredded::UserTopicFollow.create_unless_exists(thredded_current_user.id, topic.id)
  follow_change_response(following: true)
end

#indexObject



22
23
24
25
26
27
28
29
30
# File 'app/controllers/thredded/topics_controller.rb', line 22

def index
  page_scope = policy_scope(messageboard.topics)
    .order_sticky_first.order_recently_posted_first
    .includes(:categories, :last_user, :user)
    .send(Kaminari.config.page_method_name, current_page)
  return redirect_to(last_page_params(page_scope)) if page_beyond_last?(page_scope)
  @topics = Thredded::TopicsPageView.new(thredded_current_user, page_scope)
  @new_topic = init_new_topic
end

#newObject



67
68
69
70
71
72
# File 'app/controllers/thredded/topics_controller.rb', line 67

def new
  @new_topic = Thredded::TopicForm.new(new_topic_params)
  authorize_creating @new_topic.topic
  return redirect_to(canonical_messageboard_params) unless params_match?(canonical_messageboard_params)
  render
end

#searchObject



43
44
45
46
47
48
49
50
51
52
# File 'app/controllers/thredded/topics_controller.rb', line 43

def search
  @query = params[:q].to_s
  page_scope = topics_scope
    .search_query(@query)
    .order_recently_posted_first
    .includes(:categories, :last_user, :user)
    .send(Kaminari.config.page_method_name, current_page)
  return redirect_to(last_page_params(page_scope)) if page_beyond_last?(page_scope)
  @topics = Thredded::TopicsPageView.new(thredded_current_user, page_scope)
end

#showObject



54
55
56
57
58
59
60
61
62
63
64
65
# File 'app/controllers/thredded/topics_controller.rb', line 54

def show
  authorize topic, :read?
  return redirect_to(canonical_topic_params) unless params_match?(canonical_topic_params)
  page_scope = policy_scope(topic.posts)
    .order_oldest_first
    .includes(:user, :messageboard)
    .send(Kaminari.config.page_method_name, current_page)
  return redirect_to(last_page_params(page_scope)) if page_beyond_last?(page_scope)
  @posts = Thredded::TopicPostsPageView.new(thredded_current_user, topic, page_scope)
  Thredded::UserTopicReadState.touch!(thredded_current_user.id, page_scope.last) if thredded_signed_in?
  @new_post = Thredded::PostForm.new(user: thredded_current_user, topic: topic, post_params: new_post_params)
end

#unfollowObject



136
137
138
139
140
# File 'app/controllers/thredded/topics_controller.rb', line 136

def unfollow
  authorize topic, :read?
  Thredded::UserTopicFollow.find_by(topic_id: topic.id, user_id: thredded_current_user.id).try(:destroy)
  follow_change_response(following: false)
end

#unreadObject



32
33
34
35
36
37
38
39
40
41
# File 'app/controllers/thredded/topics_controller.rb', line 32

def unread
  page_scope = topics_scope
    .unread(thredded_current_user)
    .order_followed_first(thredded_current_user).order_recently_posted_first
    .includes(:categories, :last_user, :user)
    .send(Kaminari.config.page_method_name, current_page)
  return redirect_to(last_page_params(page_scope)) if page_beyond_last?(page_scope)
  @topics = Thredded::TopicsPageView.new(thredded_current_user, page_scope)
  @new_topic = init_new_topic
end

#updateObject



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'app/controllers/thredded/topics_controller.rb', line 103

def update
  topic.assign_attributes(topic_params_for_update)
  authorize topic, :update?
  if topic.messageboard_id_changed?
    # Work around the association not being reset.
    # TODO: report issue to Rails. Looks like a regression of:
    # https://rails.lighthouseapp.com/projects/8994/tickets/2989
    topic.messageboard = Thredded::Messageboard.find(topic.messageboard_id)

    authorize topic.messageboard, :post?
  end
  @edit_topic = Thredded::EditTopicForm.new(user: thredded_current_user, topic: topic)
  if @edit_topic.save
    redirect_to messageboard_topic_url(topic.messageboard, topic),
                notice: t('thredded.topics.updated_notice')
  else
    render :edit
  end
end