discourse/plugins/chat/app/serializers/structured_channel_serializer.rb
Joffrey JAFFEUX 908add79de
DEV: moves channel-archive-status to channels subscriptions (#19567)
It was quite an oddball because its a global subscription created on each channel. channels manager now allows us to elegantly solve this case.
2022-12-30 15:30:36 +01:00

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