discourse/app/serializers/post_stream_serializer_mixin.rb
Sam c08c40dc23
FEATURE: theme_modifiers can depend on theme settings (plus serialize_post_user_badges) (#29227)
Theme modifiers can now be defined as theme settings, this allows for
site operators to override behavior of theme modifiers.

New syntax is:

```
{
    ...
   "modifiers": {
      "modifier_name": {
         "type": "setting",
         "value": "setting_name"
      }
   }
}
```

This also introduces a new theme modifier for serialize_post_user_badges. Name of badge must match the name of the badge in the badges table. The client-side is updated to load this new data from the post-stream serializer.

Co-authored-by: David Taylor <david@taylorhq.com>
2024-10-17 15:16:16 +01:00

76 lines
1.5 KiB
Ruby

# frozen_string_literal: true
module PostStreamSerializerMixin
def self.included(klass)
klass.attributes :post_stream
klass.attributes :timeline_lookup
klass.attributes :user_badges
end
def include_stream?
true
end
def include_gaps?
true
end
def include_user_badges?
badges_to_include.present?
end
def user_badges
object.user_badges(badges_to_include)
end
def badges_to_include
@badges_to_include ||= theme_modifier_helper.serialize_post_user_badges
end
def post_stream
result = { posts: posts }
if include_stream?
if !object.is_mega_topic?
result[:stream] = object.filtered_post_ids
else
result[:isMegaTopic] = true
result[:lastId] = object.last_post_id
end
end
if include_gaps? && object.gaps.present?
result[:gaps] = GapSerializer.new(object.gaps, root: false)
end
result
end
def include_timeline_lookup?
!object.is_mega_topic?
end
def timeline_lookup
TimelineLookup.build(object.filtered_post_stream)
end
def posts
@posts ||=
begin
(object.posts || []).map do |post|
post.topic = object.topic
serializer = PostSerializer.new(post, scope: scope, root: false)
serializer.add_raw = true if @options[:include_raw]
serializer.topic_view = object
serializer.as_json
end
end
end
def theme_modifier_helper
@theme_modifier_helper ||= ThemeModifierHelper.new(request: scope.request)
end
end