Class: TopicList

Inherits:
Object
  • Object
show all
Includes:
ActiveModel::Serialization
Defined in:
app/models/topic_list.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(filter, current_user, topics, opts = nil) ⇒ TopicList

Returns a new instance of TopicList.



51
52
53
54
55
56
57
58
59
60
61
62
# File 'app/models/topic_list.rb', line 51

def initialize(filter, current_user, topics, opts = nil)
  @filter = filter
  @current_user = current_user
  @topics_input = topics
  @opts = opts || {}

  @category = Category.find_by(id: @opts[:category_id]) if @opts[:category]

  @tags = Tag.where(id: @opts[:tags]).all if @opts[:tags]

  @publish_read_state = !!@opts[:publish_read_state]
end

Instance Attribute Details

#categoryObject

Returns the value of attribute category.



37
38
39
# File 'app/models/topic_list.rb', line 37

def category
  @category
end

#current_userObject

Returns the value of attribute current_user.



37
38
39
# File 'app/models/topic_list.rb', line 37

def current_user
  @current_user
end

#filterObject

Returns the value of attribute filter.



37
38
39
# File 'app/models/topic_list.rb', line 37

def filter
  @filter
end

#for_periodObject

Returns the value of attribute for_period.



37
38
39
# File 'app/models/topic_list.rb', line 37

def for_period
  @for_period
end

#more_topics_urlObject

Returns the value of attribute more_topics_url.



37
38
39
# File 'app/models/topic_list.rb', line 37

def more_topics_url
  @more_topics_url
end

#per_pageObject

Returns the value of attribute per_page.



37
38
39
# File 'app/models/topic_list.rb', line 37

def per_page
  @per_page
end

#prev_topics_urlObject

Returns the value of attribute prev_topics_url.



37
38
39
# File 'app/models/topic_list.rb', line 37

def prev_topics_url
  @prev_topics_url
end

#shared_draftsObject

Returns the value of attribute shared_drafts.



37
38
39
# File 'app/models/topic_list.rb', line 37

def shared_drafts
  @shared_drafts
end

#tagsObject

Returns the value of attribute tags.



37
38
39
# File 'app/models/topic_list.rb', line 37

def tags
  @tags
end

#top_tagsObject

Returns the value of attribute top_tags.



37
38
39
# File 'app/models/topic_list.rb', line 37

def top_tags
  @top_tags
end

Class Method Details

.cancel_preload(&blk) ⇒ Object



13
14
15
16
17
18
# File 'app/models/topic_list.rb', line 13

def self.cancel_preload(&blk)
  if @preload
    @preload.delete blk
    @preload = nil if @preload.length == 0
  end
end

.on_preload(&blk) ⇒ Object



9
10
11
# File 'app/models/topic_list.rb', line 9

def self.on_preload(&blk)
  (@preload ||= Set.new) << blk
end

.on_preload_user_ids(&blk) ⇒ Object



24
25
26
# File 'app/models/topic_list.rb', line 24

def self.on_preload_user_ids(&blk)
  (@preload_user_ids ||= Set.new) << blk
end

.preload(topics, object) ⇒ Object



20
21
22
# File 'app/models/topic_list.rb', line 20

def self.preload(topics, object)
  @preload.each { |preload| preload.call(topics, object) } if @preload
end

.preload_user_ids(topics, user_ids, object) ⇒ Object



28
29
30
31
32
33
34
35
# File 'app/models/topic_list.rb', line 28

def self.preload_user_ids(topics, user_ids, object)
  if @preload_user_ids
    @preload_user_ids.each do |preload_user_ids|
      user_ids = preload_user_ids.call(topics, user_ids, object)
    end
  end
  user_ids
end

Instance Method Details

#attributesObject



148
149
150
# File 'app/models/topic_list.rb', line 148

def attributes
  { "more_topics_url" => page }
end

#load_topicsObject



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'app/models/topic_list.rb', line 79

def load_topics
  @topics = @topics_input

  # Attach some data for serialization to each topic
  @topic_lookup = TopicUser.lookup_for(@current_user, @topics) if @current_user
  @dismissed_topic_users_lookup =
    DismissedTopicUser.lookup_for(@current_user, @topics) if @current_user

  post_action_type =
    if @current_user
      if @opts[:filter].present?
        PostActionType.types[:like] if @opts[:filter] == "liked"
      end
    end

  # Data for bookmarks or likes
  post_action_lookup =
    PostAction.lookup_for(@current_user, @topics, post_action_type) if post_action_type

  # Create a lookup for all the user ids we need
  user_ids = []
  group_ids = []
  @topics.each do |ft|
    user_ids << ft.user_id << ft.last_post_user_id << ft.featured_user_ids << ft.allowed_user_ids
    group_ids |= (ft.allowed_group_ids || [])
  end

  user_ids = TopicList.preload_user_ids(@topics, user_ids, self)
  user_lookup = UserLookup.new(user_ids)
  group_lookup = GroupLookup.new(group_ids)

  @topics.each do |ft|
    ft.user_data = @topic_lookup[ft.id] if @topic_lookup.present?

    if ft.regular? && category_user_lookup.present?
      ft.category_user_data = @category_user_lookup[ft.category_id]
    end

    ft.dismissed = @current_user && @dismissed_topic_users_lookup.include?(ft.id)

    if ft.user_data && post_action_lookup && actions = post_action_lookup[ft.id]
      ft.user_data.post_action_data = { post_action_type => actions }
    end

    ft.posters = ft.posters_summary(user_lookup: user_lookup)

    ft.participants = ft.participants_summary(user_lookup: user_lookup, user: @current_user)
    ft.participant_groups =
      ft.participant_groups_summary(group_lookup: group_lookup, group: @opts[:group])
    ft.topic_list = self
  end

  topic_preloader_associations = [:image_upload, { topic_thumbnails: :optimized_image }]
  topic_preloader_associations.concat(DiscoursePluginRegistry.topic_preloader_associations.to_a)

  ActiveRecord::Associations::Preloader.new(
    records: @topics,
    associations: topic_preloader_associations,
  ).call

  if preloaded_custom_fields.present?
    Topic.preload_custom_fields(@topics, preloaded_custom_fields)
  end

  TopicList.preload(@topics, self)

  @topics
end

#preload_keyObject



70
71
72
# File 'app/models/topic_list.rb', line 70

def preload_key
  "topic_list"
end

#topicsObject

Lazy initialization



75
76
77
# File 'app/models/topic_list.rb', line 75

def topics
  @topics ||= load_topics
end