mirror of
https://github.com/discourse/discourse.git
synced 2024-11-25 04:19:05 +08:00
14d54872f0
Prior to this change, each request executed 2 Redis calls per chat channel that was loaded. The number of Redis calls quickly adds up once a user is following multiple channels.
114 lines
2.7 KiB
Ruby
114 lines
2.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class ChatChannelSerializer < ApplicationSerializer
|
|
attributes :id,
|
|
:auto_join_users,
|
|
:allow_channel_wide_mentions,
|
|
:chatable,
|
|
:chatable_id,
|
|
:chatable_type,
|
|
:chatable_url,
|
|
:description,
|
|
:title,
|
|
:slug,
|
|
:last_message_sent_at,
|
|
:status,
|
|
:archive_failed,
|
|
:archive_completed,
|
|
:archived_messages,
|
|
:total_messages,
|
|
:archive_topic_id,
|
|
:memberships_count,
|
|
:current_user_membership,
|
|
:message_bus_last_ids
|
|
|
|
def initialize(object, opts)
|
|
super(object, opts)
|
|
|
|
@opts = opts
|
|
@current_user_membership = opts[:membership]
|
|
end
|
|
|
|
def include_description?
|
|
object.description.present?
|
|
end
|
|
|
|
def memberships_count
|
|
object.user_count
|
|
end
|
|
|
|
def chatable_url
|
|
object.chatable_url
|
|
end
|
|
|
|
def title
|
|
object.name || object.title(scope.user)
|
|
end
|
|
|
|
def chatable
|
|
case object.chatable_type
|
|
when "Category"
|
|
BasicCategorySerializer.new(object.chatable, root: false).as_json
|
|
when "DirectMessage"
|
|
DirectMessageSerializer.new(object.chatable, scope: scope, root: false).as_json
|
|
when "Site"
|
|
nil
|
|
end
|
|
end
|
|
|
|
def archive
|
|
object.chat_channel_archive
|
|
end
|
|
|
|
def include_archive_status?
|
|
scope.is_staff? && object.archived? && archive.present?
|
|
end
|
|
|
|
def archive_completed
|
|
archive.complete?
|
|
end
|
|
|
|
def archive_failed
|
|
archive.failed?
|
|
end
|
|
|
|
def archived_messages
|
|
archive.archived_messages
|
|
end
|
|
|
|
def total_messages
|
|
archive.total_messages
|
|
end
|
|
|
|
def archive_topic_id
|
|
archive.destination_topic_id
|
|
end
|
|
|
|
def include_auto_join_users?
|
|
scope.can_edit_chat_channel?
|
|
end
|
|
|
|
def current_user_membership
|
|
return if !@current_user_membership
|
|
@current_user_membership.chat_channel = object
|
|
UserChatChannelMembershipSerializer.new(
|
|
@current_user_membership,
|
|
scope: scope,
|
|
root: false,
|
|
).as_json
|
|
end
|
|
|
|
def message_bus_last_ids
|
|
{
|
|
new_messages: @opts[:new_messages_message_bus_last_id] || MessageBus.last_id(ChatPublisher.new_messages_message_bus_channel(object.id)),
|
|
new_mentions: @opts[:new_mentions_message_bus_last_id] || MessageBus.last_id(ChatPublisher.new_mentions_message_bus_channel(object.id)),
|
|
}
|
|
end
|
|
|
|
alias_method :include_archive_topic_id?, :include_archive_status?
|
|
alias_method :include_total_messages?, :include_archive_status?
|
|
alias_method :include_archived_messages?, :include_archive_status?
|
|
alias_method :include_archive_failed?, :include_archive_status?
|
|
alias_method :include_archive_completed?, :include_archive_status?
|
|
end
|