mirror of
https://github.com/discourse/discourse.git
synced 2024-12-01 10:36:32 +08:00
908add79de
It was quite an oddball because its a global subscription created on each channel. channels manager now allows us to elegantly solve this case.
95 lines
3.3 KiB
Ruby
95 lines
3.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class StructuredChannelSerializer < ApplicationSerializer
|
|
attributes :public_channels, :direct_message_channels, :meta
|
|
|
|
def public_channels
|
|
object[:public_channels].map do |channel|
|
|
ChatChannelSerializer.new(
|
|
channel,
|
|
root: nil,
|
|
scope: scope,
|
|
membership: channel_membership(channel.id),
|
|
new_messages_message_bus_last_id:
|
|
chat_message_bus_last_ids[ChatPublisher.new_messages_message_bus_channel(channel.id)],
|
|
new_mentions_message_bus_last_id:
|
|
chat_message_bus_last_ids[ChatPublisher.new_mentions_message_bus_channel(channel.id)],
|
|
)
|
|
end
|
|
end
|
|
|
|
def direct_message_channels
|
|
object[:direct_message_channels].map do |channel|
|
|
ChatChannelSerializer.new(
|
|
channel,
|
|
root: nil,
|
|
scope: scope,
|
|
membership: channel_membership(channel.id),
|
|
new_messages_message_bus_last_id:
|
|
chat_message_bus_last_ids[ChatPublisher.new_messages_message_bus_channel(channel.id)],
|
|
new_mentions_message_bus_last_id:
|
|
chat_message_bus_last_ids[ChatPublisher.new_mentions_message_bus_channel(channel.id)],
|
|
)
|
|
end
|
|
end
|
|
|
|
def channel_membership(channel_id)
|
|
return if scope.anonymous?
|
|
object[:memberships].find { |membership| membership.chat_channel_id == channel_id }
|
|
end
|
|
|
|
def meta
|
|
last_ids = {
|
|
channel_metadata:
|
|
chat_message_bus_last_ids[ChatPublisher::CHANNEL_METADATA_MESSAGE_BUS_CHANNEL],
|
|
channel_edits: chat_message_bus_last_ids[ChatPublisher::CHANNEL_EDITS_MESSAGE_BUS_CHANNEL],
|
|
channel_status: chat_message_bus_last_ids[ChatPublisher::CHANNEL_STATUS_MESSAGE_BUS_CHANNEL],
|
|
new_channel: chat_message_bus_last_ids[ChatPublisher::NEW_CHANNEL_MESSAGE_BUS_CHANNEL],
|
|
archive_status:
|
|
chat_message_bus_last_ids[ChatPublisher::CHANNEL_ARCHIVE_STATUS_MESSAGE_BUS_CHANNEL],
|
|
}
|
|
|
|
if id =
|
|
chat_message_bus_last_ids[
|
|
ChatPublisher.user_tracking_state_message_bus_channel(scope.user.id)
|
|
]
|
|
last_ids[:user_tracking_state] = id
|
|
end
|
|
|
|
{ message_bus_last_ids: last_ids }
|
|
end
|
|
|
|
private
|
|
|
|
def chat_message_bus_last_ids
|
|
@chat_message_bus_last_ids ||=
|
|
begin
|
|
message_bus_channels = [
|
|
ChatPublisher::CHANNEL_METADATA_MESSAGE_BUS_CHANNEL,
|
|
ChatPublisher::CHANNEL_EDITS_MESSAGE_BUS_CHANNEL,
|
|
ChatPublisher::CHANNEL_STATUS_MESSAGE_BUS_CHANNEL,
|
|
ChatPublisher::NEW_CHANNEL_MESSAGE_BUS_CHANNEL,
|
|
ChatPublisher::CHANNEL_ARCHIVE_STATUS_MESSAGE_BUS_CHANNEL,
|
|
]
|
|
|
|
if !scope.anonymous?
|
|
message_bus_channels.push(
|
|
ChatPublisher.user_tracking_state_message_bus_channel(scope.user.id),
|
|
)
|
|
end
|
|
|
|
object[:public_channels].each do |channel|
|
|
message_bus_channels.push(ChatPublisher.new_messages_message_bus_channel(channel.id))
|
|
message_bus_channels.push(ChatPublisher.new_mentions_message_bus_channel(channel.id))
|
|
end
|
|
|
|
object[:direct_message_channels].each do |channel|
|
|
message_bus_channels.push(ChatPublisher.new_messages_message_bus_channel(channel.id))
|
|
message_bus_channels.push(ChatPublisher.new_mentions_message_bus_channel(channel.id))
|
|
end
|
|
|
|
MessageBus.last_ids(*message_bus_channels)
|
|
end
|
|
end
|
|
end
|